3

私は2つのテーブル、Campaigns、Campaign_statisticsを持っています。入れ子になった統計情報を持つキャンペーンリストを出力する必要があります。 (別内にネスト1)ゲッターをビューで使用するのは良い方法ですか?

array(
    'id', // integer 
    'campaign_name',// string 
    'stats'// nested array of arrays with stats by periods 
); 
Iは、2つのforeach文を持っていたビューで

<? foreach ($this->campaigns as $campaign): ?> 
    <div class="campaign"> 
     <?= $campaign['name'] ?> 
     <? foreach($campaign['stats'] as $monthStats): ?> 
      <div class="statistics"> 
       <?= $monthStats['views'] ?> 
      </div> 
     <? endforeach ?> 
    </div> 
<? endforeach ?> 

開始するには、私は、次のような配列を作成したモデル内のメソッドを持っていました

モデルの実装が面倒なコードになるので、私はキャンペーンをオブジェクトにしようと決めました。私はゲッターを利用しています:

<? foreach($this->campaigns as $campaign): ?> 
    <div class="campaign"> 
    <?= $campaign->getName() ?> 
    <? foreach($campaign->getMonthStats() as $monthStats): ?> 
     <div class="statistics"> 
      <?= $monthStats->getViews() ?> 
     </div> 
    <? endforeach ?> 
    </div> 
<? endforeach ?> 

私はこのようなゲッターを使用するフレームワークを見たことがありません。このアプローチの長所と短所は何ですか?

答えて

4

オブジェクト指向設計のゲッターの美しさは、返された結果がどのように計算されるかの複雑さを隠すことです。ビューを計算する方法と、すべてのアプリケーションで自動的に更新される方法を変更できます。

純粋主義者は、ビューなどでメソッド呼び出しを行うべきではないと主張しますが、自分自身のような実用主義者は、メソッドが単体テストできるので、メソッド呼び出しをビューに入れます。しかし、出力が複雑になりすぎると(Martin Fowlerはこのオブジェクトを互いにあまりにも親密になるように呼びます)、単一のメソッド呼び出しを使用するようにリファクタリングする必要があります。

ボトムライン:メソッドの良い彼らの出力は我々がゲッターについて話している

0

サウンドよく聞こえます:) Magentoは同じものを許可します。

とにかく、それは何よりも個人的な視点です...しかし、私はあなたに同意する傾向があります。モデルやコントローラを読みやすくします($ view-> toto = $ model-> getToto ()

1

以前私の同僚と同じ議論をしていましたが、テンプレート内でメソッドを使用することに同意しません。これはテンプレートを透過的にしません。テンプレート内で利用できるものについて明確な知識はありません。後で参加する開発者や開発者は、それを心配する必要はありません。コントローラ内で何が渡されているのかを確認する必要があります。テンプレート内からのメソッド呼び出しは、内部で既に渡されたデータを変更する可能性があります。そして、私はいくつかのケースではテンプレートの変更があることを知っていますが私はテンプレートがより静的であり、コードの残りの部分であると思う傾向があります。つまり、配列を反復しても他の配列は変更されません。しかし、私はオブジェクトではそれほど確かではありません。

リファクタリングに余分な依存関係も追加されます。

また、開発者にとっては、SQLを呼び出したり、テンプレート内で重いロジックを実行したりするための複雑さと魅力が増します。

私はおそらく、単純なテンプレートエンジンが単純なテキスト置換プログラムである傾向があることを指摘することもできます。メソッドはそれらのオプションではありません。

+0

を確認することができますので、大きくはない方法は:)私は右ゲッター – haltabush

+1

よりも複雑なもののためにあなたに同意します。まあ、私はコロンの恐怖です:Dあなたが何をしているのか知っていれば、私はウラニウムにも干渉していると思います。 –

1

通常、人々がプロパティにアクセスするのを見る明示的なゲッターは表示されません。
ただし、これはプロパティが公開されている場合にのみ有効です。
ビューにZend_Formを実装すると、getterとsetterを使用して要素やその他の属性にアクセスできます。
あなたの選択に大きな問題はありません。
しかし、私はpartialLoop()ビューヘルパーを使用して2番目のforeach()を実装している可能性があり、特に私が複数の場所で使うことを意図したビューヘルパーを構築している可能性があります。

//example of what is commonly seen... 
<? foreach($this->campaigns as $campaign): ?> 
    <div class="campaign"> 
    <?= $campaign->name ?> 
    <? foreach($campaign->stats as $monthStats): ?> 
     <div class="statistics"> 
      <?= $monthStats->views() ?> 
     </div> 
    <? endforeach ?> 
    </div> 
<? endforeach ?> 

私の意見では、楽しくてください。

関連する問題