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 ?> 

只是我的意见,玩得开心。

相关问题