帮我选择两种设计

时间:2010-05-24 06:54:03

标签: c# ooad

//愚蠢的头衔,但我想不出更聪明的事情

我有一个代码(见下文,很抱歉长代码但非常简单):

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

您更喜欢哪个选项(option1或option2)?在哪些情况下我应该使用option1还是option2? option1或option2(组合,聚合)是否有任何特殊名称?

4 个答案:

答案 0 :(得分:1)

根据Law of Demeter,选项2。这样你就可以自由地改变MainClass的实现,你不必担心依赖AuxClass1的细节来调用代码,并且如果需要的话,确实可以完全删除它。

答案 1 :(得分: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);
        }
    }
}

原始

我认为Main Class应该来自Aux Class ..

class MainClass : AuxClass1
{ 

}

答案 2 :(得分:0)

我首先要实现一个名为“自动属性”的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中所示)。

答案 3 :(得分:0)

选择设计的决定基于不同的因素,

  1. 更短的代码=>备选方案1
  2. 监控每项功能和每次访问的活动=>选项2,但是使用linq和表达式,你可以编写一个可以使用偶数选项1的通用代码,但这太复杂了,无法在这里讨论。