[英]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.