wildcatsの日記

赤羽在住でIT関係の会社の社長やってます。

Re:privateな定数

カプセル化ですか?スコープが狭いとかじゃなくて?
という細かいツッコミはさておき


// リテラル(マジックナンバー)を埋め込んだ場合。
public boolean validate(int value) {
return value <= 300;
}
このクラスの別のメソッドに同じ意味の同値のマジックナンバーを参照するメソッドの仕様追加が行われたらどうされるんでしょうか?

1. その別のメソッドでマジックナンバーを使う。
2. マジックナンバーをprivateな定数として定義して元のメソッドを定数参照に変更し、新しいメソッドも定数参照とする。
1.は以前のレスにも書いたように、そのマジックナンバーが変更となったときにメンテナンスビリティが低下し変更漏れが発生する恐れがあります。
2.を行った場合は元のメソッドを修正し、新しいメソッドにコードを追加するので2メソッドがテストの対象となり修正対象が(たとえ1メソッドであっても)増えます。

そこで帰り道に思ったのですが、YAGNIに従うと将来の変更を考慮してコードを書かないためSaisseさんのようにマジックナンバを使うことになります。
ただYAGNIの原則に従うのは「アジャイルと規律」にも書かれているように
「将来の変更が予測される場合」においては適切で無いケースがあると思います。
クラスをGRASPパターンにしたがって凝集度が高いクラスの設計を行った場合には
スコープが狭いマジックナンバーではなくてクラス内のスコープにおける定数にしておいたほうが
将来の変更に対応しやすいと私は思っています。