`

C# 4.0中的契约式编程

阅读更多
一切从质量谈起

许多人在考虑软件开发的新方法和新工具时,都是把提高生产率或产量 (productivity)作为主要的期望目标。但是产量不仅直接受益于新的方法途径,也受益于对质量的重视。

软件质量的一个主要部分是可靠性(reliability):系统要能够完成所规定的任务( 正确性 -- correctness),也要能够妥善处理异常情况(稳固性 -- robustness)。

一言蔽之,可靠性就是系统没有错误故障。软件开发不管用什么方法,一般都对可靠性有很高的要求。尤其在OO方法中,可靠性更为重要,这是因为OO方法中复用性(reusability)扮演着特殊的角色:复用的软件部件的正确性必须高于一般的软件,否则复用就是空谈。

已知的一些提高软件质量的方法:

  • Static typing(静态类型)能够帮助及早抓住源码中那些不一致的部分,从而避免使其成为故障之源。
  • Garbage collection(垃圾收集),可以减少进行内存管理时容易犯的错误。
  • 复用:通过复用由信誉良好的机构开发或者反复验证的软件部件,从而提高软件的质量。


但还有更多事情需要我们自己处理,比如说错误。错误处理一直是软件开发者所面临的最大困难之一。Bjarne Stroustrup在谈到其原因时说道,能够探察错误的一方不知道如何处理错误,知道如何处理错误的一方没有能力探察错误,而直接采用防御性代码来解决,会使得程序的正常结构被打乱,从而带来更多的错误。

C++、Java、C#等其他语言对错误处理问题的途径是异常机制。这种机制在正常的程序执行流之外开辟了专门的信道,专门用来在不同程序模块之间报告错误,解决上述错误探察与处理策略分散的矛盾。

然而,有了异常处理机制后,开发者开始有一种倾向,就是使用异常来处理所有的错误。结果是有相当多的人,都认为异常是错误处理的通用解决方案。《The Pragmatic Programmer》在讲到错误处理时,有一句箴言:
  
    “只在真正异常的状况下使用异常。”

    书中举了一个例子,如果你需要当前目录下的一个名叫“app.dat”的文件,而这个文件不存在,这不叫异常状况,这是你应该预料得到的、并且显式处理的情况。而如果你要到Windows目录下寻找user.dat文件,却没找到,那才叫做异常状况——因为每一个正常运行的Windows系统都应该有这个文件。

    究竟应该如何看待错误?怎样才能最好地错误处理?

    在这两个问题上,我们所见到的大部分语言都没有给出很好的回答。C秉承一贯风格,把所有的东西推给开发者考虑;Ada发明了异常,但是又为异常所累(知道阿里亚纳5火箭的处女航为什么失败吗?);C++企图将Ada的异常机制融合进自己的体系中,结果异常成了C++中最难以处理的东西;Java和4.0之前的C#显然都没有耐心重新考虑错误处理这桩事,而只是简单的将C++的异常机制完善化了事。

权利与义务

一般的观点,在软件体系中,程序库和组件库被类比为server,而使用程序库、组件库的程序被视为client。我们往往对库程序和组件的质量提出很严苛的要求,强迫它们承担本不应该由它们来承担的责任,而过分纵容client一方,甚至要求库程序去处理明显由于client错误造成的困境。



在《面向对象软件构造》一书中讲到:“对于一个大型系统来说,光保证它的各组成部分的质量是不够的。而最有价值的是确保在任何两个组成部分的交接处设计明晰的彼此义务和权利规范,即所谓契约。”

这不是说仅仅定义各组成部分的接口、参数顺序等等就可以了,还必须准确定义各组成部分的相互通讯方式,以及通讯需要的条件。这就是契约式设计技术所包含的内容了。


分享到:
评论

相关推荐

    C#4.0语言规范 C#4.0语言规范C#4.0语言规范

    5. **泛型协变和逆变**:在C# 4.0中,泛型接口可以声明为协变或逆变,允许在泛型集合间更自由地进行赋值和方法签名的匹配,特别是在处理多态数据时。 6. **匿名类型**:C# 4.0增强了匿名类型的功能,可以用于临时...

    C#4.0权威指南电子书

    《C#4.0权威指南》是一本深受程序员喜爱的C#编程教程,全面而深入地介绍了C# 4.0版本的各种特性和技术。这本书不仅适合初学者,也适合有一定经验的开发者,帮助他们提升在.NET框架下使用C#进行软件开发的专业技能。 ...

    C#4.0权威指南

    在C#4.0中,最重要的新增特性之一是动态类型(dynamic)。这一特性允许你在运行时确定变量的类型,极大地提高了代码的灵活性。书中会详细讲解如何使用dynamic关键字,以及它在与IronPython、IronRuby等动态语言交互...

    全面揭秘 c# 4.0

    在C# 4.0中,委托和事件也得到了改进。引入了“可空委托”(null-conditional operators)和“可空引用类型”(nullable reference types),这些特性显著减少了空引用异常的可能性,提高了代码的健壮性。同时,匿名...

    C#4.0规范中文版PDF

    以下是一些C# 4.0中的关键知识点: 1. **动态类型(Dynamic Type)**:C# 4.0引入了`dynamic`关键字,允许在运行时确定变量的类型。这使得与动态语言如Python或JavaScript的交互变得更加便捷,例如使用IronPython或...

    C# 4.0完全参考手册

    Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF) 在C# 4.0中的集成,使服务和工作流的结合更加紧密: 1. **WCF Data Services**:基于RESTful的架构,用于构建和消费数据服务。 2. **...

    C#4.0图解教程个人笔记

    5. **泛型接口约束**:在C# 4.0中,你可以为泛型接口添加协变和逆变约束,这使得类型转换更加灵活,增加了代码的复用性。 6. **扩展方法(Extension Methods)**:扩展方法允许你向现有类型添加新功能,而无需继承...

    c#4.0编程 源代码

    其次,C#4.0中的委托和事件也得到了增强,支持多播委托,即一个委托可以链接多个方法,使得事件处理更加灵活。此外,匿名方法和Lambda表达式进一步提升了代码的简洁性和可读性,它们可以方便地创建闭包,用于 LINQ ...

    C# 4.0 的4个新特性

    在C# 4.0中,可以更加简洁地实现接口成员而不必显式地指定它们。这种新的隐式接口实现方式使得类看起来更干净,同时也避免了一些常见的命名冲突问题。 **示例代码**: ```csharp public class Foo : IList { ...

    C#4.0权威指南原书+源码

    5. **改进的异步编程模型**:虽然在C#5.0中引入了`async`和`await`关键字,但C#4.0也对异步编程进行了优化,为后来的改进奠定了基础。 书中可能包含的章节和知识点: 1. **基础语法**:包括变量、数据类型、控制...

    MSDN C# 4.0编程指南

    在C# 4.0中,多语言互操作性(也称为COM互操作)得到了显著提升。通过添加“指定默认接口实现”的功能,C#能够更好地与旧版的COM组件协同工作,减少代码的复杂性。此外,C# 4.0还支持命名和可选参数,这使得调用方法...

    C#4.0权威指南 源代码

    《C# 4.0权威指南》是一本深入解析C#编程语言的重量级书籍,其源代码提供了丰富的实例和示例,旨在帮助读者更好地理解和掌握C# 4.0的关键特性和用法。这份资源包含了五个部分的源码,分别在五个不同的RAR文件中,...

    《C#4.0捷径教程》配套源码

    此为C#4.0捷径教程 一书的配套源码 好评如潮的C# 4.0实战图书 汲取.NET技术精髓的捷径 专章讲述习惯用法与设计模式 本书是经典教程的全面升级,通过许多精彩的示例介绍了C# 语言的每个新特性,深入浅出地讲解了C#...

    C#4.0权威指南.pd

    语法篇对C#的语法进行了系统而全面的讲解,包括标识符和关键字、变量和常量、类型以及类型转换、表达式和运算符、语句、方法、类、继承、多态、接口、结构、枚举、委托、事件、泛型、数组、集合、字符串和正则表达式...

    C#4.0编程(第6版)含源代码

    《C#4.0编程(第6版)》是一本专为C#初学者和进阶者准备的权威指南,作者Ian Griffiths、Matthew Adams和Jesse Liberty在书中深入浅出地介绍了C# 4.0的核心概念和技术。这本书不仅包含丰富的理论知识,还提供了大量的...

    Programming C# 4.0 6th.Edition

    扩展方法在C# 3.0中已经引入,但在4.0中得到了进一步优化和完善。同时,C# 4.0还引入了命名空间别名,允许开发者使用简短的别名来引用复杂的命名空间,提高代码的可读性和简洁性。 #### 4. 并行LINQ (PLINQ) C# ...

Global site tag (gtag.js) - Google Analytics