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の存在自体が良くないのか?