Java 让二传手回球是个好习惯吗? 例如,考虑以下两个设置: bool setMonth(int month) { bool valid = false; if (month > 0 && month < 12) { this->month = month; valid = true; } return valid; } bool setMonth(整数月){ bool valid=false; 如果(月>0和月月=月; 有效=真; } 返回有效; }
对Java 让二传手回球是个好习惯吗? 例如,考虑以下两个设置: bool setMonth(int month) { bool valid = false; if (month > 0 && month < 12) { this->month = month; valid = true; } return valid; } bool setMonth(整数月){ bool valid=false; 如果(月>0和月月=月; 有效=真; } 返回有效; },java,c++,Java,C++,对 void setMonth(int month) { if (month > 0 && month < 12) { this->month = month; } } void setMonth(整数月){ 如果(月>0和月月=月; } } 第一种方法让类的客户机明确地知道集合是否失败。这被认为是好的做法吗?我不这么认为。这意味着无论何时设置,都必须检查操作是否成功。 出于可读性和逻辑性考虑,我认为提出一个例外是一个更好的主意。 我
void setMonth(int month) {
if (month > 0 && month < 12) {
this->month = month;
}
}
void setMonth(整数月){
如果(月>0和月<12){
本->月=月;
}
}
第一种方法让类的客户机明确地知道集合是否失败。这被认为是好的做法吗?我不这么认为。这意味着无论何时设置,都必须检查操作是否成功。
出于可读性和逻辑性考虑,我认为提出一个例外是一个更好的主意。
我发现:
/*program stuff*/
try{
YourObject.setMonth(0);
/* other stuff*/
}catch YourException{
/* recovery*/
}
是指:
/*program stuff*/
if(!YourObject.setMonth(0)){
/*recovery*/
}else{
/*stuff*/
}
在逻辑(我会说哲学)和可读性方面。如果是java(您标记了两种语言),那么最佳实践是从setter返回void。如果设置值失败,则引发异常。对于您的情况,您应该抛出month setter的
IllegalArgumentException
。当您想要跟踪插入到setter中的无效数据时,最好在setter中使用异常。在这种情况下,方法的签名为:
//throw exception when month is out of range
void setMonth(int month) throws InvalidMonthNumberException;
如果您想在月份超出范围时设置默认数据,请在javadoc中对此进行说明
/*
* If month < 1 or month > 12 default month (1) accepted
*/
void setMonth(int month);
/*
*如果月份<1或月份>12,则接受默认月份(1)
*/
无效设置月(整数月);
有人可能会说,使用布尔值作为返回类型并没有坏处。在最坏的情况下,你只是忽略检查
另一种观点可能认为抛出异常更优雅,信息也更丰富(比如Java的IllegalArgumentException
或Python的ValueError
),但这可能会导致更多的“麻烦”,因为异常必须以某种方式从客户端代码中处理
如果需要确保插入的值绝对正确,第三种方法是将允许的值封装在类、枚举或名称空间等结构实体中。
Java中的一个例子是:
public void setMonth(Month month){
this.month = month; // member month is now of type Month
}
public enum Month{
JANUARY(1),
FEBRUARY(2),
MARCH(3),
APRIL(4),
MAY(5),
JUNE(6),
JULY(7),
AUGUST(8),
SEPTEMBER(9),
OCTOBER(10),
NOVEMBER(11),
DECEMBER(12)
private int n;
private Month(int n){
this.n = n;
}
}
someObject.setMonth(Month.FEBRUARY);
使用的方法是:
public void setMonth(Month month){
this.month = month; // member month is now of type Month
}
public enum Month{
JANUARY(1),
FEBRUARY(2),
MARCH(3),
APRIL(4),
MAY(5),
JUNE(6),
JULY(7),
AUGUST(8),
SEPTEMBER(9),
OCTOBER(10),
NOVEMBER(11),
DECEMBER(12)
private int n;
private Month(int n){
this.n = n;
}
}
someObject.setMonth(Month.FEBRUARY);
(你可以在C++中使用命名空间实现同样的事情)
是否有一个好的做法是设置SETER?请只使用你实际编程语言的语言标记。它是一个设置者的无习惯用法,所以没有人会去寻找/期待。Imo抛出IllegalArgumentException会更好。请选择一种语言。如果回答时需要两种语言的专业知识,则只标记两种语言。答案为否,返回bool
是一个糟糕的主意。最好的答案是为月份创建一个用户定义的类型(类),它不能有不正确的值。下一个最好的方法是断言或异常。我不认为它更干净,但它肯定更有用,因为异常
对象可以为您提供有关该问题的信息,甚至在需要时传递其他数据。它还显示了错误处理的意图,而不是普通的控制流分支。是的,Exception
对象可以提供很多有用的信息!