あまりにも多くの作業を行っているコンストラクタについてはan articleと読んでいます。 一つの段落は、依存関係が反転する傾向にあるオブジェクト指向スタイルでは、有効なオブジェクト状態を定義するものは何ですか?
を読み込み、コンストラクタは異なる、よりスパルタンな役割を持っています。その唯一の仕事は、オブジェクトが基本不変条件を満たす状態にオブジェクトが初期化されることを確認することです(つまり、オブジェクトインスタンスが有効な状態で始まり、それ以上のものでないことを確認します)。
ここでは、クラスの基本的な例を示します。クラスの作成時に、HTMLで渡されます。このHTMLは、クラスプロパティを設定するために解析する必要があります。
OrderHtmlParser
{
protected $html;
protected $orderNumber;
public function __construct($html)
{
$this->html = $html;
}
public function parse()
{
$complexLogicResult = $this->doComplexLogic($this->html);
$this->orderNumber = $complexLogicResult;
}
public function getOrderNumber()
{
return $this->orderNumber;
}
protected function doComplexLogic($html)
{
// ...
return $complexLogicResult;
}
}
私はコンストラクタが、これはひどい習慣で、上記の記事とthis article状態の両方として任意のロジックをやっていけないので、私はparse
機能を使用
$orderparser = new OrderHtmlParser($html);
$orderparser->parse()
$orderparser->getOrderNumber();
を使用してそれを呼んでいます。私はparse
メソッドを使用しない場合
public function __construct($html)
{
$this->html = $html;
$this->parse(); // bad
}
しかし、その後、私のすべてのプロパティ(この例では一つだけ)はnull
を返します。
これは「無効な状態」のオブジェクトとして知られていますか?私の解析方法は、それがときにコンストラクタが、そのメソッドを呼び出したときにのみである場合も、他の物品(イムわからないもののにより悪いとみなされる変装initialise
関数であるよう
はまた、それがややを感じています手動で呼び出されるか、その両方)。それにもかかわらず、初期化メソッドは、プロパティを設定する前にいくつかの複雑なロジックを実行しています。ゲッターが確実に呼び出される前に発生する必要があります。
私はこれらの記事を誤解しているか、これらの記事で私がこの単純なクラスの全体的な実装が正しくないと思うようになってしまっています。
'$ html'をコンストラクタに渡すのではなく、' parse'メソッドに渡すことを検討してください。次に、他のメソッド(nullを返す)の振る舞いがより理にかなっています。あなたは引数をコンストラクタに渡すこともできますが(オプション)、コンストラクタはオブジェクトの* parse *メソッドを呼び出す必要があります。どうやら、オプションの振る舞いは記事に書かれているビジョンに合わないが、それは私には受け入れられるようだ。 – trincot
それは私を助けてくれてありがとう。 –
@myol - 私は自分の返信を更新し、一般的なコンストラクタとコンストラクタの例外についての考慮事項を追加しました。 –