我的类应该内部传递参数还是引用类级别的作用域变量?
我不确定有参数的过程调用的最佳方法或样式。我应该使用类级别的作用域变量吗?
public class YouOweTheGovernment
{
public float AmountToPay { get; private set; }
public float ArbitraryTaxRate { get; private set; }
public float Salary { get; private set; }
public YouOweTheGovernment(float taxRate, float salary)
{
this.ArbitraryTaxRate = taxRate;
this.Salary = salary;
CalculateAmount();
}
private void CalculateAmount()
{
this.AmountToPay = (this.Salary * (this.ArbitraryTaxRate / 100));
}
}还是将参数显式地传递到过程中?
public class YouOweTheGovernment
{
public float AmountToPay { get; private set; }
public float ArbitraryTaxRate { get; private set; }
public float Salary { get; private set; }
public YouOweTheGovernment(float taxRate, float salary)
{
this.ArbitraryTaxRate = taxRate;
this.Salary = salary;
CalculateAmount(this.Salary, this.ArbitraryTaxRate);
}
private void CalculateAmount(float salary, float taxRate)
{
this.AmountToPay = (salary * (taxRate / 100));
}
}在我设计的例子中,我认为第一个例子更清晰,但随着类的规模和复杂性的增加,跟踪来自何处的内容将变得更加困难。
发布于 2011-01-28 14:31:21
我尝试使用类级别的作用域变量,除非有特定的原因不使用。我对此的推理是,从API的角度看,它感觉更干净。
我要传递显式参数的一些原因如下:
我猜想(希望)在这个话题上有更多的理性和学术性的文章,但是我离我的大学时代已经很远了,以至于我不知道这个话题的名字。因此,我倾向于根据“感觉”正确来选择。如果一个方法存在只是为了清理另一个方法和/或封装一些逻辑,我倾向于使用一个类级别的作用域变量。
发布于 2011-01-28 18:43:01
不要存储您可以计算的内容:
public class YouOweTheGovernment
{
public float AmountToPay
{
get { return Salary * (ArbitraryTaxRate / 100); }
}
public float ArbitraryTaxRate { get; private set; }
public float Salary { get; private set; }
public YouOweTheGovernment(float taxRate, float salary)
{
this.ArbitraryTaxRate = taxRate;
this.Salary = salary;
}
}您的AmountToPay字段基本上是一个缓存,而缓存是众所周知的问题。例如:这里的小代码也有一个缓存失效错误。如果您更改了税率或薪资,则不会重新计算要支付的金额。
每次添加字段时,都要问自己:“此字段是否存储其他字段所不存储的唯一信息?”如果答案是否定的,不要创建字段。状态越少,理解代码就越容易。
发布于 2011-01-28 11:54:52
由于这是代码审查,我首先要提到的是,您没有验证您的数字的逻辑正确性,例如,薪资不能是负面的(除非您是一个邪恶的雇主)。你可能忽略了它,以缩短问题,但认为它是一个提醒。
如果计算量函数只执行这一行,那么更好的方法是取其行this.AmountToPay = (salary * (taxRate / 100));并将其放入构造函数中。如果是一行,为什么要调用函数、加载堆栈帧和存储寄存器?只要在构造函数本身中内联这一行逻辑,就可以用构造函数参数的值初始化AmountToPay,因此它的访问将更快,因为它是局部变量(优于第一个示例),更新AmountToPay的逻辑不需要函数调用,包括堆叠参数(击败第二个示例)。
但是,如果您计划创建多个构造函数,那么将所有共享代码保存在一个地方(一个init()函数)。例如,假设我们想要另一个也接受您的贷款的构造函数,那么您可以这样做。
YouOweTheGov(float taxRate, float salary, float loans)
{
... Process logic relating to loans..
init(taxRate,salary); // this function updates ArbitraryTaxRate,Salary,AmountToPay
}将共享逻辑保持在一个位置,如果函数在构造函数处执行非常小的代码,则不要调用它,因为函数准备开销很大(而且构造会发生很多,特别是在传递或返回对象时!),而是将代码添加到构造函数本身中。如果您有多个构造函数,那么将所有共享代码保存在一个函数中(不要重复代码!)
https://codereview.stackexchange.com/questions/362
复制相似问题