3

:私は通常はオブジェクトのコンストラクターがスタート()のコードを実行させる、とDisposeメソッドは、停止()のコードを実行されるようにIDisposableインターを実装IStartableのようなコンセプトを使用する利点は何ですか?代わりに、このようにインタフェースを使用しての

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

それは単なるスタイルの問題ですか?あるいは、私はIStartableのようなものを持たないことで何か重要なことを見逃しているのですか?あなたがそれが開始/停止状態を維持しなければならないので、私が見るすべては複雑です。

特にIoC/DIコンテナのコンテキストで、ctor/disposeを使用してスタート/ストップを使用する場合の長所と短所は何ですか?

EDIT:すばらしい答えは、起動可能なオブジェクトにインターフェイスを使用するように確信しています。私は24時間後に最大の票を持っている人を受け入れるように、誰が答えが最高かを決めることができません。

答えて

6

インターフェイスを使用する一般的な利点は、インターフェイスが自己記述型で自己広告型であることです。インターフェイスがない場合、オブジェクトを尋ねる方法はありません。「開始して停止できますか?」対照的に、インタフェースを使用する場合は、オブジェクトを照会して、それらのうちのどれがそのようなメッセージに応答するかを調べることができます。そのようなオブジェクトがインターフェイスによってカプセル化された機能を実装していることを安全に保証することができます。一般的には

+0

これは本当に大きなプロです。追加する複雑さをどのように管理していますか?あなたは複数のスタートを心配したり、オブジェクトが停止した後に再び始めることができますか? –

+0

私はそれが必然的に複雑さを加えるとは言いません。結局のところ、あなたはすでに実装を何か別の方法で書く必要がありました。今では、単に外部インターフェイスに準拠していると宣言しています。あなたの2番目の質問については、インターフェイスはそれに関するルールを定義する必要があります。適合する実装は、どのような標準が記述されていても満たすことが期待されます。たとえば、IEquatable の場合、Equals実装では、nullオブジェクトとの比較で常にfalseが返されることを保証する必要があります。 –

+0

しかし、コンストラクタで "開始"することの1つは、開始メソッドを2回呼び出すことができず、再起動の可能性について心配する必要がないということです。インターフェイスが複数回の起動に対して「未定義」な動作をしていると言うのは受け入れられますか?または再起動しますか?または、無効化された状態の変更に対して例外をスローするヘルパーを持つ方が、Initialized - > Started - > Stoppedのみが許可され、他のトランジションはスローされます。 –

4

、コンストラクタは適切に初期化されたオブジェクト

とより多くの何もを生成する必要があります!

+0

このケースでは「適切に初期化」できませんでしたか?あるいは、コンストラクタに副作用があってはならないと言っていますか?あなたがこのアイデアを持って走っていたら、イベントを購読してもあまりにも多いと言いますか? –

+0

コンストラクタは副作用を持つべきではなく、広範な計算を行うべきではなく、メモリの割り当てと初期化だけを行うべきではありません。私は間違いなくイベントに登録しません。問題の一部(.NETでは少なくとも)は、購読解除(または停止)が論理的にdisposeメソッドまたはfinalizeメソッドに属し、いつでもすぐに呼び出されるとは限りません。 –

+0

plus interfacesより明示的に、ジョンが言ったように –

2

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

また、あまりにもあいまいさが残ります。消費者にとって、与えられたオブジェクトに対して、我々はctorを呼び出すときに、それが「開始」していることをどのように知っていますか? 「契約が成立していないこのオブジェクトについては、私はそれが私の期待に合っていることを作者に期待する」必要があります。インターフェースは、アクションの存在と可用性を明示的にします。

関連する問題