[英]Decoupling - OOP
我有一個簡單的問題(使用Java)。 我有兩個類,一個代表一個文檔,第二個代表一個單詞。
Document類需要了解有關Word中保留的單詞的一些信息。 我的問題是,分離兩個類的最佳方法是什么? 我有兩個選擇:
這些類之間沒有連接,並且每次我在Document中調用一個方法時,都會向它傳遞Word的對象(因此,我有第三個類,它具有同時啟動Document和Word的main方法)。
在文檔中聲明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.