2011-06-30 44 views
6

目前我正在研究一些代碼(我相信)需要相當多的嵌入式if語句。是否有一些標準來嵌入多少if語句?我的大部分搜索結果都反映出處理excel的事情。不知道爲什麼。有太多嵌入式if語句嗎?

如果有標準,爲什麼?它是爲了可讀性,還是爲了讓代碼運行更順利?在我看來,它的意義主要在於可讀性。

的例子我如果結構:

if (!all_fields_are_empty): 
    if (id_search() && validId()): 
     // do stuff 
    else if (name_search): 
     if (name_exists): 
      if (match < 1): 
       // do stuff 
     else: 
      // do stuff 
    else if (name_search_type_2): 
     if (exists): 
      if (match < 1): 
       // do stuff 
     else: 
      // do stuff 
else: 
    // you're stupid 

我聽說有2-3限制嵌套爲/ while循環,但有一些標準的if語句?

更新: 我有幾年在我的腰帶下。請不要使用這麼多的if陳述。如果你需要這麼多,你的設計可能很糟糕。今天,當我可以找到一種優雅的方式來做這些事情時,我喜歡用最少的if陳述或switch個案。代碼結束了更清潔,更容易測試,更容易維護。一般。

+0

可能的重複:http://stackoverflow.com/questions/4610489/maximum-number-of-nested-conditions-allowed –

+0

我不是問多少是最大的,我問什麼標準是程序員之間。 – Cody

+1

程序員之間沒有「標準」。每種情況都有自己的嵌套最大值。例如,如果你有一些沉重的數學代碼做了一些可怕的計算 - 我會很容易地用15個嵌套的ifs去做,沒有問題,如果有評論會在附近解釋它。然而,如果代碼的一部分是可重用的 - 我會試着按照你可以重用它的方式來分割它們。 – bezmax

回答

4

從技術上講,我沒有意識到任何嵌套的限制。

這可能是的,如果你發現自己去很深設計不良的指標。

一些你貼什麼樣子,可能爲case聲明得到更好的服務。

我會關注可讀性和代碼維護旁邊的人這實際上意味着這將是困難的 - 即使是第一人(你) - 把它擺在首位的所有權利。

編輯:

您也可以考慮有一類就是像SearchableObject()。你可以用普通的功能創建一個基類,然後繼承ID,Name等,這個頂層控制塊將被大大簡化。

0

的唯一技術限制的嵌套的數量,如果用Java/else塊將可能是你的棧的大小。風格是另一回事。

btw:什麼是冒號?

+0

我只是簡單地輸入了一些東西,作爲我的if結構的例子。我想,我的一部分蟒蛇體驗已經出來了。 – Cody

5

我不認爲是有極限的,但我不會推薦embeddeding多兩個 - 它太難懂,難以調試,難以進行單元測試。考慮看幾本偉大的書籍,如RefactoringDesign Patterns,也許Clean Code

1

從技術上講,你可以有很多,只要你喜歡,但如果你有很多它可以迅速使代碼不可讀。

我通常會做是這樣的:

if(all_fields_are_empty) { 
    abuseuser; 
    return; 
} 

if(id_search() && validId()) { 
    //do stuff 
    return; 
} 

if(name_search) 
{ 
    if(name_exists) 
    //do stuff 
    return 
    else 
    //do stuff 
    return 
} 

我敢肯定,你得到的圖片

7

蘭迪提到的,這種代碼的原因是在大多數情況下較差應用程序的設計。通常我會嘗試在你的情況下使用「處理器」類。

例如,假設有一個名爲「操作」,並使用不同的參數30個不同的操作一些通用的參數,你可以做一個接口:

interface OperationProcessor { 
    boolean validate(Map<String, Object> parameters); 
    boolean process(Map<String, Object> parameters); 
} 

然後實現很多你需要每個操作的處理器,例如:

class PrinterProcessor implements OperationProcessor { 
    boolean validate(Map<String, Object> parameters) { 
     return (parameters.get("outputString") != null); 
    } 
    boolean process(Map<String, Object> parameters) { 
     System.out.println(parameters.get("outputString")); 
    } 
} 

下一步 - 您註冊在某些陣列所有的處理器時,應用程序初始化:

public void init() { 
    this.processors = new HashMap<String, OperationProcessor>(); 
    this.processors.put("print",new PrinterProcessor()); 
    this.processors.put("name_search", new NameSearchProcessor()); 
    .... 
} 

所以,你的主要方法變得像這樣:

String operation = parameters.get("operation"); //For example it could be 'name_search' 
OperationProcessor processor = this.processors.get(operation); 
if (processor != null && processor.validate()) { //Such operation is registered, and it validated all parameters as appropriate 
    processor.process(); 
} else { 
    System.out.println("You are dumb"); 
} 

當然,這只是一個例子,你的項目將需要一些不同的方法,但我想它可能是類同我描述。

0

鉈;博士你真的不希望但任何一種方法

你基本上是指這裏什麼了超過10-15路徑是Cyclomatic complexity

圈複雜度是一種軟件度量(度量),用於 表示程序的複雜度。它是通過程序的源代碼 代碼的線性無關路徑的數量的一種定量度量。它由1976年的Thomas J. McCabe,Sr.開發。

因此,每個if語句都可能是一個新的路徑,儘管您的代碼會增加它的循環複雜性。有一些工具可以爲您度身定製,而高複雜度的高亮度區域可能會對您進行重構。

是否有一些標準來嵌入多少if語句?

是和否。人們普遍認爲(和McCabe自己爭辯),一個環複雜性超過10或15太高和一個跡象表明代碼應該被重構。

McCabe的原始應用之一是限制程序開發過程中 例程的複雜性;他建議程序員 應計算他們正在開發的模塊的複雜性,並且 將模塊拆分爲更小的模塊,只要模塊的環路複雜度爲 超過10個。[2]這種做法被NIST 結構化測試方法所採用,觀察到麥凱布的原始出版物 已經收到 大量可靠的證據,但在某些情況下它可能適合放寬限制和許可模塊其複雜度高達15。由於該方法承認存在超出商定限制的偶然原因,因此其 表述其建議如下:「對於每個模塊,要麼限制 圈複雜度爲[商定的限制],要麼提供書面的 說明「[7]

這不是一個真正的硬性規則,但在某些情況下可以忽略。看到這個問題What is the highest Cyclomatic Complexity of any function you maintain? And how would you go about refactoring it?

爲什麼?它是爲了便於閱讀還是爲了讓代碼更順暢地運行更多 ?

本質上這是爲了可讀性,這應該使您的代碼運行平穩。引用Martin Fowler

任何傻瓜都可以編寫計算機可以理解的代碼。好的 程序員編寫人類可以理解的代碼。