罗伯特塞西尔马丁的清洁代码书

Clean Code Book by Robert Cecil Martin

我知道以前有人问过这个问题,但我没有完全理解答案,也不觉得这个问题和这个问题完全一样。

在 Robert Cecil Martin 的 Clean Code Book 一书中,他建议您应该使用的方法...

这让我很困惑...

所以根据这个哪个是正确的?

这个class...

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

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

或这 2 classes...

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

还是别的?请注意,我认为最后一个选项是正确的,因为它 'bundles up' 将 4 个参数放入新的 class,但是你最终会遇到与 class 相同的问题,因为你必须这样做要么单独传递所有参数,要么通过那里的属性直接访问它们。

希望这是清楚的。

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

因此不能轻易说选项 #1、#2 或 #3 是最好的,因为您的代码没有实际用例。任何理智的开发人员都不会编写 FourNumberAdder.

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

如果不是真的需要,我不会创建特定的 FourNumberAdder。相反,我会使用构建器模式,其中 NumberAdder 通过使用 NumbersBuilder 创建。此生成器可以是 FourNumbersBuilderTenNumbersBuilder 甚至是 ThousendNumbersBuilder。而不是每个数字的 getter 我会创建一个 Indexer,其中 returns 特定位置的数字。

毕竟我认为不可能为您的答案提供一个通用的解决方案,因为如前所述,它取决于用例。

因为如果我上面的解释我会建议采取示例编号 3,它类似于构建器模式。