1

このデザインの決定には苦労しました。

従来newの言語構造を使用してオブジェクトを初期化し、次のような変数を介してそれらを使用できます。

$o = new Object('arg');
$o->method();
$o->property = 'value';
$o->save();

または、工場のパターンとアグレッシブなチェイナビリティを選択できます

Object::new('arg')->method()->setProperty('value')->save();

その結果、

  • LOCを減らす
    • 読んだ、
    • 維持、
    • リファクタリング、
  • 変数に名前を付ける必要はありません。

ただし、これが受け入れられるアプローチであるかどうか、および何かを考慮に入れるのを忘れているかどうかはわかりません。

私がどのように決定を下すことができるかについて、あなたの懸念や同意、およびガイダンスを表明してください.

4

4 に答える 4

3

最近の Fluent Interface の流行については複雑な気持ちです。

私にとって流暢なインターフェイスは、メソッド チェーン全体が最初から最後まで単一の概念を表現している場合に意味があります。例えば:

var SuperLate = (new Coffee()).AddMocha().AddCream().Invert().Blend();

各ステップが意味をなすにはチェーンのコンテキストが必要であり、チェーン内のメソッドが実行される順序が重要です。Blend() が Invert() の前に呼び出されると、混乱が生じます。

あなたの例では、インターフェースのメソッド間に時間的な結合はほとんどありません。プロパティの設定とメソッドの実行は、順序に依存してはなりません。日常的なメソッド呼び出しとプロパティ操作に流暢なインターフェイスを導入しても、インターフェイスの複雑さが増すだけで、時間的な結合の認識が得られると思います。

さらに、流暢なインターフェイスを追加すると、各メソッド間の結合が増加します。これは、メソッドが互いの戻り値に依存するようになったためです。この結合は、各メソッドが全体的な概念の一部 (コーヒーを淹れるステップなど) のみを表現する場合には意味がありますが、各メソッドが独立している場合、将来のリファクタリングを妨げる可能性があります。

より冗長になるかもしれませんが、日常的なメソッド呼び出しとプロパティ設定に流暢なインターフェースを導入することはお勧めしません。

于 2009-11-09T17:39:54.863 に答える
1

私はあなたの「チェーン可能な」デザインの大ファンです。この種の設計はFluent Interfaceと呼ばれることもあります。

于 2009-11-09T17:13:47.093 に答える
0

初期化のために値を取る複数のコンストラクターを持たないのはなぜですか。したがって、次のようになります。

Object::new()
Object::new('arg1')
Object::new('arg1','arg2')

于 2009-11-09T17:12:08.743 に答える