1

// ばかげたタイトルですが、これ以上賢いものは考えられませんでした

コードがあります(以下を参照してください。長いコードで申し訳ありませんが、非常に単純です):

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 を使用する必要がありますか? オプション 1 またはオプション 2 (構成、集計) に特別な名前はありますか?

4

4 に答える 4

1

デメテルの法則、オプション 2によると。そうすれば、MainClass の実装を自由に変更できます。AuxClass1 の詳細に依存してコードを呼び出すことを心配する必要はなく、必要に応じて完全に削除することもできます。

于 2010-05-24T06:59:04.307 に答える
1

編集

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);
        }
    }
}

オリジナル

MainClass は AuxClass から派生する必要があると思います..

class MainClass : AuxClass1
{ 

}
于 2010-05-24T07:04:54.637 に答える
0

「自動プロパティ」と呼ばれる 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 参照が設定されると (オプション 2 のように) ロックし、AuxClass インターフェースの変更のために自分自身をロックすることはありません (オプション 1 のように)。

于 2010-05-24T07:05:43.827 に答える
0

デザインを選択する決定は、さまざまな要因に基づいており、

  1. 短いコード => オプション 1
  2. 各機能とすべてのアクセスのアクティビティを監視する => オプション 2。ただし、linq と式を使用すると、オプション 1 でも機能する一般化されたコードを作成できますが、ここで説明するには複雑すぎます。
于 2010-05-24T07:42:31.137 に答える