Развязка - ООП - PullRequest
       12

Развязка - ООП

0 голосов
/ 17 августа 2010

У меня простой вопрос (работа с Java).У меня есть два класса, один представляет Документ, второй представляет Word.

Класс Document должен знать некоторую информацию о словах, хранящихся в Word.Мой вопрос: как лучше всего разделить два класса?Я имею в виду 2 варианта:

  1. Нет связи между классами, и каждый раз, когда я вызываю метод в Document, я передаю ему объект Word (поэтому у меня третий классс основным методом, который инициирует как Document, так и Word).

  2. Объявление частного объекта Word внутри Document.

Заметьте, у меня есть только один объект для Word и один для Document.Я не создаю новый объект для каждого нового документа или слова.Я храню список всех документов в документе и список всех слов в Word.

Спасибо!

Ответы [ 6 ]

4 голосов
/ 18 августа 2010

Я не согласен с вашим пониманием развязки.Разделение не только о том, какие объекты создают другие объекты, но и о том, какие объекты знают о поведении других объектов и (что крайне важно), что необходимо изменить в (вашем примере) документе, если Word изменяется.

Однако, такжеЯ действительно не понимаю, что вы подразумеваете под этими двумя фразами:

У меня есть только один объект для Word и один для Document.Я не создаю новый объект для каждого нового документа или слова.Я храню список всех документов в документе и список всех слов в Word

Начать с документа.Что могут делать объекты этого класса?Вы, кажется, говорите, что

class Document {

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

Если класс Document содержит список, что это за список?Я думаю, что вам нужно:

class Shelf {
      private List<Document> allDocuments;
}

class Document{
      private List<Word> wordInOneDocument;
}

class Word {
      private String wordContents;
}

Теперь полка может предлагать такие методы, как getRecentDocumets () findDocumentsContained (String text) и Document может содержать getWordCount () и insertParagraph (List, START);и т. д.

Для лучшего обсуждения нам нужно увидеть немного больше того, что вы имели в виду, немного больше о поведении.

Я согласен с вашей общей мыслью, чтоЧто-то кроме Документа и Word там.Что-то, что может разумно вызвать методы, такие как createDocument () и insertParagraph ()

1 голос
/ 17 августа 2010

С моей точки зрения ...

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;)
}

Это разумный подход. В этом примере вы можете создать Document без каких-либо Word's, что делает пустой документ действительным.

Вы все равно можете создать третий класс, как вы предлагаете, однако я не вижу в этом пользы.

0 голосов
/ 18 августа 2010

Ну, во-первых, я думаю, что вы неправильно называете свои классы.

Я не создаю новый объект для каждого нового документа или слова.Я храню список всех документов в Document и список всех слов в Word.

Судя по тому, что вы здесь сказали, у вас есть что-то вроде этого:

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

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

И вы хотите использовать класс Слова в Документах.Если вы хотите это сделать, это означает, что вы не можете отделить его (поскольку это противоречит самому определению слова «отделить»).Я предполагаю здесь снова, но я думаю, что вы хотите закодировать его, чтобы вы могли изменить реализацию класса 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 (слова), даже не зная, где вы их хотите.

0 голосов
/ 18 августа 2010

Если вы хотите разделить классы, одним из стандартных способов является использование интерфейса:

public interface IWord {
...
}

public class Word implements IWord {
...
}

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

    ...
}

Таким образом, класс и Word зависят от IWord, но ни класс, ни Word не зависят от другого. Это известно как инверсия зависимости.

0 голосов
/ 18 августа 2010

Ваш вопрос:

Каков наилучший способ развязать два класса?Я имею в виду 2 варианта:

Ни один из вариантов не удовлетворит ваш запрос.Если они собираются работать вместе, то они будут связаны.Единственное, насколько плотная или слабая муфта.

Оба ваших варианта звучат как жесткая муфта.Форма более слабой связи будет заключаться в хранении ссылки interface и приеме ее в методе конструктора или установщика.

0 голосов
/ 17 августа 2010

Ваша проблема должна решаться по композиции.Таким образом, наличие списка Word представляется верным подходом.Разделяя Документы и Слова, вы уже добились требуемого разъединения.Я не понимаю вашу точную точку разъединения объектов Document и Word.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...