簡體   English   中英

去耦-OOP

[英]Decoupling - OOP

我有一個簡單的問題(使用Java)。 我有兩個類,一個代表一個文檔,第二個代表一個單詞。

Document類需要了解有關Word中保留的單詞的一些信息。 我的問題是,分離兩個類的最佳方法是什么? 我有兩個選擇:

  1. 這些類之間沒有連接,並且每次我在Document中調用一個方法時,都會向它傳遞Word的對象(因此,我有第三個類,它具有同時啟動Document和Word的main方法)。

  2. 在文檔中聲明Word的私有對象。

需要注意的一件事,我對於Word只有一個對象,對於文檔只有一個對象。 我不會為每個新文檔或單詞創建一個新對象。 我在文檔中存儲了整個文檔的列表,在Word中存儲了整個單詞的列表。

謝謝!

我不同意您對解耦的理解。 解耦不僅涉及哪些對象創建其他對象,還涉及哪些對象了解其他對象的行為,以及(至關重要)如果Word發生更改(您的示例)文檔中需要更改的內容。

但是,我也真的不明白這兩個短語的意思:

我只有一個對象用於Word,一個對象用於文檔。 我不會為每個新文檔或單詞創建一個新對象。 我將整個文檔的列表存儲在文檔中,並將整個單詞的列表存儲在Word中

從文檔開始。 此類對象可以做什么? 你好像是在說

class Document {

     private List<??OfWhat??> allDocuments;
}

如果Document類包含一個List,它的List是什么? 我認為您需要:

class Shelf {
      private List<Document> allDocuments;
}

class Document{
      private List<Word> wordInOneDocument;
}

class Word {
      private String wordContents;
}

現在,一個架子可以提供諸如getRecentDocumets()findDocumentsContaining(String text)之類的方法,而Document可以包含getWordCount()和insertParagraph(List,START); 等等。

為了進行更好的討論,我們需要更多地了解您的想法,更多地了解行為。

我確實同意您的一般想法,即文檔和Word之外還有其他內容。 可以合理調用諸如createDocument()和insertParagraph()之類的方法的東西

從我的角度來看...

public class Document{

  private List<Word> words = new ArrayList<Word>();

  public void setWord(ArrayList<Word> words){this.words = words;}
  public ArrayList<Word> getWord(return this.words;)
}

這是一個合理的方法。 在此示例中,您可以創建一個不帶任何Word's Document ,這將使一個空文檔有效。

您仍然可以按照您的建議創建第三類,但是,我看不到它的好處。

您的問題應該通過組成解決。 因此,擁有Word列表似乎是一種有效的方法。 通過分離文檔和單詞,您已經實現了所需的去耦。 我不了解將文檔和Word對象分離的確切含義。

你的問題是

分離兩個類的最佳方法是什么? 我有兩個選擇:

兩種選擇均不能滿足您的要求。 如果他們要一起工作,那么他們將被耦合在一起。 唯一的問題是聯軸器有多緊或松動。

您的兩種選擇聽起來都像是緊密耦合。 松散耦合的一種形式是存儲interface引用,並將其引入構造函數或setter方法中。

如果要解耦類,一種標准方法是使用接口:

public interface IWord {
...
}

public class Word implements IWord {
...
}

public class Document {
    public boolean append(IWord word) { ... }

    ...
}

這樣,Class和Word都依賴於IWord,但是class和Word都不依賴於另一個。 這就是所謂的依賴倒置。

首先,我認為您對課程的命名不正確。

我不會為每個新文檔或單詞創建一個新對象。 我在文檔中存儲了整個文檔的列表,在Word中存儲了整個單詞的列表。

從您在這里所說的話來看,您有這樣的事情:

public class Words {
    private List<Word> = new ArrayList<Word>;
    // getters+setters
}

public class Documents {
    private List<Document> = new ArrayList<Document>;
    // getters+setters
}

您想在文檔中使用Words類。 如果要這樣做,則意味着您不能將其解耦(因為這與“解耦”一詞的定義完全相反)。 我再次在這里猜測,但我想您想對其進行編碼,以便可以更改Documents類的實現,以便將來可以使用另一個類,例如BetterWords。

為此,我將創建一個抽象類或一個接口(取決於您的體系結構的其余部分),然后使Words類擴展或實現它。 然后,您可以執行以下操作:

public class Documents {
    private List<Document> = new ArrayList<Document>;

    private IWords wordsInterface = new Words(); //in case you want to make an interface
    private AbstractWords wordsAbstract = new Words(); //in case you want to make an abstract class

    // getters+setters
}

或者,您也可以將其放在Document類(單詞)中,而不真正知道它們的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM