質問
//愚かなタイトルですが、私は何も賢いとは思えませんでした
私はコードを持っています(以下を参照してください、長いコードは申し訳ありませんが、 とても簡単です):
namespace Option1
{
class AuxClass1
{
string _field1;
public string Field1
{
get
{
return _field1;
}
set
{
_field1 = value;
}
}
// another fields. maybe many fields maybe several properties
public void Method1()
{
// some action
}
public void Method2()
{
// some action 2
}
}
class MainClass
{
AuxClass1 _auxClass;
public AuxClass1 AuxClass
{
get
{
return _auxClass;
}
set
{
_auxClass = value;
}
}
public MainClass()
{
_auxClass = new AuxClass1();
}
}
}
namespace Option2
{
class AuxClass1
{
string _field1;
public string Field1
{
get
{
return _field1;
}
set
{
_field1 = value;
}
}
// another fields. maybe many fields maybe several properties
public void Method1()
{
// some action
}
public void Method2()
{
// some action 2
}
}
class MainClass
{
AuxClass1 _auxClass;
public string Field1
{
get
{
return _auxClass.Field1;
}
set
{
_auxClass.Field1 = value;
}
}
public void Method1()
{
_auxClass.Method1();
}
public void Method2()
{
_auxClass.Method2();
}
public MainClass()
{
_auxClass = new AuxClass1();
}
}
}
class Program
{
static void Main(string[] args)
{
// Option1
Option1.MainClass mainClass1 = new Option1.MainClass();
mainClass1.AuxClass.Field1 = "string1";
mainClass1.AuxClass.Method1();
mainClass1.AuxClass.Method2();
// Option2
Option2.MainClass mainClass2 = new Option2.MainClass();
mainClass2.Field1 = "string2";
mainClass2.Method1();
mainClass2.Method2();
Console.ReadKey();
}
}
どのオプション(オプション1またはオプション2)が好きですか?どちらの場合、option1またはoption2を使用する必要がありますか? Option1またはOption2(構成、集約)の特別な名前はありますか?
解決
によると デメテルの法則, 、オプション2。そうすれば、MainClassの実装を自由に変更できます。AuxClass1の詳細に依存するコードを呼び出すことを心配する必要はなく、必要に応じて完全に削除できます。
他のヒント
編集
interface IAuxClass1
{
string Field1 { get; set; }
void Method1();
void Method2();
}
class AuxClass1 : IAuxClass1
{
string _field1;
public string Field1
{
get
{
return _field1;
}
set
{
_field1 = value;
}
}
// another fields. maybe many fields maybe several properties
public void Method1()
{
// some action
}
public void Method2()
{
// some action 2
}
}
public class MyClass : ServiceContainer
{
public MyClass()
{
this.AddService(typeof(IAuxClass1), new AuxClass1());
}
public MyClass(IAuxClass1 auxClassInstance)
{
this.AddService(typeof(IAuxClass1), auxClassInstance);
}
public IAuxClass1 AuxClass
{
get
{
return (this.GetService(typeof(IAuxClass1)) as IAuxClass1);
}
}
}
オリジナル
私はauxclassから派生する必要があります。
class MainClass : AuxClass1
{
}
「自動プロパティ」と呼ばれるC#の素晴らしい機能を実装することから始めます。書く代わりに
private ThisType _myThing;
public ThisType MyThing
{
get { return _myThing; }
set { _myThing = value; }
}
あなたは書ける
public ThisType MyThing { get; set; }
コンパイラはまったく同じILを生成します。これに加えて、セッターをプライベートにするなど、いくつかのオプションを追加できます。
public ThisType MyThing { get; private set; }
あなたの場合、私はオプション3に行きます:
namespace Option3
{
public AuxClass
{
public string Field1 { get; set; }
public Method1() { ... }
public Method1() { ... }
}
public MainClass
{
public AuxClass Aux { get; private set; }
public MainClass(AuxClass aux)
{
this.Aux = aux;
}
}
}
class Program
{
static void Main(string[] args)
{
Option3.AuxClass = auxClass3 = new Option3.AuxClass();
Option3.MainClass mainClass3 = new Option3.MainClass(auxClass3);
mainClass3.Aux.Field1 = "string2";
mainClass3.Aux.Method1();
mainClass3.Aux.Method2();
}
}
これにより、AuxClassインターフェイスの変更(オプション1のように)のために自分自身をロックしないと、AuxClassリファレンスが設定されたら(オプション2のように)ロックします。
設計を選択する決定は、さまざまな要因に基づいています。
- より短いコード=>オプション1
- 各機能とすべてのAccess =>オプション2のアクティビティを監視しますが、LINQと式を使用して、オプション1でも動作できる一般化コードを記述できますが、ここで説明するには複雑すぎます。
所属していません StackOverflow