Frage

// dumm Titel, aber ich konnte mir nichts klüger

Ich habe einen Code (siehe unten, sorry für langen Code aber es ist sehr, sehr einfach ):

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

Was Option (option1 oder option2) bevorzugen Sie? In welchen Fällen sollte ich option1 oder option2? Gibt es einen speziellen Namen für option1 oder option2 (Komposition, Aggregation)?

War es hilfreich?

Lösung

Nach Gesetz von Demeter , Option2. So können Sie frei die Umsetzung der Mainclass ändern können, Sie müssen sich keine Sorgen machen über Code auf Details von AuxClass1 unter Berufung nennen, und in der Tat kann es vollständig zu entfernen, wenn nötig.

Andere Tipps

EDIT

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

Original

I tihnk Mainclass sollte von AuxClass ableiten ..

class MainClass : AuxClass1
{ 

}

würde ich mit der Umsetzung ein nettes Features von C # beginnen „automatischen Eigenschaften“ genannt. Statt zu schreiben

private ThisType _myThing;
public ThisType MyThing 
{ 
    get { return _myThing; } 
    set { _myThing = value; }
}

Sie schreiben

public ThisType MyThing { get; set; }

und der Compiler wird genau die gleiche IL erzeugen.

: Am Anfang dieser, können Sie einige Optionen, zum Beispiel was die Setter privaten hinzufügen
public ThisType MyThing { get; private set; }

In Ihrem Fall würde ich für Option gehen 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();
    }
}

Auf diese Weise sperren Sie die AuxClass Referenz einmal Set es ist (wie in Option 2), während Sie sich nicht in der AuxClass Schnittstelle für Änderungen Perren (wie in Option 1).

Entscheidung des Wählens Design basiert auf verschiedenen Faktoren basieren,

  1. Kürzere code => Option 1
  2. Monitor Aktivität jeder Funktionalität und jeden Zugriff => Option 2, jedoch unter Verwendung von Linq und Ausdrücke, können Sie einen generali Code schreiben, der 1 mit sogar Option arbeiten kann, aber das ist zu kompliziert, hier zu diskutieren.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top