オブジェクトのインターフェイスの一部である「IsSecureConnection」というプロパティがあります。これは、インターフェイスのほとんどの実装では理にかなっていますが、一部の実装では、プロパティを ReadOnly にしたいと考えています。
このプロパティは、すべての実装で必要ですが (場合によっては若干異なりますが)、オブジェクトのインターフェイスから除外する必要がありますか?
ありがとう!
インターフェイスに getter を追加するだけです。
public interface Foo{
bool MyMinimallyReadOnlyPropertyThatCanAlsoBeReadWrite {get;}
}
インターフェースは、オブジェクトが実装しなければならない最低限のものを指定します。オブジェクトができないことは言いません。そのためには、基本クラスの作成を検討する必要があります。
インターフェイスは塩のようなものです: どこにでも振りかけます:
public interface ICanBeSecure
{
bool IsSecureConnection { get; }
}
public interface IIsSecureable : ICanBeSecure
{
bool IsSecureConnection { get; set;}
}
それは、クライアントにとって何が最も読みやすいかによって異なります。いくつかのオプションを考えることができます:
1) 継承されたインターフェイス。私は非表示のファンではありませんが、VB.NET または明示的なクライアントが実装するのは少し見苦しくなると思います。
interface IObject {
bool IsSecureConnection { get; }
// ... other interface definitions //
}
interface ISecurableObject : IObject {
new bool IsSecureConnection { get; set; }
}
2) 継承されたインターフェイスを使用して、プロパティからセットを分割します。
interface IObject {
bool IsSecureConnection { get; }
// ... other interface definitions //
}
interface ISecurableObject : IObject {
void SetConnectionSecurity(bool isSecure);
}
3) セキュリティで保護された接続を試行して取得するようにセマンティクスを変更します。実装者は自由に false を返すことができます。
interface ISecurable {
bool IsSecureConnection { get; }
bool TrySecureConnection();
}
4) 追加のチェック プロパティを追加します。
interface ISecurable {
bool IsSecureConnection { get; set; }
bool SupportsSecureConnection { get; }
}
これらはすべて、特定のコンテキストに対して有効な設計です。ほとんどの場合、安全な接続を確立できることを除けば、ユース ケースに関する情報がないので、おそらく 3 に投票します。実装は簡単で、クライアント用のコード パスは 1 つだけです。例外メカニズムはありません (カップリングの別の形式です)。クライアントが TrySecureConnection からの戻り値をチェックしないという危険性はありますが、他の選択肢よりも問題が少ないと思います。
クライアントが安全な接続を好むが、それを必要としない場合- 1 には、オーバーロードが必要になるか、クライアントが IObject が実際に ISecableObject であるかどうかを確認する必要があるという欠点があります。どちらもちょっと醜いです。2 にも同じ問題がありますが、面倒な new/shadows トリックはありません。ただし、一部のクライアントが安全な接続を必要とする場合は、おそらくこれ (または 2) が適しています。そうしないと、タイプ セーフを実際に使用して安全な接続を強制することはできません。
4、一方、有効な設計 IMO (同意しない人もいます - IO.Stream への反応を参照してください) は、クライアントが誤解しやすいものです。実装者の 90% が保護可能である場合、SupportsSecureConnection をチェックしないのは簡単です。また、IsSecureConnection = true 呼び出しがサポートされていない場合は、例外をスローするか破棄するかを実装者が選択できるため、クライアントは IsSecureConnection の新しい値をキャッチして確認する必要があります。
ケースを評価する必要があります。常に書き込み可能にすることが意味をなさない場合は、2 番目のインターフェイスに分離します。
public interface IFoo {
bool SecuredConnection{ get; }
}
public interface ISecurableOptionFoo: IFoo {
bool SecuredConnection{ get; set; }
}