2010-09-28 47 views
0

这是一个标志,这里需要一些设计模式吗?一堆私人物业一一执行

/** 
* @return string 
*/ 
public function filter($string) 
{ 
    // underscored means private 
    $this->_prepareSomething($string); 
    $this->_prepareSomething2(); 
    $this->_prepareSomething3(); 
    $this->_prepareSomething4(); 
    $this->_prepareSaveSomethingToFile(); 

    return $this->getFiltered(); 
} 
+0

需要更多信息才能真正辨别。 – Chris 2010-09-28 13:15:39

+2

同意我们需要更多信息,但看起来有点像某些抽象可能适用于此处。很难说它是否仅仅为了可测试性而分裂(而不是单一的例程,将它分解成一堆小的)。但它仍然紧密结合......或许[责任链条](http://sourcemaking.com/design_patterns/chain_of_responsibility)或[Command](http://sourcemaking.com/design_patterns/command)模式可能更适合。但是,如果不完全了解它的作用,我不确定这里有什么适用的...... – ircmaxell 2010-09-28 13:19:21

+0

首先想到的是ircmaxell提到的一个责任链,但我认为需要更多的信息。 – tplaner 2010-09-28 13:22:39

回答

1

这都是关于可读性和正确的抽象级别。作为读者,我很难看到_prepare *函数之间交换了什么数据。而且,让我们假装他们是某种计算,然后将一些数据保存到文件将业务逻辑与持久性混合在一起。这看起来像混合了抽象层次。

此外,getFiltered()调用也令人困惑,因为它看起来像使用与原始函数类似的命名方案调用公共方法。

样式:请参阅http://c2.com/ppr/wiki/WikiPagesAboutRefactoring/ComposedMethod.html了解组合方法模式说明,http://www.markhneedham.com/blog/2009/06/12/coding-single-level-of-abstraction-principle/ SLAP原理。

+0

+1:另外,我会强烈推荐阅读[代码完成2](http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670),因为它很好地解释所有这些... – ircmaxell 2010-09-28 13:53:09

0

它看起来像你已经实施Template Method pattern。如果你的类有子类可能需要重写该过程中的某些步骤,那么我会说你已经有效地设计了你的基类。