突っ走り書き

見せるほどのものでは..

【Jeff Bay】オブジェクト指向エクササイズがキツすぎて

Jeff Bay は ThoughtWorks Anthology の中で,
オブジェクト指向エクササイズを提案しています.
エクササイズでは,9つのルールを守らなければいけません.
それぞれのルールの解説は他の方にお任せするとして,
実際にやってみてどうしても両立できなかったルールについて書きます.
次の2つのルールを守ってコーディングすることができませんでした.

  • コレクション型は直接使用せずラップしたクラスを作る
  • フィールドを private にした上で getter/setter 禁止

実際にやってみますと

例えば,

  • 人を表す Person クラス
  • 人の集合を表す People クラス

をコーディングしたときを考えます.
本当ならプリミティブ型の使用も禁止ですが,今回は勘弁してください.
このとき,名前だけを抽出する People#listName メソッドを作ろうとしました.

public class Person {
   private String name;
   private int    age;
}

public class People {

   private Set<Person> people;

   public Set<Name> listName() {
      Set<String> names = new HashSet<>(people.size());

      for (final People p : people) {
      // !! getter 使いたい !!
         names.add(p.getName());
      // !! getter 使いたい !!
      }

      return names;
   }
}

どうしても getter が必要になってしまいました.
どうすればいいのかわからん!
もしや,People#listNameの存在自体が良くないのか?