2010-07-23 158 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()... 
}