OK ..すべての議論の後、私が扱っている具体的な例をより良く反映するために質問を少し変更しています。
私は2つのクラスModelOne
とを持っていますModelTwo
。これらのクラスは同様のタイプの機能を実行しますが、互いに無関係です。しかし、私はCommonFunc
両方ModelOne
で実装されているいくつかのパブリック機能を含む3番目のクラスをModelTwo
持っていDRY
ます。2つのモデルはModelMain
クラス内でインスタンス化されます(それ自体はより高いレベルなどでインスタンス化されますが、このレベルで停止しています)。
私が使用しているIoCコンテナはMicrosoft Unityです。私はそれの専門家であるふりはしませんが、インターフェイスのクラスとコンテナをクラスに登録し、具体的なクラスが必要な場合は、特定のインターフェイスに一致するオブジェクトをIoCコンテナに尋ねることです。これは、Unityからインスタンス化するすべてのオブジェクトに対して、一致するインターフェイスが必要であることを意味します。各クラスは異なる(重複しない)機能を実行するため、これは、インターフェイスとクラス1の比率が1:1であることを意味します。しかし、それは私が書くすべてのクラスのためにインターフェースを慎重に書いているという意味ではありません。
したがって、コード的には2になります。
public interface ICommonFunc
{
}
public interface IModelOne
{
ICommonFunc Common { get; }
..
}
public interface IModelTwo
{
ICommonFunc Common { get; }
..
}
public interface IModelMain
{
IModelOne One { get; }
IModelTwo Two { get; }
..
}
public class CommonFunc : ICommonFunc { .. }
public class ModelOne : IModelOne { .. }
public class ModelTwo : IModelTwo { .. }
public class ModelMain : IModelMain { .. }
問題は、ソリューションを整理する方法についてです。クラスとインターフェイスを一緒に保つ必要がありますか?または、クラスとインターフェイスを一緒に保持する必要がありますか?例えば:
オプション1- クラス名別に整理
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-Main
| |
| |-IModelMain.cs
| |-ModelMain.cs
|
|-One
| |
| |-IModelOne.cs
| |-ModelOne.cs
|
|-Two
|
|-IModelTwo.cs
|-ModelTwo.cs
|
オプション2-機能別に編成(主に)
MySolution
|
|-MyProject
| |
|-Models
| |
|-Common
| |
| |-CommonFunc.cs
| |-ICommonFunc.cs
|
|-IModelMain.cs
|-IModelOne.cs
|-IModelTwo.cs
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
オプション3-インターフェースと実装の分離
MySolution
|
|-MyProject
|
|-Interfaces
| |
| |-Models
| | |
| |-Common
| | |-ICommonFunc.cs
| |
| |-IModelMain.cs
| |-IModelOne.cs
| |-IModelTwo.cs
|
|-Classes
|
|-Models
| |
|-Common
| |-CommonFunc.cs
|
|-ModelMain.cs
|-ModelOne.cs
|-ModelTwo.cs
|
オプション4-機能の例をさらに取り上げる
MySolution
|
|-MyProject
| |
|-Models
| |
|-Components
| |
| |-Common
| | |
| | |-CommonFunc.cs
| | |-ICommonFunc.cs
| |
| |-IModelOne.cs
| |-IModelTwo.cs
| |-ModelOne.cs
| |-ModelTwo.cs
|
|-IModelMain.cs
|-ModelMain.cs
|
パスのクラス名のために、オプション1が嫌いです。私は1に傾向していますとしてではなく、:ので、私のIoCの選択/使用方法の1つの比率を(そしてそれは議論の余地もあります)これは、ファイル間の関係を見ることに利点があります。
オプション2は魅力的ですが、今ModelMain
ではサブモデルとサブモデルの間の水を汚しています。
オプション3は、インターフェース定義を実装から分離する働きをしますが、今ではパス名にこれらの人為的な中断があります。
オプション4。コンポーネントを親モデルから分離するために、オプション2を使用して調整しました。
一方を他方よりも優先する正当な理由はありますか?または私が見逃した他の潜在的なレイアウトはありますか?
1.フランクは、1:1の比率を使用すると、C ++の.hファイルと.cppファイルに似ているとコメントしました。彼がどこから来たのか知っています。Unityについての私の理解は、このコーナーに私を連れて行くように思えますが、あなたがまたProgram to an interface
別の日の議論であるという格言に従っているなら、それから抜け出す方法すら分かりません。
2.各オブジェクトコンストラクターの詳細は省略しました。これは、必要に応じてIoCコンテナがオブジェクトを注入する場所です。
Client1
必要な場合IBase
、それは提供しDerived1
ます。がClient2
必要なIBase
場合、IoCはを提供しDerived2
ます。
interface
。An interface
は、実際にはすべての仮想メンバーを持つ単なる抽象クラスです。