2011-07-10 7 views
0

私は、ユーザーが自分の注釈を使用してデータ処理のワークフロー(検証、変換など)を記述できるツールに取り組んでいます。APIデザイン:1つの汎用インターフェースVS 3つの特殊インターフェース?

すぐに使えるアノテーションを使用する以外にも、ユーザーは独自の方法でアノテーションクラスを宣言し、注釈プロセッサを実装する必要があります(< - 実際この点の主な点です) 。

データ処理のために構成されたメソッドは、この1のようになります。

void foo(@Provide("dataId") @Validate(Validator.class) String str) {  
    doSmth(str); 
} 

は、注釈の三つのグループに自然があります:

  1. 初期値を生成するもので、
  2. 値(変換器)を変換するもの。
  3. 値を読み取り、何らかの作業(バリデータ、異なるコンシューマ)を実行するもの。いずれかのように見えることができ、注釈のすべてのこれらのタイプを処理するためのインターフェイスを作成するには、この1:

は、だから私は一品を作るために必要

interface GenericAnnotationProcessor {  
    Object processAnnotation(Annotation annotation, Object processedValue); 
} 

または私はAPIに3 intefacesを追加することができます。

interface ProducerAnnotationProcessor {  
    Object produceInitValue(Annotation annotation); 
} 

interface TransformerAnnotationProcessor {   
    Object transformValue(Annotation annotation, Object currentValue); 
} 

interface ConsumerAnnotationProcessor { 
    void consumeValue(Annotation annotation, Object currentValue); 
} 

第1のオプションはあまり明確ではありませんが、第3のオプションは3つのほぼ同じインターフェイスでAPIを汚染します。

何を(あなたはまずAPIユーザーとして)選ぶでしょうか?その理由は何ですか?

ありがとうございます!

答えて

0

最初のより一般的なインターフェイスを作成し、次に3つの異なる実装クラスを定義します。どのようにこれを使うのか分からなくても、私の最初の本能は、インターフェイスや基本クラス(異なるプロセッサ間で共通の実装コードがどれくらい共有されているかに応じて)を定義し、共通インターフェースを共有しているすべてのタイプ。

APIを使用する際、GenericAnnotationProcessorを実装する変数を宣言してから、必要に応じて適切な実装タイプを割り当てます。

オレゴン州ポートランドで早いですが、この時点で私の必要とされるカフェインレベルの50%で、これはケードの再使用を最大にしながら最大限の柔軟性を提供するように思えます。

もちろん、あなたの実際のリユエメントはそれ以外の場合を指示することがあります。 。 。

希望がありました。

0

あなたの問題に深く浸ってください。

類似のタスクを実行しているので、若干の違いがありますが、Strategy pattern #Exampleが役立ちます。

問題は次のようになります。

interface GenericAnnotationProcessor {  
    Object processAnnotation(Annotation annotation, Object processedValue); 
} 

interface ProducerAnnotationProcessor implements GenericAnnotationProcessor { 
} 

interface TransformerAnnotationProcessor implements GenericAnnotationProcessor { 
} 

interface ConsumerAnnotationProcessor implements GenericAnnotationProcessor { 
} 

今、あなたは私はあなたが理解できると信じウィキ

class Context { 

    // map of annotation processors 

    // register(add/remove) annotation processors to the map 

    public int executeAnnotationProcessor(Annotation annotation, Object processedValue) { 
     return locateAnnotationProcessor(annotation).processAnnotation(annotation, processedValue); 
    } 

    private GenericAnnotationProcessor locateAnnotationProcessor(Annotation annotation) { 
     // return expected annotation processor 
    } 
} 

からの例に従うことができます。

0

あなたはクラスと同様のインタフェースMore on there

の拡張インタフェースを使用することができ、あなたはのように、extendsキーワードを使用して、インターフェイスの継承階層を構築することができます、この例では

interface Washable { 
    void wash(); 
} 

interface Soakable extends Washable { 
    void soak(); 
} 

インタフェースは、 SoakableはインターフェースWashableを拡張します。したがって、SoakableはWashableのすべてのメンバーを継承します。 Soakableを実装するクラスは、Soakable、wash()およびsoak()で宣言または継承されたすべてのメソッド、またはabstractとして宣言されたすべてのメソッドのボディを提供する必要があります。インターフェイスのみが他のインターフェイスを「拡張」できることに注意してください。クラスはインタフェースを拡張することはできません。インタフェースを実装することしかできません。

希望します。

関連する問題