2012-01-13 5 views
3

問題保護ミューテータ(セッター)

は、クラスのユーザーを持っていると仮定します。このユーザーオブジェクトを他のユーザーに返すことができるようにして、ゲッターを使用して情報を抽出することができます。しかし、内部情報をデータベースの行に直接関連付ける必要があるため、人々が内部状態を容易に設定できるようにする必要はありません。拡張クラスだけが変数を設定できるように、保護されたmutators(setter)を持つことは理にかなっていますか?これは、無関係な、過度の、または役に立たない悪い習慣ですか?

私は1つの使用に__constructを制限しようとしていると考えられてきた

(私はこれが時々シングルトンパターンと査読されると信じて - 。私は完全に理解してかどうかわからないのですが)

私はアマチュアプログラマ午前、任意のを許します無知。ありがとう。

例:

<?php 

    class user 
    { 

    private username; 

    protected function set_username($username) 
    { 
     $this->username = $username; 
    } 

    public function get_username() 
    { 
     return $this->username; 
    } 

?> 
+1

'private'と' protected'状態は、あなたのコードにセキュリティを追加するために作られていません。 – Nazariy

答えて

2

依存します。状態が変更されたときに特に何も起こらなければ、セッターを完全に残すことができます。どのサブクラスも、保護されているか緩い設定されているプロパティに直接アクセスできます。

状態が変更されたときに何かが起こる必要がある場合(たとえば、状態が変更されたときにデータベースの更新が発生するなど)、セッターは、データベース更新コードの呼び出しをセッター。つまり、常にセッターを通過すると、オブジェクトの状態を変更したときにDBが常に更新されます。

要するに、それは依存します。

0

たとえば、idを受け入れるコンストラクタがある場合、なぜセッタを使用したいのですか。ゲッターを持っているという理由だけでオブジェクトセッターに与えることを強制するルールはありません。 usecaseがどこかでオブジェクトを構築しているときに、そのオブジェクトを使ってデータを抽出するだけの場合は、単にセッターを作成しないでください。

拡張されたオブジェクトは、保護されたクラス変数自体を操作して、セッターの形式を必要としないようにすることができます。 「外の世界」がクラスに何かを設定できないようにしたい場合は、許可しないでください。

0

あなたのコードは完全に上質で、完全にカプセル化されています。 Ttも疎結合をサポートしています。

使いやすくするために、必要な(必要がある)メンバーをすべてコンストラクタパラメータとして追加できます。

シングルトンパターンは注意して使用してください。一般的なユーザーはシングルトンではありません。パターンリファクタリング(Joshua Kerievsky)を参照してください。

+0

私は、多くのセッターを持つよりも、__constructを使うことに賛成しています。しかし、単純に変数を変更するために外部から__constructを呼び出すことはできませんか?これは、データベースに保持されているものの現実に対応していない情報でクラスを再構築するだけです(私が目指しているもの)。 –

+1

http://ed.php.net/manual/en/language.oop5.decon.phpに記載されているように、複数のコンストラクタを作成することができます – tuergeist

関連する問題