2013-10-17 25 views
2

避免使用大型單片方法被認爲是一種好的做法。我個人喜歡識別所有代碼,這些代碼具有獨特的,明確的目的,並將它們重構爲一種方法。這樣,代碼更像是一本書。在Java中將「main」方法和它們的「helper」方法組合在一起

這種方法的一個顯而易見的問題是,我的班最終有大量的方法超出了他們預期的範圍,這是我非常不希望的。

有一些方法可以在Java中創建嵌套函數,但由於該功能不直接受該語言支持,所以對於我來說,生成的代碼通常非常難看 - 非常難看。

也可以使用嵌套類。我不喜歡這個解決方案的是,它有點笨拙 - 是什麼? - 當「分組在一起」中的一些涉及的方法是重寫的方法。

含糊不清的問題,但無論如何,我想知道人們如何去做這件事。

編輯:我的意思舉例:

public class ClassWithTwoMainMethods { 

    private int var1; 
    private int var2; 

    public void doSomething(int a) { 
     if (conditionToCheck(a)) { 
      doSomethingSpecific(); 
     } 
    } 

    private void doSomethingSpecific() { 
     ... 
    } 

    private boolean conditionToCheck(int a) { 
     ... 
    } 

    public void doSomethingElse(int a, int b) { 
     doSomethingElseHelper1(a+b); 
     doSomethingElseHelper2(); 
     doSomethingElseHelper3(); 
    } 

    private void doSomethingElseHelper1(int arg) { 
     ... 
    } 

    private void doSomethingElseHelper2() { 
     ... 
    } 

    private void doSomethingElseHelper3() { 
     ... 
    } 

} 

乍一看,這不是顯而易見的是,上述類有一個「主」方法,不應該被其他地方使用的兩個「幫手」 ,另一個「主」方法與三名助手。

+0

你應該更具體一點,我現在可以給你寫10頁左右的良好面向對象方法:)。 – libik

+0

爲什麼公共/私人範圍不夠? –

+0

因爲無法知道conditionToCheck()是doSomething()的helper還是doSomethingElse(),因爲它可以被兩者調用。人們可以使用命名約定,但這非常「C-ish」......最佳地,輔助方法應該只能從他們的「主」中調用。 – deinocheirus

回答

1

我爲此使用「工人對象」。工作者對象僅存在於方法內部,有助於實現目標。一個典型的例子是String,只是這個工人非常有用,以至於方法經常返回它。

所以我要做的就是在一個工人對象I組的方法,在一個公共的API方法來創建它(即東西應該被使用和記錄的公共API中),讓它做的事情:

public void doSomethingElse(int a, int b) { 
    new Worker(a, b).run(); 
} 

這種方法有一定的好處:

  1. 您可以在隔離測試這些工人。
  2. 它將代碼放在一起保存在一起
  3. 它有助於避免混淆類的名稱空間。不過,它確實有點污染了全局命名空間。
  4. 它允許您重用不同班級的工人。
  5. 我可以減輕對工人領域的限制。對於主類,我更喜歡不改變的字段。在工人中,領域通常更像局部變量。這樣,我可以減少方法參數的數量,但我需要編寫更多的單元測試。
+0

此外,你可以創建這些'工人'作爲私人靜態類或包私人,並避免全球名稱空間污染然後(失去了重用的可能性,雖然)。 – siledh

+0

@siledh:你可以將它們封裝爲私有的,至少允許測試訪問它們。或者你可以將它們標記爲'protected'以允許通過繼承進行訪問。 –

相關問題