2010-07-23 121 views
2

一些我正在审查我团队代码库中的一些代码,我们遍历一个分层数据结构并从中构建一个新的数据结构。没有嵌套循环 - 层次结构的每个级别都有自己的专用功能。这种模式叫什么?

因此,我们有这样的代码:

有几十个这样的方法,其中每个方法的长度为3至5条线,类似地命名,通常包含一个简单的空检查或过滤器,以及对代码的粗略回顾显示,没有方法真的被多次调用。方法是公开的单元测试目的。

我个人发现它的代码很难浏览,因为几十个公共方法==数十个入口点的入口点。

这种编码模式有一个名字吗?它是反模式吗?这种风格比简单地将循环嵌套在一个函数中更有优势吗?

+0

''递归下降?'' – sbi 2010-07-23 14:10:40

+0

inb4:这看起来非常像(可以重构为访问者模式的东西)。 :-D – 2010-07-23 14:11:56

+0

哦,并且由于每种方法都是“公共”的,所以很难找到启动级联函数的“根”方法。 – Juliet 2010-07-23 14:14:26

回答

3

对我来说看起来就像是一个调和链。您只需处理部分传入请求,然后转移到链中的下一个项目。

Chain-of-responsibility

在你的情况应该是这样的:

Action action = new Action; 
action = action.SetNext(DoA); 
action = action.SetNext(DoB); 
action = action.SetNext(DoC); 

A a = new A(); 
action.Process(a); 
+0

+1,+答案:我争先恐后地对代码负责,并问他以何种方式构建代码的动机是什么。显然,所有的方法都是为了测试目的而“公开”的,而“虚拟”的方法可以被RhinoMocks覆盖并且相对独立地进行测试。树遍历逻辑并不完全复杂,并且随着不同人员的工作,代码的结构会失去控制。我认为这个建议将有助于清理代码,所以堆栈跟踪比深度更广。谢谢 :) – Juliet 2010-07-25 05:28:03

2

哎呀。这绝对应该是合格的。不知道这是一个反模式,但。我会去反递归。

它也可能是Programming by Permutation的标志(开发人员在每次结构变得更深时向层次结构添加一个级别)。

1

这是我会考虑良好的编码风格 - 小方法与一个责任。如果这些方法的命名很好,则应该让代码易于理解和维护。

当然,如果很多方法非常相似,可以寻找一个常见的模式,并使用委托或类似的东西将其分解 - 但这确实取决于实际的代码。

+0

同意!这不是因为不使用成员方法,而是没有良好的代码风格。 – xtofl 2010-07-23 14:28:46

0

这看起来有点像Composite pattern,不同之处在于您可以利用父级和子级在层次结构中的相似性来最小化您的编码。

您可以通过让结构中的每个元素实现一个知道如何处理其子元素的接口来利用这一点。

public interface ChildProcessor { 
    public void process() 
} 
public A implements ChildProcessor { 
    public void process() { foreach (B b)... } 
} 
public B implements ChildProcessor { 
    public void process() { foreach (C c)... } 
} 

public void DoA(A a, Transform transform) 
{ 
    A.process()... 
}