读书频道 > 软件开发 > C# > C#测试驱动开发
3.3.8 Try/Catch过多
2013-03-04 14:13:06     我来说两句 
收藏    我要投稿   

本文所属图书 > C#测试驱动开发

如果您希望编写易于实现和维护的可靠软件,那您需要使用测试驱动开发(tdd)。这本实用手册将向您展示如何创建高效的tdd过程。在用c#编写的源代码及示例的帮助下,作者带您从头到尾体验tdd方法,并向您展示如何将这...  立即去当当网订购

处理异常是应用程序开发过程中非常重要的一项任务。我的开发团队有一些标准规则:永远都不应当让用户遇到未经处理的异常。但并不是说每行代码都应当放在Try代码块中——只有那些可能发生异常的代码块才应当放在里面。这些内容的详尽列表已经超出了本书的范围。应当放在Try/Catch代码块中的常见任务包括连接到一个数据库或与其交互、处理文件、调用Web服务。

与If和Switch代码块非常类似的是,将不必放在Try/Catch代码块中的东西移走也很容易:
public Customer GetCustomer(string customerId)
{
try
{
var command = new SqlCommand();
var reader = command.ExecuteReader();
var customer = new Customer();
while (reader.Read())
{
customer.CustomerId = customerId;
customer.CustomerName = reader["CustomerName"].ToString();
customer.CustomerStatus = reader["CustomerState"].ToString();
customer.LoyaltyProgram = reader["CustomerLoyaltyProgram"]. ToString();
}
return customer;
}
catch (Exception exception)
{
_logger.LogException(exception);
var customer = new Customer {CustomerStatus = "unknown"};
return customer;
}
}

除了使用ADO.NET的最佳实践之外,可以看出,该方法也有与前面示例相同的一些问题。对于初学者来说,该方法不仅创建和执行了用于从数据库中检索客户的命令,还包含了一些代码,用于处理可能出现的异常。这样做虽然很巧妙,但在不同程度上违反了SRP。

Try代码块中的代码正在执行两件互相分离的任务:创建ADO.NET命令,从数据库中获取客户;然后将来自读取器的数据映射到客户对象。这看起来好像是一项任务,但它实际上代表两条改变理由。如果用于获取客户的存储过程改变其输入参数,用于建立此命令的代码也必须改变。如果从存储过程返回的客户数据集的数据结构发生了变化,或者是客户类本身的数据结构发生了变化,那就是另一个理由了。

Catch代码块中还有另外一处违反SRP的地方。该方法包含了处理一种异常的代码,该异常可能是因为调用数据库而导致的。这是一个改变理由。对于在检索客户时所出现的异常,当前的处理算法是记录该异常,并返回一个“未知”状态的客户对象。明天,该过程可能会变得完全不同。这意味着出现另一个修改此方法的理由。

除了大量违反SRP之外,Try/Catch代码块的过度膨胀也使该方法显得长了一些,引入了一些不必要的复杂度。根据SRP,Try/Catch代码块(调用一个工作单元,捕获被引发的异常)的结构足以作为其内部及本身进行修改的理由,不应当与业务逻辑或其他基础结构逻辑混合在一起。3.4.2小节将纠正这一方法中的问题。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.3.7 If/Switch过多
下一篇:3.4.1 析取类或接口
相关文章
图文推荐
2.2.3 对程序进行调
2.2.2 编译和运行程
2.2.1 创建控制台项
2.1 开发环境的搭建
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站