web-dev-qa-db-ja.com

インターフェースが何かが機能する方法の半分だけを通信することは問題ありませんか?

他の特定のサービスがステータスを報告できるサービスがあります。ステータスとは、実行されているかどうかではなく、データを受信したかどうかを意味します。重要なのは、他のサービスが必要なデータを受信したかどうかを尋ねることができるということです。

これを実装するには、2つの選択肢があります。

1つは次のとおりです。

public interface IDataPrerequisiteFulfillmentService
{
    bool ArePrerequisitesFulfilled(params DataPrerequisite[] dataPrerequisites);
    void ReportDataPrerequisiteFulfilled(DataPrerequisite dataPrerequisite);
}

ただし、これは、このサービスにレポートする必要があるサービスに追加の依存関係が必要になることを意味します。一部のサービスにはすでに複数の依存関係があり、依存関係を最小限に抑えるのが好きです。

これにアプローチする別の方法は、次のことを行うことです。

public interface IDataPrerequisiteFulfillmentService
{
    bool ArePrerequisitesFulfilled(params DataPrerequisite[] dataPrerequisites);
}

public interface IDataPrerequisiteService
{
    event EventHandler<DataPrerequisiteEventArgs> PrerequisiteFulfilled;
}

public class DataPrerequisiteFulfillmentService : IDataPrerequisiteFulfillmentService
{
    private IList<DataPrerequisite> fulfilledPrerequisites = new List<DataPrerequisite>();

    public IDataPrerequisiteFulfillmentService(IEnumerable<IDataPrerequisiteService> services)
    {
        // receive services via injection
        foreach (var service in services)
        {
            service.PrerequisiteFulfilled += (s, e) => 
            {
                _fulfilledPrerequisites.Add(e.DataPrerequisite);
            }
        }
    }

私はオプション2を好みます。それはまた依存関係を逆転させます。ただし、IDataPrerequisiteFulfillmentServiceの実装にも入力が必要であるという事実を伝達しないインターフェイスが作成されます。

    public bool ArePrerequisitesFulfilled(params DataPrerequisite[] dataPrerequisites)
    {
        // check _fulFilledPrerequisites here
    }
}

実装の動作の半分しか通信しないインターフェースがあっても大丈夫ですか?

1
Peter

実装がどのように機能するかを伝達しないインターフェースを持つことは絶対に問題ありません。実際、これがインターフェースのポイントであり、実装の詳細を非表示にします。

このシナリオでは、2番目のオプションで問題ありません。

2
AlexFoxGill