2011-04-23 37 views
2

這是一個經常出現的情況,從來沒有讓我感到太容易。我想我會問別人怎麼處理它。乾淨,單獨集中,自我記錄的方法不需要重複

試想一下,如果一個演示= 60命令行參數的處理是這樣完成的:

if DemoOptionSpecified() { 
    timeout = ReadInDemoTimeout(); 
    DoDemoVersion(timeout); 
} else 
    DoRealVersion(); 

DemoOptionSpecified()做某種的grep的參數字符串,返回true或false。

ReadInDemoTimeout()也執行某種類型的grep,相同的字符串,並返回一個整數。

兩個greps做兩件不同的事情,但當然只需要一個grep來做兩件事。兩個greps而不是一個可能不重要,但在其他情況下,可能會有兩個數據庫或Ajax調用。

我不特別喜歡讓DemoOptionSpecified()做什麼比看看是否提供該選項更多。方法名稱不會提示額外的值捕獲。

如果演示選項不存在,我不特別喜歡使用名爲ReadInDemoTimeout()的方法返回false的替代方法,因爲我只想在設置選項時聽到超時值。 DoRealVersion()不關心超時值。

我不覺得這是一個很好的不妥協的清潔代碼模式。思考?

回答

2

我看不出有什麼問題,具有不都一個方法 - 你只需要正確地將其命名爲:

DemoOption demoOption = getDemoOption(); 
if (demoOption.wasSpecified()) { 
    int timeout = demoOption.getValue(); 
    doDemoVersion(timeout); 
} 
else { 
    doRealVersion(); 
} 

你甚至可以使其更簡單,並且有方法返回的值,或者null如果沒有設置該選項:

Integer demoTimeout = getDemoOptionIfSpecified(); 
if (demoTimeout != null) { 
    doDemoVersion(demoTimeout); 
} 
else { 
    doRealVersion(); 
} 

然後,我會做的方法通用:

Integer demoTimeout = getOptionIfSpecified("demo", Integer.class); 
if (demoTimeout != null) { 
    doDemoVersion(demoTimeout); 
} 
else { 
    doRealVersion(); 
} 

我不認爲這是做兩件事的方法。它所做的一件事是「如果有一個,就得到期權的價值」。然後你可以問兩個關於結果的問題 - 是否有一個,它的價值是什麼? - 但是這在調用代碼中發生。

如果你堅持不回收價值,除非需要,那麼注入它怎麼樣?但是,嚴重的是,如果我正在閱讀你的代碼,並且看到除第三個版本以外的其他東西,我會看到過度複雜化並開始重構。推測性地獲得價值並以不同方式處理空和非空情況的習慣用法非常普遍(至少在Java中);沒有有用的目的是通過避免它追求某種純粹的純粹形式。

+0

第一個版本越來越近,可能確實是最好的事情,以滿足我的pedantry。我的第二個和第三個版本與我在Greg評論中提到的相同 - 只有在設置了演示選項時才需要超時細節,因此理想情況下我希望將它封裝在演示模塊中,以便代碼可以快速掃描而不會有視覺噪音。 – jontyc 2011-04-23 11:11:11

+0

我會添加另一個更復雜的選項,它可能會招待你。 – 2011-04-23 12:28:56

+0

是的,它招待我! :)這不是我追求的純粹,而是任何代碼都可以被閱讀和理解的最快速。當然這是一個簡單的例子,任何人都可以快速閱讀任何東西(欄注入!)。我會讓癱瘓的分析消失並睡在它上面。 – jontyc 2011-04-23 14:08:40

1

也許是這樣的,用C++例如:

bool GetDemoOption(int &timeout); 

int timeout; 
if (GetDemoOption(timeout)) { 
    DoDemoVersion(timeout); 
} else { 
    DoRealVersion(); 
} 

這依賴於C++能夠容易地通過引用傳遞迴一個選項值。在嚴格按值傳遞語義(如Java或Python)的語言中,這樣做比較笨拙。在Python,然而,人們可以從一個函數返回多個值:

exist, timeout = GetDemoOption() 
if exist: 
    DoDemoVersion(timeout) 
else: 
    DoRealVersion() 
+0

您的C++示例中,超時只與演示版本有關,所以我想將其隱藏或封裝在處理Demo的塊中。與Python示例相同。此外,我從不熱衷於多個返回值,特別是在像PHP這樣的語言中,沒有預先聲明來記錄這些值。 – jontyc 2011-04-23 10:57:22

相關問題