3

我有兩個表格:Campaigns,Campaign_statistics。我需要輸出帶有嵌套統計信息的廣告系列列表。在視圖中使用getter是否是好習慣?

首先,我剛在模型的方法,其創建像以下的數組:

array(
    'id', // integer 
    'campaign_name',// string 
    'stats'// nested array of arrays with stats by periods 
); 

在視圖中我有兩個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 ?> 

模型的實現會導致代碼混亂,所以我決定嘗試使Campaign成爲一個對象。在一個視圖中,我使用getters:

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

我從來沒有見過任何框架使用這樣的getters。這種方法的優點/缺點是什麼?

回答

4

面向對象設計中的getter的美妙之處在於它隱藏了計算返回結果的複雜性。因此,您可以更改計算視圖的方式,並在所有應用程序中自動更新視圖。

純粹主義者聲稱你不應該在視圖等方法調用,但像我這樣的實用主義者說,把方法調用視圖,因爲方法可以進行單元測試。然而,當你發現輸出變得過於複雜時(Martin Fowler稱這些對象變得彼此過於親密),那麼你需要重構使用單一方法調用。

底線:方法好,因爲它們的輸出可以驗證

0

聽起來還行:) Magento允許同樣的事情。

無論如何,這比任何事情都更關乎個人觀點......但我傾向於同意你的看法,它使模型或控制器更易於閱讀(不需要$ view-> toto = $ model-> getToto ()

1

我以前和同事有過一樣的爭論,我不同意在模板裏面使用方法,這使得模板不透明,模板內沒有什麼明確的知識 - 你必須知道你處理的對象與設計人員以及後來加入的開發人員不必擔心這一點,他們應該看到控制器中傳遞的是什麼,更不用說從模板內部調用方法可能會改變已經傳入的數據。儘管我知道在某些情況下模板可以更改我傾向於認爲模板更靜態,其餘代碼 - 遍歷數組不會改變任何其他數組。但我不太確定對象。

它還增加了對重構的額外依賴性。

它還增加了開發人員調用SQL或在模板中執行重邏輯的複雜性和誘惑力。

我大概也可以指出,簡單的模板引擎往往是一個簡單的文本替換者。方法不是他們的選擇。

+0

我們正在談論的干將,而不是大的方法:)我同意給你什麼比干將 – haltabush 2012-03-24 22:49:00

+1

權更加複雜。好吧,我只是害怕冒號:D我想,如果你知道你在做什麼,那麼也可以干涉鈾。 – 2012-03-24 22:53:49

1

通常你不會看到明確的getter,你會看到人們訪問屬性。
但是,如果你的房產是公共的,這隻會有效。
在視圖中實現Zend_Form,您可以使用getters和setters訪問元素和其他屬性。
我沒有看到您所做的選擇有任何主要問題。
但是我可能已經使用partialLoop()視圖助手實現了第二個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 ?> 

只是我的意見,玩得開心。

相關問題