Прежде чем перейти к более сложным технологиям, полезно взглянуть на некоторые основные способы сохранения простоты и прямоты кода.

Посыльный (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 ) ;
  
}
}
// /:~

 

Сборщик параметров должен иметь способы добавления или вставки значений. Обратите внимание, что по определению посыльный может быть использован в качестве сборщика параметров. Ключевой момент заключается в том, что сборщик параметров передается в методы и изменяется тем же методом, в который он передается.