【问题标题】:Proper way to set up Date class with validation使用验证设置 Date 类的正确方法
【发布时间】:2015-02-10 20:35:56
【问题描述】:

我有一堂课如下:

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)(该方法检查给定年份中特定月份的天数以考虑闰年和二月)在用户/应用程序数据传递之前的几个月内从默认构造函数值 0 调用以分配它一些东西1到12之间。 我不能使用 DateTime 来验证整个事情,因为设置了应用程序,因此用户可以为日或月输入 0 值,而这又不会以最终格式打印出日或月。

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

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

因为这只是跳过了我在私人设置器中的验证。

老实说,我可以找到很多方法来让它与非传统方法一起工作,但我只需要帮助清理它以适应适当的类设计约定..

【问题讨论】:

  • 更改构造函数的顺序以确保首先设置月份和年份。如果您允许月/年为零,那么您必须在 setDay 例程中考虑这一点。

标签: c# class conventions accessor mutators


【解决方案1】:

在调用 setMonth 和 setYear 之前,您正在调用 setDay(在您的 Overloaded 构造函数中)。由于您需要年份和月份才能使用 DayaInMonth,因此您需要先在构造函数中调用这些设置器。

【讨论】:

  • 谢谢!我不敢相信我看起来像那样,但这正是我的问题。
【解决方案2】:

我发布这个是因为我想出了我在原始问题中提到的“建议”,因为我在这里收到了其他很好的答案。以防万一有人想这样做。

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

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

我可以通过公共方法中的方法调用将原始设置器更改为私有并以我指定的任何顺序调用它们(因为setYear()setMonth() 都需要在setDay() 之前调用),而不仅仅是分配值直接到字段变量。

【讨论】:

    猜你喜欢
    • 2020-10-23
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多