课堂上的方法。你应该设置属性并让方法使用属性或传递参数吗?

时间:2016-02-11 03:22:40

标签: class oop

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

2 个答案:

答案 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值。通过强制在构造函数中输入这些参数,确保它们存在,否则(对于此示例)如果这些是您唯一的三个属性,如果您不打算包含其中一个属性,那么创建类的重点是什么必需参数。