C# 罗伯特·塞西尔·马丁的《清洁代码手册》
我知道以前有人问过这个问题,但我不完全理解答案,也不觉得这个问题与这个问题完全一样 在罗伯特·塞西尔·马丁(Robert Cecil Martin)的《干净代码书》(Clean Code book)一书中,他提出了关于你应该C# 罗伯特·塞西尔·马丁的《清洁代码手册》,c#,winforms,oop,c#-6.0,C#,Winforms,Oop,C# 6.0,我知道以前有人问过这个问题,但我不完全理解答案,也不觉得这个问题与这个问题完全一样 在罗伯特·塞西尔·马丁(Robert Cecil Martin)的《干净代码书》(Clean Code book)一书中,他提出了关于你应该 不希望传递任何参数 如果必须传递参数,则只传递一个 在极少数情况下,只有通过的次数比这还多 这让我很困惑 那么基于这个,哪个是正确的呢 这个班 class FourNumberAdder { public int Num1 {
- 不希望传递任何参数
- 如果必须传递参数,则只传递一个
- 在极少数情况下,只有通过的次数比这还多
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;
}
}
class FourNumberAdder
{
public int Num1 { get; set; }
public int Num2 { get; set; }
public int Num3 { get; set; }
public int Num4 { get; set; }
}
用这个
FourNumberAdder FNA = new FourNumberAdder(1,2,3,4);
public void go()
{
FourNumberAdder FNA = new FourNumberAdder();
FNA.Num1 = 1;
FNA.Num2 = 2;
FNA.Num3 = 3;
FNA.Num4 = 4;
}
FourNumbers fn = new FourNumbers();
fn.Num1 = 1;
fn.Num2 = 2;
fn.Num3 = 3;
fn.Num4 = 4;
FourNumberAdder FNA = new FourNumberAdder(fn);
或者,这个班级
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;
}
}
class FourNumberAdder
{
public int Num1 { get; set; }
public int Num2 { get; set; }
public int Num3 { get; set; }
public int Num4 { get; set; }
}
用这个
FourNumberAdder FNA = new FourNumberAdder(1,2,3,4);
public void go()
{
FourNumberAdder FNA = new FourNumberAdder();
FNA.Num1 = 1;
FNA.Num2 = 2;
FNA.Num3 = 3;
FNA.Num4 = 4;
}
FourNumbers fn = new FourNumbers();
fn.Num1 = 1;
fn.Num2 = 2;
fn.Num3 = 3;
fn.Num4 = 4;
FourNumberAdder FNA = new FourNumberAdder(fn);
或者这两门课
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; }
}
用这个
FourNumberAdder FNA = new FourNumberAdder(1,2,3,4);
public void go()
{
FourNumberAdder FNA = new FourNumberAdder();
FNA.Num1 = 1;
FNA.Num2 = 2;
FNA.Num3 = 3;
FNA.Num4 = 4;
}
FourNumbers fn = new FourNumbers();
fn.Num1 = 1;
fn.Num2 = 2;
fn.Num3 = 3;
fn.Num4 = 4;
FourNumberAdder FNA = new FourNumberAdder(fn);
还是别的什么?请注意,我认为最后一个选项是正确的,因为它将4个参数“捆绑”到一个新类中,但最终该类会出现相同的问题,因为您必须单独传递所有参数,或者直接通过这些属性访问它们
希望这是清楚的。您的示例非常假设,没有多大意义。然而,设计决策应该由用例驱动。这有助于使您的体系结构表达这些用例,而不是一些技术细节
因此,不能轻易地说选项1、2或3是最好的,因为您的代码没有真正的用例。没有一个理智的开发者会编写一个fournumberder
话虽如此,我认为选项#3最有意义,因为它正确地捆绑了属于一起的参数。您的示例非常假设,没有多大意义。然而,设计决策应该由用例驱动。这有助于使您的体系结构表达这些用例,而不是一些技术细节
因此,不能轻易地说选项1、2或3是最好的,因为您的代码没有真正的用例。没有一个理智的开发者会编写一个fournumberder
话虽如此,我认为选项3最有意义,因为它正确地将属于一起的参数捆绑在一起。如果不是必要的话,我不会创建特定的
fourNumberDer
。相反,我将使用生成器模式,其中通过使用NumbersBuilder
创建numberdder
。此生成器可以是FourNumbersBuilder
,TenNumbersBuilder
,甚至可以是1000numbersbuilder
。我将创建一个索引器
,它返回特定位置的数字,而不是每个数字的getter
毕竟,我认为不可能为您的答案提供一个通用的解决方案,因为前面提到的这类问题取决于用例
因为如果我在上面解释的话,我建议以数字3为例,它类似于构建器模式。如果没有必要,我不会创建特定的
fourNumberDer
。相反,我将使用生成器模式,其中通过使用NumbersBuilder
创建numberdder
。此生成器可以是FourNumbersBuilder
,TenNumbersBuilder
,甚至可以是1000numbersbuilder
。我将创建一个索引器
,它返回特定位置的数字,而不是每个数字的getter
毕竟,我认为不可能为您的答案提供一个通用的解决方案,因为前面提到的这类问题取决于用例
因为如果我在上面解释的话,我建议以数字3为例,它类似于构建器模式。我个人对不能拆分为单独类别的构造函数参数的规则提出了一个例外(如果可以对其进行子分类,则可以将ctor参数放入单独的类中,并作为较少的参数传递).然而,这个问题不适合这个网站,因为答案可能是主观的/基于观点的。我个人对不能划分为单独类别的构造函数参数例外(如果可以对其进行子分类,则可以将系数参数分为单独的类,并作为较少的参数进行传递)。但是,此问题不适合此网站,因为答案可能是基于主观/观点的。