.NET, Software Design, 存档

通宵软件设计提示: 提示 #2

Jason / 十二月 20, 2008

对于《四夜的软件设计提示》的第二部分, 我想谈一些关于异常的问题。. net 中的异常提供了处理错误的绝佳方法。我们都知道不要使用异常来控制流, 但还有许多其他方法可以滥用异常。

滥用异常可以是任何东西, 从引发基本异常类, 到抛出的不仅仅是异常。但最常见的滥用异常处理的方法是简单地压制它们。我们都看到了一些应用程序, 它们执行类似于以下操作:

某业务对象 bo = SomeBusinessObject.LoadWithId(4);
尝试 {
    博。值 = int。分析 (txt text领域. text);
} 捕获 {
   值不是 int..。所以忽略它。
}
博。保存 ();

抑制异常的问题在于, 大多数组件并不只是为了好玩而抛出异常, 因此首先引发异常的一些根本原因。

上面的例子看起来足够无辜。int32 的 parse 方法如果无法解析输入字符串, 则会引发异常。但是, 如果将来另一个开发人员认为业务对象的 "某种价值" 需要某种限制可接受值的业务规则, 该怎么办?

公共类某些业务对象 { 其他类代码 公共 int 某些值 { 获取 {返回 _ 某个值;} 集 { 如果 (值< 0)></ 0)> 引发新的业务规则异常 ("某些值的无效值"); _ 值 = 值; } } } read more

.NET, Software Design, 存档

gdi + 中出现的一般错误

Jason / 十月 14, 2008

您知道, 当应用程序崩溃时, 您做得很好, 但有一个例外, 如 "gdi + 中发生了一般错误"。这是关于, 以及通用, 因为它得到:-)

在我的特殊情况下, 我正在使用 fromstream 方法在我的 dao 中构建一个图像, 如下所示:

图像结果;
使用 (filestream 文件 = file. openread (文件名)) {
	结果 = 图像. fromstream (文件);
	文件。关闭 ();
}
返回结果;

我这样做是为了让我知道一个事实, 即文件被正确处置。我不想有任何孤立的文件引用锁定该文件的情况下, 我需要删除它。

问题是, 在我的 ui 中, 我试图调用 image 上的 save 方法, 将其内容转储到 asp. net 响应流, 如下所示:

Img。保存 (HttpContext.Response.OutputStream, imageforma. jpeg); read more

C#, Software Design, 存档

使用合同测试测试软件合同

合同, 无论是明示的还是隐含的, 都是设计工作软件系统的关键。c# 中显式协定的一个示例是接口的实现, 而隐含协定将是与所有业务对象具有默认构造函数的内容类似的内容。这两种类型的合同对于软件系统的成功至关重要, 但您如何测试和执行这些合同?

明确的合同通常由编译器强制执行, 并不像隐含合同那样脆弱。使用 ContractTest 测试框架, 您可以为许多常见的隐含合同编写测试用例。您可以将 ContractTest 断言直接合并到现有的单元测试中。对于下面的示例, 我将使用 nunit 语法, 但您可以使用大多数其他单元测试框架。

例如, 假设您要测试某个业务对象上是否存在可公开访问的默认构造函数。使用合同测试的这样的测试看起来就像。

使用合同测试. 断言; 使用 nunit. framework; 使用 mynamespace. 业务对象; [测试夹具] 公共类采样测试 { [测试] 公共空白试验 1 () { ContractAssert.Type.HasPublicDefaultConstructor<BizObjectA>();</BizObjectA> } } read more