使用验证设置Date类的正确方法

时间:2015-02-10 20:35:56

标签: c# class conventions accessor mutators

我有一个课程如下:

class Date
{
    // Field variables
    private int day;
    private int month;
    private int year;

    // Default constructor
    public Date()
    {
        year = 2015;
        day = 0;
        month = 0;
    }

    // Overloaded constructor
    public Date(int _day, int _month, int _year)
    {
        setDay(_day);
        setMonth(_month);
        setYear(_year);
    }

    // Accessors
    public int getDay()
    {
        return day;
    }

    public int getMonth()
    {
        return month;
    }

    public int getYear()
    {
        return year;
    }

    // Mutators
    public void setMonth(int _month)
    {
        if (_month > 0 && _month <= 12)
        {
            month = _month;
        }
    }

    public void setYear(int _year)
    {
        if (_year >= 1700 && _year <= 2015)
        {
            year = _year;
        }
    }

    public void setDay(int _day)
    {
        if (_day > 0 && _day <= DateTime.DaysInMonth(year, month))
        {
            day = _day;
        }
    }

无效的部分是在setDay()方法中验证我的一天。 DateTime.DaysInMonth(year, month)(该方法检查特定月份中特定月份的天数以计算闰年和2月)在用户/应用程序数据通过分配之前,从默认构造函数值0调用数月它介于1到12之间。 我无法使用DateTime来验证整个事情,因为应用程序已设置好,因此用户可以输入0或0天的值,而这些值又不会以最终格式打印出一天或一个月。

一个建议是让我的setter私有,并为用户创建一个公共setDate方法,允许他们以任何顺序设置日,月和年...但我似乎无法实现正确地:

public void setDate(int _day, int _month, int _year)
{
    day = _day;
    month = _month;
    year = _year;
}

因为这只会在我的私人制定者中跳过我的验证。

我可以诚实地找到很多方法来使用非对流方法,但我只是需要帮助清理它以适应适当的类设计惯例。

2 个答案:

答案 0 :(得分:1)

在调用setMonth和setYear之前,您正在调用setDay(在重载的构造函数中)。由于您需要使用年份和月份来使用DayaInMonth,因此您需要先在构造函数中调用这些setter。

答案 1 :(得分:0)

我发布这个是因为我想出了&#34;建议&#34;我在原来的问题中提到过,由于我在这里得到了其他很好的答案。以防万一有人想这样做。

保持构造函数和其他所有内容的顺序相同,如果我像这样为setDate()创建一个公共setter:

public void setDate(int _day, int _month, int _year)
{
    setYear(_year);
    setMonth(_month);
    setDay(_day);
}

我可以将原始setter更改为private并按我指定的任何顺序调用它们(因为setYear()setMonth()都需要在setDay()之前调用)通过public方法中的方法调用,而不是直接为字段变量赋值。