首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“你欠政府的吗?”类

“你欠政府的吗?”类
EN

Code Review用户
提问于 2011-01-28 11:14:15
回答 6查看 1.6K关注 0票数 13

我的类应该内部传递参数还是引用类级别的作用域变量?

我不确定有参数的过程调用的最佳方法或样式。我应该使用类级别的作用域变量吗?

代码语言:javascript
复制
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));
    }
}

还是将参数显式地传递到过程中?

代码语言:javascript
复制
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));
    }
}

在我设计的例子中,我认为第一个例子更清晰,但随着类的规模和复杂性的增加,跟踪来自何处的内容将变得更加困难。

EN

回答 6

Code Review用户

回答已采纳

发布于 2011-01-28 14:31:21

我尝试使用类级别的作用域变量,除非有特定的原因不使用。我对此的推理是,从API的角度看,它感觉更干净。

我要传递显式参数的一些原因如下:

  • 提高方法的可重用性。
  • 向子类型说明该方法需要哪些变量。
  • 将该方法与包含类型的细节分离。

我猜想(希望)在这个话题上有更多的理性和学术性的文章,但是我离我的大学时代已经很远了,以至于我不知道这个话题的名字。因此,我倾向于根据“感觉”正确来选择。如果一个方法存在只是为了清理另一个方法和/或封装一些逻辑,我倾向于使用一个类级别的作用域变量。

票数 7
EN

Code Review用户

发布于 2011-01-28 18:43:01

不要存储您可以计算的内容:

代码语言:javascript
复制
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字段基本上是一个缓存,而缓存是众所周知的问题。例如:这里的小代码也有一个缓存失效错误。如果您更改了税率或薪资,则不会重新计算要支付的金额。

每次添加字段时,都要问自己:“此字段是否存储其他字段所不存储的唯一信息?”如果答案是否定的,不要创建字段。状态越少,理解代码就越容易。

票数 9
EN

Code Review用户

发布于 2011-01-28 11:54:52

由于这是代码审查,我首先要提到的是,您没有验证您的数字的逻辑正确性,例如,薪资不能是负面的(除非您是一个邪恶的雇主)。你可能忽略了它,以缩短问题,但认为它是一个提醒。

如果计算量函数只执行这一行,那么更好的方法是取其行this.AmountToPay = (salary * (taxRate / 100));并将其放入构造函数中。如果是一行,为什么要调用函数、加载堆栈帧和存储寄存器?只要在构造函数本身中内联这一行逻辑,就可以用构造函数参数的值初始化AmountToPay,因此它的访问将更快,因为它是局部变量(优于第一个示例),更新AmountToPay的逻辑不需要函数调用,包括堆叠参数(击败第二个示例)。

但是,如果您计划创建多个构造函数,那么将所有共享代码保存在一个地方(一个init()函数)。例如,假设我们想要另一个也接受您的贷款的构造函数,那么您可以这样做。

代码语言:javascript
复制
YouOweTheGov(float taxRate, float salary, float loans)
{
... Process logic relating to loans..
init(taxRate,salary); // this function updates ArbitraryTaxRate,Salary,AmountToPay
}

将共享逻辑保持在一个位置,如果函数在构造函数处执行非常小的代码,则不要调用它,因为函数准备开销很大(而且构造会发生很多,特别是在传递或返回对象时!),而是将代码添加到构造函数本身中。如果您有多个构造函数,那么将所有共享代码保存在一个函数中(不要重复代码!)

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档