3

このようなインターフェースを使用する代わりに:

public interface IStartable
{
    void Start();
    void Stop();
}

私は通常、オブジェクトのコンストラクターに Start() コードを実行させ、IDisposable を実装して、dispose メソッドが Stop() コードを実行するようにします。

スタイルだけの問題ですか?それとも、IStartable のようなものを持っていないことで、何か重要なものを見逃していますか? 開始/停止状態を維持する必要があるため、余分な複雑さが見られます。

特に IoC/DI コンテナーのコンテキストで、開始/停止を使用する場合と ctor/dispose を使用する場合の長所と短所は何ですか?

編集:素晴らしい答えです。開始可能なオブジェクトにインターフェイスを使用するように説得しました。誰の回答がベストかは判断できないので、24 時間後に最も多くの賛成票を獲得した人を受け入れます。

4

3 に答える 3

6

インターフェイスを使用する一般的な利点は、自己記述的で自己宣伝的であることです。インターフェイスがなければ、オブジェクトに「開始および停止できるか」を尋ねる方法がありません。対照的に、インターフェイスを使用する場合は、オブジェクトにクエリを実行して、それらの種類のメッセージに応答するオブジェクトを確認できます。そうすれば、そのようなオブジェクトがインターフェイスによってカプセル化された機能を実装していることを安全に保証できます。

于 2009-05-26T04:40:19.850 に答える
4

一般に、コンストラクターは適切に初期化されたオブジェクトを生成する必要があります

そしてそれ以上のものはありません!

于 2009-05-26T04:40:37.073 に答える
2

具体的には、Start() と言うときに何を意味するかによって異なる可能性があります。しかし、一般に、オブジェクトの初期化とルーチンの実行 (特にステートフルおよび/または長時間実行) を混在させると、SoCに違反します。

それはまた、多くの曖昧さを残します。消費者にとって、特定のオブジェクトについて、ctor を呼び出したときにそれが「開始」していることをどのように知るのでしょうか? 「契約を実装していないこの特定のオブジェクトについては、それが私の期待に適合することを作者に期待させる必要があります」? インターフェイスは、アクションの存在と利用可能性を明示的にします。

于 2009-05-26T04:47:00.107 に答える