Прежде чем перейти к более сложным технологиям, полезно взглянуть на некоторые основные способы сохранения простоты и прямоты кода.
Посыльный (Messenger)
Наиболее тривиальный подход - это использование посыльного (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)
Старший брат посыльного - это сборщик параметров ( collecting parameter ), чья работа состоит в сборе информации из методов, в которые он передается. Обычно, такой подход используется, когда сборщик параметров передается в несколько методов, как пчела, собирающая пыльцу.
Для сборщика параметров особенно полезен контейнер, так как он позволяет добавлять объекты:
//: упрощение:CollectingParameterDemo.java
package
simplifying;
import
java.util.*;
import
junit.framework.*;
class
CollectingParameter
extends
ArrayList
{
}
class
Filler
{
public
void
f
(
CollectingParameter cp
) {
cp.add
(
"accumulating"
)
;
}
public
void
g
(
CollectingParameter cp
) {
cp.add
(
"items"
)
;
}
public
void
h
(
CollectingParameter cp
) {
cp.add
(
"as we go"
)
;
}
}
public class
CollectingParameterDemo
extends
TestCase
{
public
void
test
() {
Filler filler =
new
Filler
()
;
CollectingParameter cp =
new
CollectingParameter
()
;
filler.f
(
cp
)
;
filler.g
(
cp
)
;
filler.h
(
cp
)
;
String result =
""
+ cp;
System.out.println
(
cp
)
;
assertEquals
(
result,
"[accumulating, items, as we go]"
)
;
}
public static
void
main
(
String
[]
args
) {
junit.textui.TestRunner.run
(
CollectingParameterDemo.
class
)
;
}
}
// /:~
Сборщик параметров должен иметь способы добавления или вставки
значений. Обратите внимание, что по определению посыльный может быть использован
в качестве сборщика параметров. Ключевой момент заключается в том, что сборщик
параметров передается в методы и изменяется тем же методом, в который он передается.
← | Концепция шаблона | Количество объектов | → |