複数のアプリをターゲットにしたコンポーネント、一つのアプリの振る舞いを変えるプラグイン

 この二つはきちんと区別しないと混乱する。コンポーネントの振る舞いを変えるプラグインもある。実装はどちらもDLLになる。

 振る舞いを変えるつもりがなくても、プラグインにしてインターフェースを介することで疎結合を強制できる。疎結合を強制するために別のDLLに分ける場合、相互参照の可能性を排除するために自動的にインターフェースを介することが必要になる。インターフェースを介すると結合してる部分がどこか明示されるので見通しもよくなる。

 プラグインにして振る舞いを変えるならインターフェースを最小化して変更の自由度を高める必要がある。実際の処理が複数箇所で使われ、それぞれがインターフェースを介して振る舞いを変える必然性がある場合、実際の処理は複数のinterfaceを実装するのがいいのか、実際の処理は単体で存在させ複数のコンポジションを介するのがいいのかはよく分からない。複数箇所で使われるということは他のアプリでも使われることがありそうな話なので、コンポジションにした方がいいのかもしれない。