こんにちは。
下から回答していきます。
ex3の表記は、質問のコードのようにmName
をそのまま素通ししているなら、殆どの場合においてex1が完全上位互換になります。そもそもex1はex3のコードを自動生成するものなので。
上位互換にならない数少ない例外は、「getter/setterというメソッドを介さず、直接フィールド変数mName
にアクセスしなければならない場合」なのですが、この場面がどういうときかはちょっと思いつきません。もしあったとして、それはかなり黒魔術な空気がありますね……。
ex2については、少しばかりオブジェクト指向宗教論が入ってくるため、あまり主張しても仕方がない話ではあるのですが……自分なら、この設計は絶対に行いません。
理由としては、「Person
クラスが自分のメンバーの値の状態を保証できなくなる」というものがあります。外から何か不正な値(例えば、年齢に負の値など)を設定されたとしても、それの責任をPerson
クラスに持たせることができないのです。それをいうなら、ex1にも同様な責任問題がありますが、ex1の場合は「途中で仕様変更し、setterにValidation処理を挿入する(ex3に書き換える)」ことができます。ex2の場合はそれができません。そして、ex2からex1への変更は「破壊的変更になります」。よって、ex2のコードを書きたい場面では「何も考えずにex1のコードを書く」ことを推奨します。
最後にex1について。
POCOエンティティクラスなど、どうしてもその設計にせざるを得ない場合を除いて、setterを素のままpublicにするのは良くないです。前項で話した責任問題がその理由です。Validation処理をきっちり設定した上で公開するか、公開せずprivateなど内部に隠蔽するかの方法をとり、意図しない値変更を受ける可能性を可能な限り減らすことが大切になります。なので、ex1のコードのまま公開しなければならないとしたら、その時点でなにか設計がおかしいのではないかと疑うことができます。
結論としては、
フィールドは決して公開するべきではなく、必ずプロパティとして公開する。
ex2で書ける場面ではとりあえずex1のコードを書いておき、その上でなんとかsetterを隠蔽できないか、またはValidation処理を追加できないか、を考えるようにするのが良いと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/21 06:36