2013-04-05 59 views
0

我不確定如何搜索這個,所以如果它已被回答,請將我指向它。有幾種部分重疊的邏輯流使用DRY的最佳做法嗎?

我再次遇到了一個相當普遍的情況,我不確定最佳做法。考慮一個函數具有三種可能值之一的情況;我們會說他們是'a','b'和'c'。

如果我收到'a'或'b',那麼在處理了一些特定的案例後,我會進行大量重疊處理。但是,如果我收到'c',我需要做一些完全不同的事情。舉例來說,這是微不足道的,但是我有一些非常重要的實例。

示例(Python):

def doStuff(self, val): 
    if val == 'a': 
     self.counter += 1 
     print val, "is very good" 
     self.passing = True 
     self.doMoreStuff() 
    elif val == 'b': 
     self.counter += 2 
     print val, "is not too bad" 
     self.passing = True 
     self.doMoreStuff() 
    elif val == 'c': 
     self.counter -= 1 
     self.passing = False 
     print val, "is unacceptable" 
     self.weAreDoneHere() 

這樣的想法是,對於任一「一」或「B」,有一些具體的情況下的指令和一些重複的東西,不過「C」,它是全部不同。在某些情況下,留下三個不同的病例並不算太壞,儘管它讓我的DRY眼睛抽搐着看着它。在其他情況下,如果有很多重複的代碼,它可能是一個更大的問題。

一個解決方案是類似以下內容:

def doStuff(self, val): 
    if val == 'a' or val == 'b': 
     if val == 'a': 
      self.counter += 1 
      print val, "is very good" 
     elif val == 'b': 
      self.counter += 2 
      print val, "is not too bad" 
     self.passing = True 
     self.doMoreStuff() 
    elif val == 'c': 
     self.counter -= 1 
     self.passing = False 
     print val, "is unacceptable" 
     self.weAreDoneHere() 

這是雙重檢查最值的方法好嗎?它也使我的DRY眼睛抽搐一點,但不像重複巨大的代碼塊。

我真正的問題,我想是有沒有討論過這個問題,或者是否有標準的「最佳實踐」方式來做到這一點?

+1

我不知道python,但是在大多數情況下,你會重構A和B之間的所有東西,並將它們放在一個私有函數中,然後從A和B調用它。 – jbabey 2013-04-05 18:47:51

+0

python不太重要,它是一個相當隨意的選擇。如果通用代碼不足以保證額外的方法,只有3或4行? – 2013-04-05 18:55:32

+0

我想大多數人會爭辯說,即使是一條共同的路線也足以保證新的**私人**功能。 – jbabey 2013-04-05 19:22:46

回答

1

我不知道蟒蛇,但在大多數情況下,你會重構A和B之間共同的一切,並把它們放在一個私有函數,然後調用,從A和B.

在JavaScript中的一個例子:

var someFunction = function (someArg) { 
    var stuffCommonToAandB = function() { 
     // stuff for both A and B 
    }; 

    switch (true) { 
     case someArg === 'A': 
      stuffCommonToAandB(); 
      // stuff for A only 
      break; 
     case someArg === 'B': 
      stuffCommonToAandB(); 
      // stuff for B only 
      break; 
     case someArg === 'C': 
      // stuff for C only 
      break; 
    } 
}; 

這可能是值得一提的是通過標誌像這樣的功能來切換不同的行爲有時是一個跡象,表明你的函數違反了single responsibility principle,在這種情況下,你會想退後一步,重新考慮進一步的設計。

相關問題