我经常遇到这个问题,特别是在Java中,即使我认为这是一个普遍的OOP问题。即:引发异常会揭示设计问题。
假设我有一个包含一个String name
字段和一个String surname
字段的类。
然后,它使用这些字段来组成一个人的全名,以便将其显示在某种文件上,例如发票。
public void String name;
public void String surname;
public String getCompleteName() {return name + " " + surname;}
public void displayCompleteNameOnInvoice() {
String completeName = getCompleteName();
//do something with it....
}
现在,我想通过displayCompleteNameOnInvoice
在分配名称之前调用引发错误来增强类的行为。似乎是个好主意,不是吗?
我可以在getCompleteName
方法中添加引发异常的代码。但是以这种方式,我违反了与类用户的“隐式”合同。通常,如果未设置获取方法的值,则不应将其抛出异常。好的,这不是标准的获取方法,因为它不会返回单个字段,但是从用户的角度来看,区分可能太微妙了,无法考虑它。
或者,我可以从中抛出异常displayCompleteNameOnInvoice
。但是,这样做我应该直接测试name
或surname
字段,这样做会违反表示的抽象getCompleteName
。检查并创建完整名称是此方法的责任。根据其他数据,它甚至可以决定在某些情况下足够了surname
。
因此,唯一的可能性似乎是将方法的语义更改getCompleteName
为composeCompleteName
,这表明行为更“活跃”,并且具有抛出异常的能力。
这是更好的设计解决方案吗?我一直在寻找简单性和正确性之间的最佳平衡。有针对此问题的设计参考吗?
displayCompleteNameOnInvoice
如果getCompleteName
返回则可以抛出异常null
,不是吗?