通过验证设置日期 class 的正确方法
Proper way to set up Date class with validation
我有一个class如下:
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)
(该方法检查给定年份的特定月份有多少天以计算闰年和二月)在 users/application 数据通过之前的月份从默认构造函数值 0 调用给它分配 1 到 12 之间的值。
我无法使用 DateTime 来验证整个事情,因为应用程序已设置为用户可以为日或月输入 0 值,这反过来不会以最终格式打印出日或月。
一个建议是将我的 setter 设为私有,并为用户制作一个 public setDate 方法,允许他们以任何顺序设置日、月和年...但我不能似乎正确实施:
public void setDate(int _day, int _month, int _year)
{
day = _day;
month = _month;
year = _year;
}
因为这只是跳过了我在我的私有设置器中的验证。
老实说,我可以找到很多方法让它与非传统方法一起工作,但我只需要帮助清理它以适应适当的 class 设计约定..
您在调用 setMonth 和 setYear 之前调用了 setDay(在您的重载构造函数中)。由于您需要年份和月份才能使用 DayaInMonth,因此您需要先在构造函数中调用这些设置器。
我发布这个是因为我想出了我在原来的问题中提到的 "suggestion",因为我在这里收到了其他很好的答案。以防万一有人想这样做。
保持构造函数和其他所有内容的顺序相同,如果我像这样为 setDate() 创建 public setter:
public void setDate(int _day, int _month, int _year)
{
setYear(_year);
setMonth(_month);
setDay(_day);
}
我可以将原来的 setters 更改为私有的,并以我指定的任何顺序调用它们(因为 setYear()
和 setMonth()
都需要在 setDay()
之前调用)通过 public 方法中的方法调用,而不是直接为字段变量赋值。
我有一个class如下:
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)
(该方法检查给定年份的特定月份有多少天以计算闰年和二月)在 users/application 数据通过之前的月份从默认构造函数值 0 调用给它分配 1 到 12 之间的值。
我无法使用 DateTime 来验证整个事情,因为应用程序已设置为用户可以为日或月输入 0 值,这反过来不会以最终格式打印出日或月。
一个建议是将我的 setter 设为私有,并为用户制作一个 public setDate 方法,允许他们以任何顺序设置日、月和年...但我不能似乎正确实施:
public void setDate(int _day, int _month, int _year)
{
day = _day;
month = _month;
year = _year;
}
因为这只是跳过了我在我的私有设置器中的验证。
老实说,我可以找到很多方法让它与非传统方法一起工作,但我只需要帮助清理它以适应适当的 class 设计约定..
您在调用 setMonth 和 setYear 之前调用了 setDay(在您的重载构造函数中)。由于您需要年份和月份才能使用 DayaInMonth,因此您需要先在构造函数中调用这些设置器。
我发布这个是因为我想出了我在原来的问题中提到的 "suggestion",因为我在这里收到了其他很好的答案。以防万一有人想这样做。
保持构造函数和其他所有内容的顺序相同,如果我像这样为 setDate() 创建 public setter:
public void setDate(int _day, int _month, int _year)
{
setYear(_year);
setMonth(_month);
setDay(_day);
}
我可以将原来的 setters 更改为私有的,并以我指定的任何顺序调用它们(因为 setYear()
和 setMonth()
都需要在 setDay()
之前调用)通过 public 方法中的方法调用,而不是直接为字段变量赋值。