2014-11-25 36 views
1

我想知道在外部類中調用外部類的方法,然後使用內部類的方法是否被認爲是不好的做法。內部類使用外部類的方法。那是循環引用嗎?如何避免

在這種情況下: 在BidParser我調用該方法updateMaps(),屬於外部類。 此外,我打電話BidParser第二個內部類的方法InputSanityChecker

這是不好的做法和反模式嗎?我在這裏創建一個上帝對象嗎?(在其他外部類中有更多的功能)

編輯:我有兩個變量Var1,Var2(比方說)屬於Outer,和checkX方法。

public class Outer{ 


    public static void main(String[] args){ 
     if(args.length == 1){ 
      File file = new File(args[0]); 
      BidParser.parseBids(file);//<--- Question refers here 
     }else{ 
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
      BidParser.parseBids(br); //<--- and here 
     } 
    } 


    private static void updateMaps(String[] elements){ 
     //.....blah blah 
    } 

    static class BidParser{ 
     public static void parseBids(File file){ 
      //.....blah blah 
      InputSanityChecker.checkInput(elems);//<---second inner class method 
      InputSanityChecker.checkMaps(elems); //<---second inner class method 
      updateMaps(elems); //<-----outer class method 

     } 
     public static void parseBids(Reader reader){ 
      //.....blah blah 
      InputSanityChecker.checkInput(elems);//<---second inner class method 
      InputSanityChecker.checkMaps(elems); //<---second inner class method 
      updateMaps(elems); //<-----outer class method 

     } 
     } 
    static class InputSanityChecker{ 

     public static boolean checkInput(String[] elements){ 
       //.....blah blah 
     } 

     public static boolean checkMaps(String[] elements){ 
       //.....blah blah 
     } 
    } 
} 
+3

你沒有使用* inner * classes;你只是使用* member *類。那是因爲你將這些類聲明爲「靜態」。 *內部*類或不'靜態';他們是內部類,因爲他們有一個鏈接到他們創建的外部類的實例。 – 2014-11-25 05:17:57

+0

其次,您對來自BidParser的'checkInput(elems);'的調用無效(將導致編譯器錯誤)。它需要'InputSanityChecker.checkInput(elems);' – 2014-11-25 05:19:01

+0

@ErwinBolwidt不用擔心錯誤。我從實際的代碼中抽象出很多,所以我們可以看到結構。但你是對的我會改變它的清晰 – MayTheSchwartzBeWithYou 2014-11-25 05:23:24

回答

4

它不是循環引用。所有類 - 外部和嵌套靜態 - 都是編譯器同樣獨立的。當你調用靜態方法時,沒有實例引用。

此設計違反了單一職責原則BidParser應該負責解析出價,就這些了。即這個班級應該接受輸入 - 甚至不是File,只是Reader, - 併產生一些Bids對象,它應該返回給調用者。

然後它是來電者的責任1)以任何Reader的形式準備輸入以及2)採取製作Bids對象並對它做某事。讀者可以的FileReader,BufferedReader類,StringReader等的實例...查看Java IO Documentation

而且,這樣的設計違反了不要重複自己原則。您可以在BidParser中看到重複的代碼。一旦您設計類只能使用更多抽象輸入,此違規行爲纔會自動修復。

考慮到InputChecker,如果每個元素都被其他人檢查過,那麼這個類一次只負責檢查一個可檢查的塊(元素)。解析器應該負責迭代元素,並根據需要調用InputChecker

如果外部類中有一些變量需要解析和檢查出價,那麼應該將它們作爲參數傳遞。如果失敗的檢查不能防止解析,那麼你最好將檢查器從解析器中分離出來。所以它看起來像:

try{ 
    Bids bids = BidParser.parse(bidsInput); 
    BidChecker.check(bids, var1); 
    Maps.update(bids, var2); 
} catch (...){ 
} 

要概括:這樣的設計是壞的,因爲它注入到BidParser知識階層對客戶的內部,即應避免,因爲它是不可測試和導線緊耦合可維護性差。除了通過參數傳遞之外,你的班級不應該知道任何關於它的客戶端。 (這在這個簡短的例子中是過度的)控制反轉的概念(以及依賴注入)更加追求鬆耦合,併產生更多的可測試和乾淨的設計。

考慮SOLID principles of Object-Oriented Design。另外維基百科有關Don't Repeat Yourself的文章鏈接到另一個有用的原理,它介紹了某種編程哲學。

+0

謝謝你的迴應 – MayTheSchwartzBeWithYou 2014-11-25 07:35:04

相關問題