2012-04-23 14 views
0

ここにシナリオがあります。OO設計の支援が必要

public interface Processor{ 

    public void create(); 

    public void setDocuments(); 

    public abstract void prepareDocuments(); 

} 

public class ProcessorImpl implements Processor{ 

    public void create(){ 
     // Do something 
    } 

    public void setDocuments(){ 
     // Do something 
    } 

} 

public class ProcessorA implements ProcessorImpl{ 
    // this class will implement only once abstract 
    // method which is prepareDocuments() 

    public void prepareDocuments(){ 
     // prepare documents..and also 
     // set the Documents list which will be checked by create() 
     // method and then index will be created. 

    } 

} 


public class IndexGenerator{ 

    public static void main(String[] args){ 

     ProcessorA a = new ProcessorAImpl(); 
     a.create(); 
    } 
} 

簡単な背景....私は、インデックスを作成するインデックス、更新からドキュメントを削除し、インデックスに追加含まれ、すべてのLuceneインデックスに関連する活動を処理するための汎用的なフレームワークを開発しています。索引を処理するためのすべてのロジックは、文書の作成以外は同じです。各インデックスは異なるタイプのDocumentを持っていますので、prepareDocuments()メソッドを抽象的に保ち、各インデックスタイプに対して実装しています。

ここで、すべてのインデックスジェネレータクラスを、ProcessorAのような特定のインデックスプロセッサのインスタンスを作成してcreate()メソッドを呼び出すようにしたいとします。しかし、問題は、createDocumentsはsetDocuments()メソッドを呼び出すことによってドキュメントを設定していますが、create()メソッドは常にドキュメントリストが空/ nullであると判断することです。私は実際にOOの指導者の助けを求める必要があるいくつかの設計上の欠陥があることを知っています。

おかげ ゼラス

答えて

1

私はあなたの空/ヌルを取得し、なぜ我々はそれを推測することができ、そこから十分なコードがないため、知りません。しかし、あなたの問題のために、私はテンプレート法デザインパターンとなるだろう、ここでは例えばdecsribed:http://en.wikipedia.org/wiki/Template_method_pattern

私はthatsのもあなたがやろうとしているものと思います。

Btw。 implementsキーワードは、インターフェイスに対してのみ使用されます。あなたはここにextendsの代わりにそれを使用しよう:

public class ProcessorA implements ProcessorImpl 
0

あなたは(そのsetDocumentsに順番に問題がある可能性がありように聞こえるテンプレートに関する前の回答(私は完全に同意すること)、上で詳述すると)されます呼び出されています。 Template Method Patternのメリットの1つは、異なるメソッド(抽象的であってもなくても)が呼び出される順序を強制することです。

あなたはこのような基本クラスを再構築検討してください。

public interface Processor { 
    ... 
    // This method orchestrates doc preparation by ensuring the correct 
    // ordering of method invocation, and calls the derived class impl 
    // method doPrepareDocuments() 
    public void prepareDocuments() { 
     // do document creation stuff here by calling 
     // appropriate methods (abstract or not) 

     setDocuments(); 

     // implemented in derived classes to do specific document preparations 
     doPrepareDocuments(); 
    } 

    public abstract void doPrepareDocuments(); 
    ... 
} 

この方法で、すべての派生クラスの実装が取られるべき手順のすべてを覚えておく必要があり、そして、どのような順番で、代わりに焦点を当ててdoesntのそれが知っているもの。このアプローチは結束を高める。