teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

編集

2018/02/26 18:12

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  - PHPにおいては,プロパティに型は指定できない一方,メソッドの引数には**「代入可能な型の制御」** **「代入可能なタイミングの制御」**を課すことができる。この時点でまず `public` ではなく `protected` または `private` を採用するメリットがある。
2
2
  - ファクトリクラス・コンフィグクラス・シングルトンクラス等の一部のユースケースを除き,一般的にオブジェクトは**イミュータブル**であるほうが望ましいとされるため,Setterはむしろ使わないほうがいい。この考えに則る場合は,プロパティに設定すべき内容はSetterではなくConstructorで渡すようにする。後からプロパティを変更したい場合は, `setXXX` の代わりに `withXXX` という命名を使って,返り値に変更を反映した新しいオブジェクトを返すようにする。
3
- - もしPHPにおいて,プロパティにJavaの`final`(Constructorでのみ代入を認めてそれ以降の変更は認めない)相当の制約を課すことが可能であるならGetterは必ずし必要とは言えないが,そのような機能はないため結局のところ多くの場合はGetterが必要になる。
3
+ - もしPHPにおいて,プロパティにJavaの`final`(Constructorでのみ代入を認めてそれ以降の変更は認めない)相当の制約を課すことが可能であるなら,`public final` で宣言すればGetterは無くて済むが,そのような機能はないため結局のところ多くの場合はGetterが必要になる。また,取得のたびにリアルタイムな値を使って再計算するような場合もGetterが必要。
4
4
 
5
5
  要するに,`protected`なプロパティとGetterをベースにして,Setterはどうしても必要なときだけ使う,が正解です。イミュータブルにしてもコーディングの生産性が落ちない(むしろ分かりやすくなって上がる)場合はイミュータブルを採用しましょう。
6
6