2011-02-03 51 views
3

在这种情况下会被认为是“最佳实践”。我已经得到了团拜远程资源的一类,它看起来有点像这样:面向对象设计:返回值或设置属性?

class Gather { 
    public function getAll($locations) { 
     $results = array('All','My','Results'); 
     return $results; 
    } 
} 

我的问题是,将它视为返回结果,或将它们分配作为一个属性的最佳做法?即。

// This 
$results = $gatherer->getAll(); 
// vs This 
$gatherer->getAll(); // now $gatherer->results can be used 

它很可能我只是这得太多,但我有没有正规的训练,我想知道是否有做这样的事情的“更正确”的方式。

回答

6

毫无疑问,第一个($ results = $ gatherer-> getAll())是首选。原因是价值与其来源之间的关系是明确的。在第二种情况下,读者不清楚$ gatherer->结果是通过调用getAll()来填充的。也许它来自其他呼叫,或者它始终存在,或由外部呼叫者设置。

这也使得读者更容易通过追踪来了解呼叫。当getResults()返回值时,读者应该阅读getResults()的实现来查看它的来源。

+0

我同意。如果结果'属于'收集实例,并且收集对象将随后执行后续工作,则此替代方法仅适用。 – 2011-02-03 16:21:09

1

最近我一直在与这个相同的问题摔跤。在第二个版本

$gatherer->getAll(); // now $gatherer->results can be used 

我想你的命名约定更改为

$gatherer->initResults(); 

那么很明显,结果是$采集的属性。你甚至可以这样定义$ gatherer-> initResults()像这样:

public function initResults() { 
    $this->results = $this->getAll(); 
} 

public function getAll() { 
    // do whatever to get results 
} 

那么,你可以使用任何一种形式。

对不起,我知道这是更多的评论,然后答案,但它是如此的代码沉重,它实际上是不可读的评论。