2010-02-08 31 views
3

所以我不打算在這裏維護或優雅..尋找一種方法來減少總體令牌的方法只是爲了好玩。該方法由一個長嵌套的if-else構造組成,我發現(我認爲)使用最少的令牌來實現它的方式是三元運算符。然而java ternary hack

String method(param) { 

    return 

     param == null ? 
      error0 : 

     param.equals(foo1) ? 
      condition ? 
       bar1 : 
       error1 : 

     param.equals(foo2) ? 
      condition ? 
       bar2 : 
       error2 : 

     ... 

     error 

    } 

,有一對夫婦的情況下,除了返回值我也想改變一個字段或調用方法;:從本質上講,我翻譯一下:

String method(param) { 

    if (param == null) 
     return error0; 

    else if (param.equals(foo1)) 
     if (condition) 
      return bar1; 
     else 
      return error1; 

    else if (param.equals(foo2)) 
     if (condition) 
      return bar2; 
     else 
      return error1; 

    ... 


    else 
     return error; 

} 

本例如,

else if (param.equals(foo3)) 
     if (condition) { 
      field = value; 
      return bar3; 
     } 
     else 
      return error3; 

什麼是做這個令牌明智最便宜的方式?我現在正在做的是醜陋的,但不會浪費太多令牌(這裏的字段是一個字符串):

 param.equals(foo3) && (field = value) instanceOf String ? 
      condition ? 
       bar2 : 
       error2 : 

再次強調,重點是不好的編碼,我只是在尋找黑客減少令牌計數。如果有更簡單的方法來寫出整個事物,我也願意。感謝您的任何建議。

編輯:每個單詞和標點符號都計爲一個令牌。因此,例如,「instanceOf String」是兩個令牌,但「!= null」是三個。我可以看到的可能改進的主要內容是「& &」和括號。有沒有一種方法可以將「field = value」置於條件之外的某個位置,如果沒有,那麼是否存在一個使「field = value」成爲布爾值而不需要括號的構造?

+19

你應該被解僱......出大炮和太陽。 – Kevin 2010-02-08 18:33:28

+3

三元運算符很好,但代碼可維護性應該具有更高的優先級。我覺得無論誰要維護你的代碼......即使是你。如果你離開這個,甚至一個月後回來,你會後悔用三元表達式編碼。 – 2010-02-08 18:35:46

+0

我是否正確地認爲有時調用你的驗證也會改變狀態? – blank 2010-02-08 18:40:06

回答

2
(field = value) instanceof String 

假設它已經滿足您的需求(並因此包括返回false時valuenull),較短的替代方案便被

(field = value) != null 

或者如果你真的忽略了這一點,希望使null回報true爲好,然後用

(field = value) == value 

這可以使米如果使用1個字母的變量名稱,則縮短。

而且我沒有看到其他的方式,我與我們大多數人都認爲這一切是有點討厭;)

+0

實際上有一個程序會對我們的作品進行評分,並將每個字符串和每個標點符號記爲一個標記。所以「instanceOf String」是兩個標記,「!= null」是三個。如果有一個構造不需要括號「field = value」 – daltonb 2010-02-08 19:28:24

+0

我會不同意這個「!=」計數爲2。它在技術上** **一個**操作員。 – BalusC 2010-02-08 23:22:04

+0

嗯,我剛剛檢查和程序實際上確實計數!=作爲一個 – daltonb 2010-02-09 04:35:36

2

if param is null,return 0
然後在參數上做一個case/switch/select語句。那是乾淨

+1

我不認爲他*希望*「乾淨」(不幸的是對於未來的維護開發者)。 – FrustratedWithFormsDesigner 2010-02-08 18:39:18

+0

而令牌便宜。 – Romain 2010-02-08 18:40:07

+2

您無法打開字符串。 – mtpettyp 2010-02-08 18:41:26