インターフェースの問題は、いったん公開されると、ほとんどが固定されていることです。Anders Hejlsburg の引用:
... インターフェイスにメソッドを追加するようなものです。インターフェイスを公開した後は、すべての実用的な目的で不変になります。これは、インターフェイスの実装には、次のバージョンで追加するメソッドが含まれている可能性があるためです。そのため、代わりに新しいインターフェイスを作成する必要があります。
したがって、インターフェイスを更新するだけではいけません。完全に新しいインターフェイスを作成する必要があります。もちろん、単一のクラスで両方のインターフェースを実装することもできるので、時間の経過とともにコードが複数のクラスに分散される (たとえば) ポリモーフィック クラスと比較して、メンテナンスの労力はかなり少なくなります。
複数のインターフェイスを使用すると、クラスにはない方法でメソッドを削除することもできます (確かに、それらを非推奨にすることはできますが、数回の反復後に非常にノイズの多い intellisense が発生する可能性があります)。
私は個人的に、各アセンブリ バージョンに完全にスタンドアロンのインターフェイス バージョンを用意することに傾倒しています。
つまり…
v 0.1.0.0
interface IExample
{
String DoSomething();
}
v 0.2.0.0
interface IExample
{
void DoSomethingElse();
}
舞台裏でそれらをどのように実装するかはあなた次第ですが、ほとんどの場合、同様の仕事をするわずかに異なるメソッドを持つ同じクラスになります (そうでなければ、なぜ同じインターフェースを使用するのでしょうか?)
古いコードはすべて参照する必要が0.1.x.x
あり、新しいコードは を参照し0.2.x.x
ます。唯一の問題は、(たとえば) セキュリティ上の欠陥を見つけて、修正を以前のバージョンに移植する必要がある場合です。ここで、まともな VCS の出番です (個人的な好みは TFS ですが、SVN など、分岐/マージをサポートするものであれば何でもかまいません)。
ブランチからの修正をマージして0.2
ブランチに戻し0.1
、再コンパイルして (たとえば) を生成し0.1.1.0
ます。
このようなプロセスに固執する限り:
これにより、以下が得られます。
- 従来の乱雑さのないクリーンなコードベース
- 何も問題がなければ、クライアントはコードを変更することなく最新バージョンを使用できます
- クライアントが再コンパイルするまで、重大な変更がある新しいバージョンのアセンブリを使用できないようにします (そして、新しい機能を利用するためにコードを適切に更新することをお勧めします)。
- 以前のバージョンのセキュリティ パッチをリリースできます