罗伯特塞西尔马丁的清洁代码书
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
创建。此生成器可以是 FourNumbersBuilder
、TenNumbersBuilder
甚至是 ThousendNumbersBuilder
。而不是每个数字的 getter 我会创建一个 Indexer
,其中 returns 特定位置的数字。
毕竟我认为不可能为您的答案提供一个通用的解决方案,因为如前所述,它取决于用例。
因为如果我上面的解释我会建议采取示例编号 3,它类似于构建器模式。
我知道以前有人问过这个问题,但我没有完全理解答案,也不觉得这个问题和这个问题完全一样。
在 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
创建。此生成器可以是 FourNumbersBuilder
、TenNumbersBuilder
甚至是 ThousendNumbersBuilder
。而不是每个数字的 getter 我会创建一个 Indexer
,其中 returns 特定位置的数字。
毕竟我认为不可能为您的答案提供一个通用的解决方案,因为如前所述,它取决于用例。
因为如果我上面的解释我会建议采取示例编号 3,它类似于构建器模式。