TDD与Design by Contract

摘要: 需求规范的表达形式有很多种,比如:自然语言描述的文档,UML的用例图。好的需求规范形式应该具备:精确性(易于验证),抽象性(简洁,具有概况能力,易于理解),完备性(覆盖需求的各个方面)。文档和UML用例图等传统的需求规范表达形式的不足,最明显的就是:1.精确性不足;2.在开发进程中容易与实现脱钩,难于维护。TDD的测试用例是作为一种新的需求规范表达形式而提出的,它一定程度上克服了精确性和可维护性的问题,但同时也丧失了抽象性。除此之外,Design by Contract的契约也是一种需求规范的表达形式,本文特别指出了契约同时具备抽象性和准确性的优势。不过,Bertrand没有特别强调的是:契约在表达能力即完备性方面还有所不足。因为,契约是通过无副作用的一些条件语句来表达的,并不是所有的需求规范都容易用这样的形式表达,而这恰好是TDD的优势。 阅读全文
posted @ 2010-09-08 15:50 Todd Wei 阅读(1619) 评论(0) 推荐(3) 编辑

对象和流

摘要: 人们常常看着照片回忆起从前,清晰地感觉到童年,青年,中年,老年一路走来的各种变化。从这种变化中,我们可以抽象出3个关键词:对象、时间和状态。对象拥有状态和标识,在标识不变的情况下,状态随时间发展演变。这代表了一种动态的世界观:时间本身并不属于世界,世界是在时间维度上不断演变的状态。在这种世界观的指导下,通过计算机程序模拟现实世界问题时,我们用计算机中的对象状态表示世界的状态,用计算机中对象的状态的变化表示世界状态的变化和时间进程。与上面动态的世界观不同,另一种世界观认为世界本质上是静止的。怎么理解呢?比如:一个历史人物,在他生活的每一天里都有变化,从这个角度看是状态的变化;但是如果纵观他的一生 阅读全文
posted @ 2010-08-22 13:26 Todd Wei 阅读(2644) 评论(4) 推荐(3) 编辑

TDD可以驱动设计吗?

摘要: 系统A的设计产生出了子系统a1,a2,a3,...的需求。虽然在子系统的层次上,TDD同样可以帮助我们用测试用例表达需求,但TDD的盲区在于它没法驱动系统的内部设计!我们不可能通过TDD直接推出A的内部如何进行模块分解,子系统之间如何协作。 阅读全文
posted @ 2010-08-07 11:01 Todd Wei 阅读(2434) 评论(16) 推荐(3) 编辑

理解值与引用

摘要: 面向对象分析和设计需要区分对象的值语义与引用语义。我的一块钱和你的一块钱相等,这是值语义;20岁的我和30岁的我是同一个人,这是引用语义。值对象包括2大特征:表示和运算;引用对象包括3大特征:标识、状态和行为。值对象只能被动地参与运算,引用对象拥有主动的行为。值对象的同一性建立在表示的基础上,而引用对象的同一性建立在标识的基础上。 阅读全文
posted @ 2010-07-24 15:48 Todd Wei 阅读(2910) 评论(26) 推荐(4) 编辑

OOP思维导论

摘要: 本文是面向初学者的OOP思维导论,包括:1.探讨数据的本质;2.介绍类型不变性;3.封装与数据抽象;4.TDD相关讨论 阅读全文
posted @ 2010-07-06 18:49 Todd Wei 阅读(4137) 评论(9) 推荐(10) 编辑

理解C++ dynamic_cast

摘要: 在面向对象程序设计中,有时我们需要在运行时查询一个对象是否能作为某种多态类型使用。与Java的instanceof,以及C#的as、is运算符类似,C++ 提供了dynamic_cast函数用于动态转型。相比C风格的强制类型转换和C++ reinterpret_cast,dynamic_cast提供了类型安全检查,是一种基于能力查询(Capability Query)的转换,所以在多态类型间进行转换更提倡采用dynamic_cast。本文主要介绍dynamic_cast的意义,用法和注意事项。 阅读全文
posted @ 2010-04-10 21:13 Todd Wei 阅读(47897) 评论(10) 推荐(6) 编辑

单一职责原则

摘要: 单一职责原则(Single Responsibility Principle,SRP)是Bob大叔提倡的S.O.L.I.D五大设计原则中的第一个。SRP比较容易让人望文生义产生误解。理解SRP的关键在于理解类的抽象层次,高层次的类是高层概念的抽象,低层次的类是低层概念的抽象。低层的变化只影响低层类,高层的变化只影响高层类。 阅读全文
posted @ 2010-01-31 15:26 Todd Wei 阅读(3632) 评论(12) 推荐(7) 编辑

依赖注入与对象间关系

摘要: 1.依赖注入和创建对象辨析;2.对象间4种横向关系;3.依赖注入方式的选择 阅读全文
posted @ 2009-12-10 09:05 Todd Wei 阅读(10703) 评论(61) 推荐(33) 编辑

理解boost::bind的实参传递方式

摘要: boost::bind在构造函数对象时,实参传递是采用传值方式的,中间会经过若干次的拷贝构造。对于不允许拷贝构造或拷贝构造性能开销较大的情形可以结合boost::ref增加一个wrapper层避免拷贝构造。 阅读全文
posted @ 2009-11-20 21:46 Todd Wei 阅读(1075) 评论(0) 推荐(0) 编辑

C# vs C++之三:静态构造函数

摘要: C++语言规范并未包含类似C#静态构造函数的东西,但在使用类之前做初始化工作的需求却是客观存在的。本文尝试通过C++的模版机制模拟实现静态构造函数,避免手动初始化的繁琐实现。本实现具有以下特点:在第一次构造类对象之前自动调用类提供的静态构造函数;静态构造函数被调用的时机是确定的;利用C++的局部静态变量初始化机制保证了线程安全性;基于继承的实现机制并未改变派生类的对象内存布局。 阅读全文
posted @ 2009-11-14 17:53 Todd Wei 阅读(5490) 评论(16) 推荐(3) 编辑