当前位置:  开发笔记 > 运维 > 正文

哪个合同(按合同设计)更好?

如何解决《哪个合同(按合同设计)更好?》经验,为你挑选了1个好方法。

假设我有一个方法

public Patient(int id)
{
    ----
}

返回给定id的Patient对象..我可以用两种方式定义合同

    如果患者不存在,方法将返回null

    如果患者不存在,方法将抛出异常.在这种情况下,我还将定义一个查询方法,如果Patient存在于数据库中则返回true,否则返回false ...

我应该使用哪种合同?还有其他建议吗?

更新:请对这个案例发表评论...如果它不是一个数据库分配的ID,它是用户在UI中输入的东西..比如SSN ..那么哪一个更好..

关于Steve认为有效的Null模式的评论:这里可能不是一个好主意,因为当ID不存在时立即知道它真的很有用.

我也认为这里的Null模式会有点沉重

Rob Wells对抛出异常的评论,因为它的错误ID:我不认为患者姓名中的拼写错误是一种特殊情况"恕我直言



1> Bevan..:

请记住,"通过线路"到另一层(无论是数据库还是应用程序服务器)是您可以执行的最昂贵的活动之一 - 通常网络调用将比内存调用长几个数量级.

因此,在构建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().

这允许您的调用代码获得适当的行为,如果出现错误则抛出异常,并避免在不需要的情况下处理异常.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有