2017-06-17 70 views
-1

例如,请考虑以下两个setter方法:让一个setter返回一个bool是否是一个好习惯?

bool setMonth(int month) { 
    bool valid = false; 
    if (month > 0 && month < 12) { 
     this->month = month; 
     valid = true; 
    } 
    return valid; 
} 

void setMonth(int month) { 
    if (month > 0 && month < 12) { 
     this->month = month; 
    } 
} 

第一个让类的客户端明确知道集是否失败。这被认为是良好的做法?

+3

是根本不是一个好习惯吗? – 2017-06-17 16:54:11

+2

请仅使用语言标记来表示您实际编程的语言。 –

+3

这是一个二传手的非惯用用法,所以没有人会期待/期待。抛出IllegalArgumentException异常会更好。 –

回答

5

我不这么认为。这意味着,无论何时你设置了一些东西,你都必须检查操作是否成功。
我认为引发一个异常将是一个更好的主意,可读性和逻辑。
我发现:

/*program stuff*/ 
try{ 
    YourObject.setMonth(0); 
    /* other stuff*/ 
}catch YourException{ 
/* recovery*/ 
} 

是清洁剂:

/*program stuff*/ 
if(!YourObject.setMonth(0)){ 
    /*recovery*/ 
}else{ 
    /*stuff*/ 
} 

在逻辑上(我要说哲学)和可读性。

+0

我不会说它更干净,但它绝对更有用,因为'Exception'对象可以为您提供关于该问题的信息,或者甚至在需要时传递其他数据。它还显示了错误处理的意图,而不是普通的控制流分支。 –

+0

“清洁”我的意思是避免控制流分支,我的坏。是的,'Exception'对象可以提供很多有用的信息! – magicleon

1

如果是java(你标记了两种语言),那么最好的做法是从setter中返回void。如果未能设置值,则抛出异常。对于你的情况,你应该丢弃月份设置器的IllegalArgumentException

2

当您想要追踪插入到它们的无效数据时,更好地在setter中使用异常。在方法的这种情况下,签名是:

//throw exception when month is out of range 
    void setMonth(int month) throws InvalidMonthNumberException; 

如果你想设置默认数据时的月份是出在Javadoc范围discribe这一点。

/* 
* If month < 1 or month > 12 default month (1) accepted 
*/ 
void setMonth(int month); 
3

有人会认为使用boolean作为返回类型不受到伤害。在最坏的情况下,你只是忽略检查。

另外一个可以说,抛出异常是更优雅,更翔实的太(如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; 
    } 
} 

和使用,这将是的方式:(可以实现在C命名空间++一样的东西)

someObject.setMonth(Month.FEBRUARY); 

相关问题