2010-08-17 2 views
0

У меня есть простой вопрос (работа с Java). У меня есть два класса: один представляет собой Документ, второй представляет Слово.Развязка - OOP

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

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

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

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

Спасибо!

+1

В вашем документе есть только одно слово? – Surya

+0

нет, у него может быть много слов. – user247866

+0

, тогда имеет смысл иметь объекты ArrayList Word в вашем документе. – codersarepeople

ответ

4

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

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

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

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

class Document { 

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

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

class Shelf { 
     private List<Document> allDocuments; 
} 

class Document{ 
     private List<Word> wordInOneDocument; 
} 

class Word { 
     private String wordContents; 
} 

Теперь Полка может предложить такие методы, как getRecentDocumets() findDocumentsContaining (String текст) и документ может содержать getWordCount() и insertParagraph (List, START); и так далее.

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

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

+0

Мне нравится этот ответ. Благодаря! – user247866

1

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

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

Спасибо за ответ. В этой реализации мне понадобится создать новый объект Document для каждого нового документа. Внутри документа У меня уже есть список документов (так что, возможно, я должен назвать его «Документы вместо» (и «Слова»)). Слово довольно тяжелый класс. Поэтому единственное, что я хочу сохранить в документе (документах), - это индексы слов. Думаю, мне нужно перефразировать мой вопрос ... не очень хорошо. – user247866

+0

Вы должны пересмотреть свой дизайн. Документом должен быть документ, а не все документы. Если у вас есть класс Документы, он должен содержать несколько объектов Document, каждый из которых будет содержать объекты Word. – Falmarri

0

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

0

Ваш вопрос

что лучший способ Отделить двух классов? У меня есть 2 варианта:

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

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

0

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

public interface IWord { 
... 
} 

public class Word implements IWord { 
... 
} 

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

    ... 
} 

Этот путь как класс и Слово зависит от IWord, но ни класс, ни слова зависит от другого. Это называется инверсией зависимостей.

0

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

Я не создаю новый объект для каждого нового документа или слова.Я храню список всех документов в документе и список pf всех слов в 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.

Для этого я создам абстрактный класс или интерфейс (в зависимости от остальной части вашей архитектуры), а затем сделайте класс слов или продолжите его или реализуйте. Затем вы можете сделать что-то вроде этого:

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 
} 

Или вы можете поместить его в классе документа (слова), на самом деле не знает, где вы хотите их.

+0

Да, это то, что я на самом деле имел в виду. Благодаря! – user247866

Смежные вопросы