保護された突然変異体(セッター)
-
27-10-2019 - |
質問
問題
クラスユーザーがいるとします。このユーザーオブジェクトを他の人に返すようにして、ゲッターを使用して情報を抽出するためにそれを使用できるようにしたいと考えています。ただし、内部情報はデータベース内の行に直接関係する必要があるため、人々が内部状態を容易に設定できるようにすることは望ましくありません。拡張クラスのみが変数を設定できるように、突然変異体(セッター)を保護することは理にかなっていますか?これは悪い習慣で、無関係で、やり過ぎであるか、役に立たないのでしょうか?
私は__constructを1つの使用に制限しようとすることを検討しました(これは時々シングルトンのパターンとして審判されると思います - 私は完全に理解しているかどうかはわかりませんが)。
私はアマチュアプログラマーです。無知を許してください。ありがとう。
例:
<?php
class user
{
private username;
protected function set_username($username)
{
$this->username = $username;
}
public function get_username()
{
return $this->username;
}
?>
解決
依存します。州が変更されたときに特に何も起こらない場合は、セッターを完全に除外することができます。どのサブクラスも、保護されているか、ゆるい設定されたプロパティに直接アクセスできます。
状態が変更されたときに何かが必要な場合(たとえば、状態が変更されたときにデータベースの更新が発生する場合)、セッターはデータベースの更新コードへの呼び出しがセッターに入れられるため、あなたの生活をずっと楽にします。つまり、常にセッターを通過する場合、オブジェクトの状態を変更すると、DBは常に更新されます。
要するに、それは依存します。
他のヒント
たとえば、IDを受け入れるコンストラクターがある場合、なぜセッターをまったく持ちたいのでしょうか。 Gettersがあるという理由だけで、オブジェクトセッターを提供することを強制するルールはありません。 USECaseがどこかでオブジェクトを構築している場合、その後、それを使用してデータを抽出している場合は、セッターをまったく作成しません。
オブジェクトを拡張すると、保護されたクラス変数自体を操作できるため、セッターの形態も必要ありません。 「外の世界」がクラスに何かを設定できるようにしたくない場合は、許可しないでください。
あなたのコードは完全に罰金であり、私見は完全にカプセル化されます。 TTはゆるい結合もサポートしています。
使いやすくするために、必要なすべての(必要な)メンバーをコンストラクターパラメーターとして追加できます。
シングルトンパターンについては、注意して使用してください。共通のユーザーはシングルトンではありません。パターンへのリファクタリング(Joshua Kerievsky)を参照してください。