Class 类中的方法。您应该设置属性并让方法使用属性还是传递参数?

Class 类中的方法。您应该设置属性并让方法使用属性还是传递参数?,class,oop,Class,Oop,假设我有一个计算税收的类。这是设计calcTax方法的最佳实践。备选方案1或备选方案2。这个对象属于一个人,这就是为什么我们要存储年龄和收入。我可以看到每个选项的优点和缺点,但我只是想看看是否有最佳实践,或者两个选项之一是否有代码气味 备选案文1: class CalcTax { private int Age; private double Income; public void Update(int age, double i

假设我有一个计算税收的类。这是设计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);

我可以走任何一条路。取决于对象应该表示什么

如果一个人有一个对象(我假设年龄和收入与一个人相关),并且该对象将做超出您显示的一个计算之外的各种事情,那么该人的基本属性(年龄、收入等)应该是阶级属性。这些可能被设置为
new()
的参数,或者可能在创建实例后不久设置

但是,如果这只是一个计算器对象,用于处理各种人的请求,那么根本不需要将年龄和收入作为类属性。您可以在选项2示例中完全删除它们,只需将它们放在calcTax()的参数中即可

它可能到此为止,其中一个选项与您的项目最匹配。但是,如果您正在创建更多的库函数,而其他程序员将在不同的项目中以不同的方式使用这些库函数,那么您可以跨越一些界限


将年龄和收入作为new()的参数,并将其保存为类属性。然后,将calcTax()的参数设置为可选,如果没有提供,则默认设置为类属性。这样,您的开发人员可以选择最适合他们需要的方法,并且您有一个单独的代码库来支持这两种方法。

正如第一条评论所说,选择权在您。试着想想你们班将扮演什么角色。它只是您可能想要调用的常用数学函数的集合。如果是这样,那么参数可以通过的方法就很好了

然而,如果您正在生成一个特定于特定上下文的税类,那么下面的内容可能最适合您。下面的示例需要年龄和收入,并将计算所得税作为只读属性提供

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

上述示例的一个好处是,年龄和收入是生成计算所得税价值所必需的。通过强制在构造函数中输入这些参数,您可以确保它们存在,否则(在本例中)如果这些是您仅有的三个属性,如果您不打算包含其中一个所需参数,则创建类的意义何在。

这取决于您。这个设计是你的。这个物体应该代表什么?税务计算器?为什么第二个选项有任何字段?