2015-12-18 64 views
1

這可能是一種常見現象,可能是一個愚蠢的問題,但我真的很想知道別人是如何處理這個問題的。簡化if(做一些操作),然後返回

說我有:

private void actionPerformed(ActionEvent evt){ 
    String text = textfield.getText(); 
    if(isValid(text)){ 
     // do something eg: 
     list.add(text); 
    } 
} 

private boolean isValid(String text){ 
    if(text.isEmpty()){ 
     displayErrorMessage("empty string!"); 
     return false; 
    } 
    if(hasInvalidChars(text)){ 
     displayErrorMessage("Invalid chars"); 
     return false; 
    } 
    .... 
    return true; 
} 

和isValid(String)方法感覺怪怪的,我覺得一個方法應該只做一個簡單的事情,但isValid()的肯定違反了它,它會顯示一個錯誤信息,然後返回一個布爾值。

這樣好嗎?還是有其他方法來解決它?

另一個沒有那麼優雅的解決方法,我能想到的是執行一個標誌。即:

private void actionPerformed(ActionEvent evt){ 
     String text = textfield.getText(); 
     verify(text); 

     if(!errorIsDisplayed){ 
      list.add(text); 
     } 
} 

private boolean verify(String text){ 
    if(text.isEmpty()){ 
     displayErrorMessage("empty string!"); 
     errorIsDisplayed = true; 
    } 
    if(hasInvalidChars(text)){ 
     displayErrorMessage("Invalid chars"); 
     errorIsDisplayed = true; 
    } 
    .... 
    errorIsDisplayed = false; 
} 

我希望你可以清楚地看到,我正在試圖解決這個問題,我覺得這是我失蹤,可能是由於睡眠不足和天氣,我不要一個簡單的解決方案不知道。其他人如何實施這個?

+0

不是在方法內部顯示消息,而是可以根據isValid返回的內容在外部顯示它們,但是這樣就無法區分兩種情況。除了感覺奇怪之外,你現在擁有的東西還有問題嗎? – MC10

+0

是的,這是我當前的行動點,在actionPerformed()本身內移動isValid()的實現。我只是覺得像actionPerformed()會混亂。我認爲有一個像isValid()這樣的方法會以某種方式讓更多的代碼可讀,同時顯示意圖。 – yev

回答

1

如果你喜歡,
可以定義錯誤類型和方法isValid只返回類型的enum

enum Type{ 
    VALID("Valid"), 
    EMPTY("Empty String"), 
    // other types. 

    public final String message; 
} 

對於某一文本字符串,可以定義一個方法getType得到其相應的類型。

Type getType(String text){...}

那麼,如果這個消息是有效的isValid方法應該只檢查。

boolean isValid(Type type){ 
    return type == Type.VALID; 
} 

而且在actionPerformed你可以根據文本字符串的類型採取行動。

actionPerformed(...){ 
    String text = ... 
    Type type = getType(text); 
    if (isValid(type)){ 
     //Actions for valid text 
    } else { 
     //Actions for invalid text 
     System.out.println(type.message); 
    } 
} 
+0

這是一個很好的觀點,但我不認爲它會迎合我的具體問題。我想在一個單獨的塊中移動所有無效的操作,這樣我就可以在一個很好的簡單塊上處理有效的操作,遠離殘疾人的邏輯。 – yev

+0

如果我將採取類型isValid()的枚舉,那麼它與真正的完全不同,如果其他的invalids在actionPerformed()內部,那麼最終的else子句將用於有效的語句,就像那樣。另一個不太好的解決方案是引入一個標誌,一個標誌與顯示消息一起切換,那麼就不需要獲得isValid()的返回值,只需檢查標誌是否設置。 – yev

+0

不同意。你可以從另一個方法獲得這個消息的類型,比如'getType(arg:String):Type'並將'isValid(arg:String)'改變爲'isValid(arg:Type):boolean',這個'isValid'會只檢查這條信息是否有效。如果沒有,您可以打印該消息。從邏輯上講,我認爲你不能省略所有的if語句。我認爲這個解決方案比原來的解決方案更可讀。順便說一句,感謝您的反饋。 :) – VicX

0

如果你真的想,在List<String> unacceptableReasons一個參數傳遞給isValid()並添加錯誤信息給它。並繼續返回布爾值。 actionPerformed()可以承擔顯示消息的責任。

errorIsDisplayed字段解決方案很難理解和彌補可讀性較差的代碼IMO。

+0

是的,我同意你所說的一切,國旗不是解決方案,我只是在那裏說明問題,或者進一步說明我的問題。我也想避免這一切,你有什麼建議? – yev

+0

查看我答案的第一段。 – JnRouvignac

相關問題