Kent Beck の書籍から。
ガレージのドアを制御するプログラムを書く場合、どれが読みやすいか?
doorRegister = 1 ;
doorOpen() ;
door.Open() ;
もちろん、下に行くほど「やりたいこと」をうまく表現している。
制御ビットに1を立てるという実装の詳細より、ドアを開ける、という意図を表明したコードの方が読みやすい。
もちろん、実装方法の変更にも強い。
基本は、直接アクセスより、メソッドで間接アクセスにして、メソッド名に意図を表す名前をつけるのが良い。
どの範囲で x=1 という直接アクセスの記述をOKとするか、いろいろ選択肢がある。
・アクセサメソッドの内部とコンストラクタの内部に限定する (最も限定するパターン)
・クラス内はOK
・サブクラスまでOK
・パッケージ内はOK
...
Kent Beck は、「一般的なルールはない。自分で考え、まわりと議論し、勉強しろ! それがプロになっていくということ」と書いていますね。 ( Implementation Patterns p.46 )
私は、できるだけ制限する最初のパターンがベストだと思っていました。
同じクラス内でも、アクセサ以外は、アクセサを使うというパターンですね。
でも、ドメイン駆動を勉強するようになってから、わりと小さなクラスを作るようになり、「クラス内は直接アクセスOK」派に転向しました。
x=1 式の記述は、直接的で分かりやすい。同じクラス内で、わざわざアクセサを使うより、理解も速いし、まちがいが少ないと思います。でも、小さなクラス限定です。
大きなクラスを、意図が明確な複数のクラスに分割していくリファクタリングでアクセサを活用しています。
でも最終形は、クラス内では直接アクセスにする。
1.アクセッサメソッド式にして、できるだけ間接アクセスにする。
2.関連が強いフィールドとアクセサをまとめて小さなクラスに抽出する。
3.抽出したクラスに割り当てることが適切なメソッドを、そちらに移動する。
4.移動したメソッド内でアクセサを使っていたら、フィールドの直接アクセスにインライン化
という感じです。
ガレージのドアを制御するプログラムを書く場合、どれが読みやすいか?
doorRegister = 1 ;
doorOpen() ;
door.Open() ;
もちろん、下に行くほど「やりたいこと」をうまく表現している。
制御ビットに1を立てるという実装の詳細より、ドアを開ける、という意図を表明したコードの方が読みやすい。
もちろん、実装方法の変更にも強い。
基本は、直接アクセスより、メソッドで間接アクセスにして、メソッド名に意図を表す名前をつけるのが良い。
どの範囲で x=1 という直接アクセスの記述をOKとするか、いろいろ選択肢がある。
・アクセサメソッドの内部とコンストラクタの内部に限定する (最も限定するパターン)
・クラス内はOK
・サブクラスまでOK
・パッケージ内はOK
...
Kent Beck は、「一般的なルールはない。自分で考え、まわりと議論し、勉強しろ! それがプロになっていくということ」と書いていますね。 ( Implementation Patterns p.46 )
私は、できるだけ制限する最初のパターンがベストだと思っていました。
同じクラス内でも、アクセサ以外は、アクセサを使うというパターンですね。
でも、ドメイン駆動を勉強するようになってから、わりと小さなクラスを作るようになり、「クラス内は直接アクセスOK」派に転向しました。
x=1 式の記述は、直接的で分かりやすい。同じクラス内で、わざわざアクセサを使うより、理解も速いし、まちがいが少ないと思います。でも、小さなクラス限定です。
大きなクラスを、意図が明確な複数のクラスに分割していくリファクタリングでアクセサを活用しています。
でも最終形は、クラス内では直接アクセスにする。
1.アクセッサメソッド式にして、できるだけ間接アクセスにする。
2.関連が強いフィールドとアクセサをまとめて小さなクラスに抽出する。
3.抽出したクラスに割り当てることが適切なメソッドを、そちらに移動する。
4.移動したメソッド内でアクセサを使っていたら、フィールドの直接アクセスにインライン化
という感じです。