0

簡単な質問があります(Javaでの作業)。2つのクラスがあります。1つはドキュメントを表し、もう1つは単語を表します。

Documentクラスは、Wordに保持されている単語に関する情報を知っている必要があります。私の質問は、2つのクラスを分離するための最良の方法は何ですか?私は2つのオプションを念頭に置いています:

  1. クラス間には接続がなく、Documentでメソッドを呼び出すたびに、Wordのオブジェクトを渡します(したがって、DocumentとWordの両方を開始するメインメソッドを持つ3番目のクラスがあります)。

  2. Document内でWordのプライベートオブジェクトを宣言します。

注意すべき点の1つは、Word用とDocument用のオブジェクトが1つしかないことです。新しいドキュメントや単語ごとに新しいオブジェクトを作成するわけではありません。ドキュメント全体のリストをDocumentに保存し、単語全体のリストをWordに保存します。

ありがとう!

4

6 に答える 6

4

デカップリングについてのあなたの理解に同意しません。デカップリングは、どのオブジェクトが他のオブジェクトを作成するかだけでなく、どのオブジェクトが他のオブジェクトの動作を認識し、(重要な)Wordが変更された場合に(例の)ドキュメントで何を変更する必要があるかについても重要です。

しかし、私はこれらの2つのフレーズが何を意味するのか本当に理解していません。

Word用とDocument用のオブジェクトが1つだけあります。新しいドキュメントや単語ごとに新しいオブジェクトを作成するわけではありません。ドキュメント全体のリストを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;
}

これで、ShelfはgetRecentDocumets()findDocumentsContaining(String text)などのメソッドを提供でき、DocumentにはgetWordCount()とinsertParagraph(List、START);を含めることができます。等々。

より良い議論をするために、私たちはあなたが考えていたものをもう少し、行動についてもう少し見る必要があります。

私は、文書と言葉以外のものがそこにあるというあなたの一般的な考えに同意します。createDocument()やinsertParagraph()などのメソッドを合理的に呼び出すことができるもの

于 2010-08-17T20:14:05.773 に答える
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で作成できます。これにより、有効な空のドキュメントが作成されます。

あなたが提案するように、あなたはまだ3番目のクラスを作成することができます、しかし、私はそれによる利益を見ません。

于 2010-08-17T19:52:27.420 に答える
0

まず第一に、クラスの名前が間違っていると思います。

新しいドキュメントや単語ごとに新しいオブジェクトを作成するわけではありません。ドキュメント全体のリストを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でWordsクラスを使用したいとします。あなたがそれをしたいのなら、それはあなたがそれを切り離すことはできないことを意味します(それは「切り離す」という言葉の定義そのものに反しているからです)。ここでも推測しますが、将来的にはBetterWordsなどの別のクラスを使用できるように、Documentsクラスの実装を変更できるようにコーディングする必要があると思います。

そのためには、抽象クラスまたはインターフェース(アーキテクチャーの残りの部分に応じて)を作成し、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クラス(単語)に入れることができますが、どこに配置するかは本当にわかりません。

于 2010-08-17T20:12:41.727 に答える
0

あなたの問題は作曲によって解決されるべきです。したがって、のリストを持つWordことは有効なアプローチのようです。ドキュメントと単語を分離することで、必要なデカップリングをすでに達成しています。DocumentオブジェクトとWordオブジェクトを分離する正確なポイントはわかりません。

于 2010-08-17T19:59:39.097 に答える
0

あなたの質問は

2つのクラスを分離するための最良の方法は何ですか?私は2つのオプションを念頭に置いています:

どちらのオプションもあなたの要求を満たしません。それらが一緒に機能する場合、それらは結合されます。唯一のことは、カップリングがどれだけきつくまたは緩んでいるかです。

どちらのオプションも密結合のように聞こえます。より緩い結合の形式は、参照を格納し、interfaceそれをコンストラクターまたはセッターメソッドに取り込むことです。

于 2010-08-17T20:04:43.067 に答える
0

クラスを分離したい場合、1つの標準的な方法はインターフェースを使用することです。

public interface IWord {
...
}

public class Word implements IWord {
...
}

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

    ...
}

このように、ClassとWordはどちらもIWordに依存しますが、classもWordも他方に依存しません。これは依存性逆転として知られています。

于 2010-08-17T20:07:44.450 に答える