سؤال

// عنوان غبي ، لكنني لم أستطع التفكير في أي شيء أكثر ذكاءً

لدي رمز (انظر أدناه ، آسف للرمز الطويل ولكن إنه بسيط للغاية):

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 (التكوين ، التجميع)؟

هل كانت مفيدة؟

المحلول

وفق قانون ديميتر, ، الخيار 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);
        }
    }
}

إبداعي

يجب أن تستمد Mainclass الرئيسية من Auxclass ..

class MainClass : AuxClass1
{ 

}

أود أن أبدأ بتنفيذ ميزة لطيفة من C# تسمى "الخصائص التلقائية". بدلا من الكتابة

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

يمكنك كتابة

public ThisType MyThing { get; set; }

وسوف يولد المترجم نفس IL. علاوة على ذلك ، يمكنك إضافة بعض الخيارات ، على سبيل المثال جعل Setter خاص:

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).

يعتمد قرار اختيار التصميم على عوامل مختلفة ،

  1. رمز أقصر => الخيار 1
  2. مراقبة نشاط كل وظيفة وكل وصول => الخيار 2 ، ولكن باستخدام LINQ والتعبيرات ، يمكنك كتابة رمز معمم يمكنه العمل مع الخيار 1 ، ولكن هذا معقد للغاية لمناقشة هنا.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top