假设我有一个方法
public Patient(int id) { ---- }
返回给定id的Patient对象..我可以用两种方式定义合同
如果患者不存在,方法将返回null
如果患者不存在,方法将抛出异常.在这种情况下,我还将定义一个查询方法,如果Patient存在于数据库中则返回true,否则返回false ...
我应该使用哪种合同?还有其他建议吗?
更新:请对这个案例发表评论...如果它不是一个数据库分配的ID,它是用户在UI中输入的东西..比如SSN ..那么哪一个更好..
关于Steve认为有效的Null模式的评论:这里可能不是一个好主意,因为当ID不存在时立即知道它真的很有用.
我也认为这里的Null模式会有点沉重
Rob Wells对抛出异常的评论,因为它的错误ID:我不认为患者姓名中的拼写错误是一种特殊情况"恕我直言
请记住,"通过线路"到另一层(无论是数据库还是应用程序服务器)是您可以执行的最昂贵的活动之一 - 通常网络调用将比内存调用长几个数量级.
因此,在构建API时避免冗余调用是值得的.
考虑一下,如果你的API是这样的:
// Check to see if a given patient exists public bool PatientExists(int id); // Load the specified patient; throws exception if not found public Patient GetPatient(int id);
然后你可能会两次打到数据库 - 或者依赖于良好的缓存来避免这种情况.
另一个考虑因素是:在某些地方,您的代码可能具有"已知良好"ID,而在其他地方则不然.每个位置都需要一个关于是否应该抛出异常的不同策略.
这是我过去常用的一种模式 - 有两种方法:
// Load the specified patient; throws exception if not found public Patient GetExistingPatient(int id); // Search for the specified patient; returns null if not found public Patient FindPatient(int id);
显然,可以通过调用FindPatient()来构建GetExistingPatient().
这允许您的调用代码获得适当的行为,如果出现错误则抛出异常,并避免在不需要的情况下处理异常.