假设我有一个计算税收的课程。哪个是设计calcTax方法的最佳实践。选项1或选项2.该对象属于一个人,这就是我们存储年龄和收入的原因。我可以看到每个的优点和缺点,但只是想看看是否有最佳实践,或者两个选项中的一个是否有代码味道。
选项1:
class CalcTax
{
private int Age;
private double Income;
public void Update(int age, double inc)
{
Age = age;
Income = inc;
}
public double calcTax()
{
return Age * Income * 0.25;
}
}
CalcTax obj = new CalcTax();
obj.update(5,500)
obj.CalcTax();
选项2:
class CalcTax
{
public double calcTax(int age, int inc)
{
return age * inc* 0.25;
}
}
CalcTax obj = new CalcTax();
obj.calcTax(10,100);
答案 0 :(得分:0)
可以去任何一种方式。取决于对象应该代表什么。
如果一个人有一个对象(我假设年龄和收入与一个人有关系),并且该对象将在你所展示的计算之外做各种各样的事情,那么它的基本属性那个人(年龄,收入等)应该是阶级属性。这些可能被设置为new()
的参数,或者可能在创建实例后不久设置。
但是,如果这只是一个计算器对象,用于处理各种人的请求,则根本不需要将Age和Income作为类属性。您可以完全删除它们的Option 2示例,并将它们放在calcTax()的参数中。
它可能会在那里结束,其中一个选项最适合您的项目。但是如果你正在创建更多的库函数,其他程序员将在不同的项目中以不同的方式使用它,你可以跨越栅栏......
将年龄和收入作为参数添加到new()并将其另存为类属性。然后,将参数设置为calcTax()可选,如果没有提供,则默认为类属性。这样,您的开发人员可以采用最适合他们需求的方法,并且您只需要一个代码库来支持他们。
答案 1 :(得分:0)
正如第一条评论所说,选择权归你所有。试着想想你的班级将扮演什么样的角色。它只是您可能想要调用的常见数学函数的集合。如果是这样,那么具有可通过参数的方法就很棒。
但是,如果您要生成特定于某个特定背景的税级,那么下面的内容可能最适合您。下面的示例需要Age和Income,并提供CalculatedTax作为只读属性。
public class Tax
{
public Tax(int Age, int Income) //constructor, class can not be instantiated without these values
{
this.Age = Age;
this.Income = Income;
}
public int Age { get; set; }
public int Income { get; set; }
public double CalculatedTax //read only property
{
get { return double.Parse((Age * Income).ToString()) * 0.25f; }
}
}
Tax tax = new Tax(5, 1000);
double calculatedTax = tax.CalculatedTax; //1250
上述示例的一个好处是需要Age和Income来生成CalculatedTax值。通过强制在构造函数中输入这些参数,确保它们存在,否则(对于此示例)如果这些是您唯一的三个属性,如果您不打算包含其中一个属性,那么创建类的重点是什么必需参数。