3

あるフォームから別のフォームへの変換を実行する実装を作成しています。

私が現在直面している設計上の問題は、エンコーダーAPIとデコーダーAPIを1つのインターフェイスに配置するか、別々のインターフェイスに配置するかです。たとえば、ApacheMINAは個別のインターフェイスを使用します

私は現在このようなことをしています:

interface Convertor
{
    A encode( B b );

    B decode( A a );
}

それらを1つのインターフェースに配置する理由は、実装を一元化し、プロトコルの変更を1か所で修正できることです。これについて何か考えはありますか?

4

8 に答える 8

7

個別のインターフェースがあるからといって、実装を一元化できないわけではありません。たとえば、1つのクラスに両方のインターフェイスを実装させることができます。または、各クラスは、プロトコルを実装する共通のクラスを参照できます。

ですから、私がやろうとしているのは、別々のインターフェースを持ち、少なくとも最初は、1つのクラスに両方を実装させることです。したがって、実装は共有されますが、ユーザーコードは、エンコーダーとデコーダーを別個の独立した概念と見なします。

于 2009-01-24T13:43:02.717 に答える
3

唯一のことは、通常、デコーダーを使用する1つのコード部分と、エンコーダーを使用する別のコード部分があるということです。したがって、インターフェイスのエンコード部分を変更すると、デコード部分の不要な再コンパイルが強制され、その逆も同様です。

ヘッダーファイルインクルードを含むc/c++などに当てはまります。

堅実な原則を検索し、インターフェイス分離の原則を参照してください。

于 2009-01-24T10:45:30.267 に答える
1

ええと、2つの別々のインターフェースと、それらを組み合わせた別のインターフェースを持つことができます。これにより、両方に対して単一のパラメーターを宣言できるようになります。

private IEncoder encoder;
private IDecoder decoder;

public ThingWhichUsesEncodeAndDecode(IEncoder encoder, IDecoder decoder)
{
    this.encoder = encoder;
    this.decoder = decoder;
}

public ThingWhichUsesEncodeAndDecode(IEncoderDecoder both)
{
    this(both, both);
}

それは実際には、ある部分を使用することを想定しているが、他の部分は使用しないことを想定している頻度に依存します。ほとんどの場合、エンコード/デコードには両方の部分が必要であることがわかっているので、おそらく両方のメソッドで1つのインターフェイスを宣言するだけですが、正確な状況によって異なります。

于 2009-01-24T11:05:15.747 に答える
1

それらを同じインターフェースに持つことの欠点は、実装が単一のクラスでエンコーダーとデコーダーの両方になることを強制することです。これは現時点では妥当に思えるかもしれませんが、常にそうであるとは限りません。それで、これが要件であるべきか/望ましいかどうか自問しますか?

于 2009-01-24T11:55:27.380 に答える
1

それらを別々にすると、はるかに柔軟になります。別々のインターフェイスを作成する場合は、エンコードデコードの両方の機能が必要なときにいつでも使用できる 3 番目のインターフェイスにいつでも組み合わせることができます。

逆は当てはまりません。最初から 1 つのインターフェイスを作成すると、エンコードまたはデコード関数のみを含めることを選択する柔軟性が失われます。

于 2009-01-25T02:20:40.267 に答える
0

通常はそれらを一緒に使用しますが、そうでない場合もあります。それはあなたにとってより自然なものに依存します。ところで:それらを別々に定義する場合でも、それらを一緒に使用することができます。

interface Converter extends Decoder, Encoder { }
于 2009-01-24T11:18:21.400 に答える
0

個別のエンコーダー/デコーダー インターフェイスを持たないことを検討してください。

interface Encodable
{
    Decodable encode();
}
interface Decodable
{
    Encodable decode();
}
class A implements Encodable;
class B implements Decodable;
于 2009-01-24T11:23:46.350 に答える
-1

アプリケーションによって異なります。

通常、同じバイナリにエンコーダーとデコーダーがある場合は、1 つのインターフェイスで問題ありません。それらが通常別々である場合 (たとえば、キャプチャ アプリケーションのみのエンコード、管理アプリケーションのみのデコード) は、別のインターフェイスを使用します。

于 2009-01-24T11:27:06.687 に答える