Robert Cecil Martin的清洁代码簿

时间:2016-06-29 07:51:04

标签: c# winforms oop c#-6.0

我知道以前曾经问过这个问题但是我没有完全理解答案,也没有觉得这个问题和这个问题完全相同。

在罗伯特塞西尔马丁的清洁法典书中,他建议你应该采用哪种方法......

  • 不希望传递任何参数
  • 如果您必须通过参数,则只传递一个。
  • 在极少数情况下只能超过这个。

这让我感到困惑......

所以基于这个是正确的吗?

这个班......

 class FourNumberAdder
        {
            public int Num1 { get; }
            public int Num2 { get; }
            public int Num3 { get; }
            public int Num4 { get; }

            public FourNumberAdder(int n1, int n2,int n3,int n4 )
            {
                this.Num1 = n1;
                this.Num2 = n2;
                this.Num3 = n3;
                this.Num4 = n4;

            }

        }

有了......

FourNumberAdder FNA = new FourNumberAdder(1,2,3,4);

或者,这个班......

class FourNumberAdder
    {
        public int Num1 { get; set; }
        public int Num2 { get; set; }
        public int Num3 { get; set; }
        public int Num4 { get; set; }



    }

有了......

public void go()
{
    FourNumberAdder FNA = new FourNumberAdder();
                    FNA.Num1 = 1;
                    FNA.Num2 = 2;
                    FNA.Num3 = 3;
                    FNA.Num4 = 4;
}

或这两个班......

class FourNumberAdder
    {
        public int Num1 { get; set; }
        public int Num2 { get; set; }
        public int Num3 { get; set; }
        public int Num4 { get; set; }

       public FourNumberAdder (FourNumbers fn)
        {
            this.Num1 = fn.Num1;
            this.Num2 = fn.Num2;
            this.Num3 = fn.Num3;
            this.Num4 = fn.Num4;


        }

    }




class FourNumbers
    {
        public int Num1 { get; set; }
        public int Num2 { get; set; }
        public int Num3 { get; set; }
        public int Num4 { get; set; }

    }

有了......

FourNumbers fn = new FourNumbers();

                fn.Num1 = 1;
                fn.Num2 = 2;
                fn.Num3 = 3;
                fn.Num4 = 4;

            FourNumberAdder FNA = new FourNumberAdder(fn);

还是其他什么?请注意我认为最后一个选项是正确的,因为它将4个参数“捆绑”到一个新类中,但是你最终会遇到与该类相同的问题,因为你必须单独传递所有参数或访问他们直接通过那里的财产。

希望这很清楚。

2 个答案:

答案 0 :(得分:2)

如果不是必要的话,我不会创建特定的FourNumberAdder。相反,我会使用构建器模式,其中使用NumberAdder创建NumbersBuilder。此构建器可以是FourNumbersBuilderTenNumbersBuilder甚至是ThousendNumbersBuilder。而不是每个数字的吸气剂,我会创建一个Indexer,它返回特定位置的数字。

毕竟我认为不可能为你的答案提供一般解决方案,因为之前提到它取决于用例。

因为如果我上面的解释我建议采用第3号示例,那么它与构建器模式类似。

答案 1 :(得分:1)

你的例子非常假设,并没有多大意义。设计决策应该由用例驱动。这有助于使您的架构表达这些用例,而不是一些技术细节。

因此,不能轻易地说选项#1,#2或#3是最好的,因为您的代码没有真正的用例。没有理智的开发人员会编程FourNumberAdder

话虽如此,我认为选项#3最有意义,因为它正确地捆绑了属于一起的参数。