問題
私は、オブジェクトのクラスが利用可能な操作の合計プールからいくつかの操作を実装することができるアプリケーションを作成しようとしています。最終目標は、任意のコードの重複を持たないために、可能な限りOOPの法律を遵守することです。
より詳細には、私は、Luceneのを使用して検索エンジンを作るしようとしています。Luceneには、
多くのインデックスを使用しています。私はすでに別のインデックス、オブジェクトが親クラスのメソッドを継承するシンプルな構造を実装しました。問題は、その親クラスで実装されているものの方法、それが自動的に使用するすべてのサブクラスのために利用可能になる、ということです。私は彼がフレーズ検索、用語検索または任意の他のために利用可能であるやりたいかどうかを判断するために、ユーザーに選択肢を与えたいという特定のインデックスを。キャッチは、いくつかの指標は、例えば、フレーズ検索を行うためのオプションを持つべきではない、です。
まず思考
私は近くに何かの実装を考えてきましたコンポジット、パターンを
GoFのことで説明したように。私はいくつかの実装基本操作などの検索操作(例えば用語検索、フレーズ検索)実装してコンポーネントクラスを、後に上でこれらのプリミティブオブジェクトを追加した複合オブジェクト。複合オブジェクトは、同じ実装するコンポーネントプリミティブとしてクラス。
public abstract class Index {
public Index(String indexPath) {
// Constructor using the information provided by the subclass
}
public void phraseSearch(...) {
// Do the operation
}
public void termSearch(...) {
// Do the operation
}
public void categorySearch(...) {
// Do the operation
}
}
public class ReviewIndex extends Index {
public ReviewIndex() {
super("./review_index/");
}
}
public class TipIndex extends Index {
public TipIndex() {
super("./tip_index/");
}
}
期待される成果
クラスはReviewIndex
categorySearchを実行することはできますがあってはならない
phraseSearchとtermSearchを実行することができます。それぞれ、TipIndex
クラスは
親クラスのメソッドのいくつかを実行することができるはずです。
最終的な考え
私は私の溶液中で何のコードの重複がないことを知っているが、新しいインデックスオブジェクトが作成されるたびに生成されて無用の方法があります。事前にあなたのすべてをありがとう!
PSあなたが考える場合はコンポジットパターンが移動するための方法で、どのようにあなたが実際に複合クラスにプリミティブオブジェクトを追加することになり、いつ必要にどのようにあなたがそれらを呼び出すでしょうか?
スーパークラスで定義されたすべてのメソッドは、派生クラスで利用可能ですが、Java 8であなたはインターフェイスでは、デフォルト・メソッドを使用して、このような何かを得ることができるかもしれません。だからではなく、すべての可能な方法を含む1つの抽象クラスで、あなたは、4つのインターフェイスを実装するかもしれません
public interface Searchable {
public String getIndexPath();
}
public interface PhraseSearchable extends Searchable {
public default void phraseSearch() {
String indexPath = getIndexPath();
// do the search
}
}
public interface TermSearchable extends Searchable {
public default void termSearch() {
String indexPath = getIndexPath();
// do the search
}
}
public interface CategorySearchable extends Searchable {
public default void categorySearch() {
String indexPath = getIndexPath();
// do the search
}
}
あなたは抽象クラスを作成することができ、重複コードを避けるために、
public abstract class AbstractSearchable implements Searchable {
private String indexPath;
public AbstractSearchable(String indexPath) {
this.indexPath = indexPath;
}
// other methods that might be useful
}
あなたの実際のクラスは、対応するインタフェースを実装することができます
public class ReviewIndex extends AbstractSearchable implements CategorySearchable {
public ReviewIndex() {
super("./review_index/");
}
}
public class TipIndex extends AbstractSearchable implements PhraseSearchable, TermSearchable {
public ReviewIndex() {
super("./review_index/");
}
}
これが可能である場合、検索方法の実際の実装に大きく依存しています。これらのメソッドは(クラスの静的メンバを使用せずに、静的メソッドのように)自分自身のために実行することができなければならないので、インターフェース等、任意のメンバーを含めることはできません。あなたはに複数のメソッドを追加することで、この問題を克服するかもしれないSearchable
データを提供するインターフェースと抽象クラスで実装を行いますが、インタフェースで宣言されたすべてのメソッドが公開されているので、それは国民に内蔵のものを公開する可能性があります。