小布同学这一小节写的很不爽,翻起来一头雾水。我想他大概的意思是说,如果方法需要传递比较多的参数,那最好把这些参数包成一个类。我觉得把messenger翻译成信使真是恶心,总是让人想起MSN.
简单化(Simplifying Idioms)
在研究复杂技术之前,了解一下使代码简单明了的基本方法是很有帮助的。
信使(Messenger)
最普通的方法就是通过信使(messenger),它简单的将信息打包到一个用于传送的对象,而不是将这些信息碎片单独传送。注意,如果没有信使(messenger),translate()的代码读起来会相当混乱。
//: simplifying:MessengerDemo.java
package simplifying;
import junit.framework.*;
class Point { // A messenger
public int x, y, z; // Since it's just a carrier
public Point(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public Point(Point p) { // Copy-constructor
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); // Don't modify the original
// Perform calculation using v. Dummy calculation:
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);
}
} ///:~
因为messenger只是用来传送数据,它所传送的数据通常声明为公有的(public),以便于存取。但是,你可以根据自己的需要把它们声明成私有的(private)。
集合型参数???(collecting parameter)
collecting parameter 是messenger的兄弟,messenger传参数给某个方法,而collecting parameter 从这个方法获取信息。一般说来,这通常会用在collecting parameter传给多个方法(multiple methods)的情况下,就像一只传粉的蜜蜂。
容器是一种特别有用的collecting parameter,因为它本来就是用来动态添加对象的。
//: simplifying: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);
}
} ///:~
Collecting parameter 必须支持通过某些方法设置或者插入一些值。根据这个定义,信使可以当作collecting parameter 来用,前提是collecting parameter 是由它所传递给的方法来修改的。