0

パーサーを作っているとしましょう。1 つの実装は次のようになります。

public sealed class Parser1
{
    public string Parse(string text)
    {
       ...
    }
}

または、代わりにテキストをコンストラクターに渡すこともできます。

public sealed class Parser2
{
    public Parser2(string text)
    {
       this.text = text;
    }

    public string Parse()
    {
       ...
    }
}

どちらの場合も使い方は簡単ですが、他と比べて にパラメータ入力を有効にするというのはどういうことでしょうか? Parser1仲間のプログラマーが API を見たとき、私はどのようなメッセージを送りましたか? また、特定の場合に技術的な利点/欠点はありますか?

2 番目の実装ではインターフェイスがまったく無意味であることに気付いたときに、別の質問が発生します。

public interface IParser
{
    string Parse();
}

...最初のインターフェイスのインターフェイスは、少なくとも何らかの目的を果たすことができます。それは、クラスが「インターフェース可能」であるかどうか、特に何かを意味しますか?

4

2 に答える 2

2

どちらの場合も使い方は簡単ですが、Parser1 にパラメーター入力を有効にすることは、他の場合と比べてどのような意味を持つのでしょうか。

コンストラクターでパラメーターを指定すると、そのパラメーターがクラス全体で使用されることを意味します。セッター メソッドでパラメーターを指定する場合、クラスのインスタンスを作成する時点ではパラメーターの値がわからない可能性があることを暗示しています。

セッターメソッドが必要な実際の例を次に示します。

public class A {
    private B b;
}

public class B {
    private A a;
}

クラス A と B に適切なゲッターとセッターがすべてあるとします。コンストラクターは、両方のクラスの空のコンストラクターです。

両方のクラスを初期化するには、次のようなコードを記述する必要があります。

A a = new A();
B b = new B();
a.setB(b);
b.setA(a);

それは、クラスが「インターフェース可能」であるかどうか、特に何かを意味しますか?

一般に、インターフェイスの要件を満たす具象クラスが複数存在する可能性がある場合は、インターフェイスを記述します。

例として、Java では、Listインターフェースは および によって実装されArrayListますLinkedList

インターフェースを作成するもう 1 つの理由は、具体的なクラスが 1 つしか作成されない場合でも、具体的なクラスが実装する必要があるメソッドを確立したいということです。

基本クラスを定義するには、抽象クラスの方が適している場合があります。それはあなたが達成しようとしていることに依存します。

于 2013-06-04T19:50:34.907 に答える
0

一般に、実装が 1 つしかない場合でも、インターフェイスを使用することをお勧めします。特に、依存性注入の原則を採用できるため、コードがより柔軟になります。具体的なインスタンスをクラスのコンストラクターに注入します。これにより、コードも非常にテストしやすくなり、クラスのユーザーは何を期待すべきか、またどのような依存関係があるかを知ることができます。そうすることで、次のような他のクラスにパーサーを挿入できます。

public class Worker
{
    private IParser _parser;
    public Worker(IParser parser)
    {
        _parser=parser;
    }
}

インターフェイスに対するプログラミングも、コードを実際の実装から分離します。例として、ドメイン層のクラスはリポジトリ インターフェイスを使用します。ただし、実行時に注入されるため、具体的なリポジトリの実装については何も知りません。したがって、ドメインはインフラストラクチャの問題から独立しています。

パラメータに関して:あなたの場合、操作の外では使用されず、異なる文字列でメソッドを複数回呼び出すことができるため、おそらく操作textのパラメータの方が良いでしょう。コンストラクターでこれを行う場合、おそらくそれで動作する複数の操作があることを意味するため、操作に対するグローバル変数のようになります。ParseParse

于 2013-06-04T19:57:18.190 に答える