Наиболее тривиальный подход - это использование посыльного (Messenger) , который просто пакует информацию в объект, чтобы передать ее дальше, вместо передачи всех кусков информации наружу отдельно. Обратите внимание, что без посыльного код для метода translate() был бы более запутанный для чтения:
//: Упрощение:MessengerDemo.java
package
simplifying;
import
junit.framework.*;
class
Point
{
// Посыльный
public
int
x, y, z;
// Так как он просто несущий
public
Point
(
int
x,
int
y,
int
z
) {
this
.x = x;
this
.y = y;
this
.z = z;
}
public
Point
(
Point p
) {
// Конструктор копирования
this
.x = p.x;
this
.y = p.y;
this
.z = p.z;
}
public
String toString
() {
return
"x: "
+ x +
" y: "
+ y +
" z: "
+ z;
}
}
class
Vector
{
public
int
magnitude, direction;
public
Vector
(
int
magnitude,
int
direction
) {
this
.magnitude = magnitude;
this
.direction = direction;
}
}
class
Space
{
public static
Point translate
(
Point p, Vector v
) {
p =
new
Point
(
p
)
;
// Не изменяем оригинал
// Выполняем расчеты, используя v. Макет расчетов:
p.x = p.x +
1
;
p.y = p.y +
1
;
p.z = p.z +
1
;
return
p;
}
}
public class
MessengerDemo
extends
TestCase
{
public
void
test
() {
Point p1 =
new
Point
(
1
,
2
,
3
)
;
Point p2 = Space.translate
(
p1,
new
Vector
(
11
,
47
))
;
String result =
"p1: "
+ p1 +
" p2: "
+ p2;
System.out.println
(
result
)
;
assertEquals
(
result,
"p1: x: 1 y: 2 z: 3 p2: x: 2 y: 3 z: 4"
)
;
}
public static
void
main
(
String
[]
args
) {
junit.textui.TestRunner.run
(
MessengerDemo.
class
)
;
}
}
// /:~
Так как основное назначение посыльного только нести данные, эти данные сделаны публичными(public) для упрощения доступа. Однако, вы можете также иметь причины сделать эти поля их частными (private).
← | Упрощение идиом | Сборщик параметров (Collecting Parameter) | → |