我想知道,对象验证的最佳做法是什么。对案例一或案例二有任何额外的争论吗?还有另一种方式吗?
我不搜索任何验证库,我只是想做简单的验证。
案例一
class A {
public void doSomething(MyObject o) {
try {
validate(o);
doSomethingUseful(o);
} catch (ValidationException e) {
Logger.getLogger().warn(e);
}
}
private void validate(MyObject o) throws ValidationException
{
if (o.getXYZ() == null)
throw new ValidationException("Field XYZ cannot be null");
}
private void doSomethingUseful(MyObject o) { //some funny stuff }
}
案例二
class A {
public void doSomething(MyObject o) {
if (validate(o)) {
doSomethingUseful(o);
} else
Logger.getLogger().warn("Object is invalid");
}
}
private boolean validate(MyObject o)
{
if (o.getXYZ() == null) return false;
return true;
}
private void doSomethingUseful(MyObject o) { //some funny stuff }
}
答案 0 :(得分:7)
如果您只是吞下异常并且验证方法只是私有的,那么更喜欢case two
,因为您不应该使用普通逻辑的异常。
如果您想让客户端处理您应该处理的异常,请使用case one
,但让它抛出而不是吞咽。
答案 1 :(得分:2)
Here是Joel Spolsky写的一篇很好的文章,可以考虑阅读。就个人而言,我更喜欢第二种情况。处理异常可能会变得混乱IMO。
答案 2 :(得分:1)
在第二种情况下,方法validate
永远不会抛出ValidationException
,所以如果你想管理多个异常(null,格式错误......),我建议你使用第一个,这样你就可以返回一个清晰有用的错误信息。
答案 3 :(得分:1)
如果你真的只进行1次字段验证,那么情况2就更好了,因为很明显对象有什么问题。
如果您需要有关验证错误的更多信息,或者您需要传递多个验证错误,那么您可以使用异常对象作为传递其他信息的容器。
答案 4 :(得分:0)
我认为您可以设计此代码的另一种方法是使用面向方面编程。您添加的验证代码是某种令您担忧的业务代码。如果使用方面,则可以避免使用验证代码污染代码。您可以参考本文http://www.developer.com/java/5-reasons-java-developers-should-learn-and-use-aspectj.html,其中显示了使用Aspects进行验证的用例。