翻译TIPatterns--简单化(Simplifying Idioms)

    小布同学这一小节写的很不爽,翻起来一头雾水。我想他大概的意思是说,如果方法需要传递比较多的参数,那最好把这些参数包成一个类。

 

简单化(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 是由它所传递给的方法来修改的。

 

目录

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值