繁体   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