2009-08-22 5 views
0

は、印刷を行う、葉、およびその親TDを考える:葉の溶液は、両親が異なる2つに分かれていますか?

$parent = new Node('td'); 
$child = new Leaf('Text:', 'Value'); 
$parent->add($child); 
$parent->print(); 

印刷要件:

sometimes <td>Text: Value</td> 
sometimes <td>Text:</td><td>Value</td> 

は、これまでのところ、私は3つのソリューションを構築し、どれもが私を満たしていない、私はもっとある1だろうOO?そして4番目の選択肢はありますか?

答えて

1

コントロールはあなたの階層に従っていなければなりません...それは親に応じて行動を決める葉までではなく、葉から情報を取得してそれ自身の状態に応じて処理するか、または必要なデータ子供に何らかの情報を照会すると、リーフはノードから切り離されます。そうでなければ、双方向依存性があり、再利用性が大幅に低下します...

greetz

back2dos

+0

役に立つ説明、理解しようとしている。私はこれまでコントローラーを追加することを考えていましたし、階層からTDを削除することも考えました。これまでのところ、私はまだエレガントな、またはあなたの言葉でこの問題を解決するための方法を探しています – Edward

+0

素晴らしい、あなたの答えは問題を明確にするのに役立ちます。各ノード/リーフはコンポジット・パターンを使用することで既に自分自身をどのようにプリントするかを知っており、プリント自体を処理します。しかし、問題の要件を満たすために、ノード/リーフはもはや第2の解決策では、親情報を知っている必要があります。第3の解決策では、親は子情報を知っていなければならない。どちらも追加的な依存を導入する。今私はどちらの解決策も私を快適にさせる理由を知っています。コントローラーを追加すると本当に脳の痛みを助けてくれないようです – Edward

0

解決策2を個人的に行う必要があります。そのソリューションでは、葉が好きではないノードを保持できると言っていますが、何らかの理由がありますかにはノードを保持できるがありますか?あなたはリーフ(このようなもの)にノードを渡す防止チェックを追加することができる必要があり、異なるクラス(ノードとリーフ)を使用しているので:

class Leaf { 
    public function __construct($text, $value) { 
    if (is_object($text)) 
     throw new Exception('error message'); 

    if (get_class($value) == 'Node') 
     throw new Exception('error message'); 
    } 
} 

これらのチェックの両方が、第二に動作するはずです1つは特定のクラスをチェックするだけですが、最初のクラスはすべてのオブジェクトを防ぎます。 is_string()関数を使用することもできますが、これはintを許可しません。

最もOO「は、も...それはビュー階層にデータをレンダリングしたい、あなたのモデル階層は、コントローラによってtraversibleでなければなりません...データモデルから描画ロジックの連鎖を

を区切ることであろう

+0

2つは良いですよね?しかし、なぜ?私はコンポジットパターンを使用するので、タイプのチェックは問題ではありません。 – Edward

+0

2最もシンプルですが、非常にきれいではありません... – back2dos

+0

私は4番目の解決策、解決策2の基礎を少し修正しました。今はそれが最良の解決策だと思っています – Edward

関連する問題