隐藏作为面向对象主要特性中的重要特性,封装隐藏是面向对象中重要的特性,一个好的面向对象代码肯定是对对象的内部细节做到很好的隐藏封装,封装过后才有是多态,委派之类的。一个好的面向对象的代码一定是具有很好的隐藏封装,易于测试,不稳定因素往往集中在一处很小或者固定的位置,不稳定因素的变更不会导致更大面积的修改扩散。

  对象的隐藏要求:方法不应和任何调用方法返回的对象操作,换句话之和朋友说话,不和陌生人说话(迪米特法则,或被译为小知识原则),比如:ctxt.getOptions().getSearchDir().getAbsolutePath(),是迪米特法则的反例模式。

  五:异常处理

  每个软件系统都避不开异常处理,需要防止它搞乱我们的逻辑。

  利用异常处理代替返回异常编码,返回异常编码会是的代码中充满了if/else,switch/case扰乱我的代码流转。

  对于特定异常扑捉,可以面向异常编程,编写特定的异常类,使得对异常封装转化,更容易捕善后获处理。

  避免返回null,在软件系统中常见头疼的是NullReferenceException。在非特定场景下,我们应该极力的避免返回null。面对这种场景我们可以采用null object Pattern(空对象模式)返回特例对象,如c#类库中的Guid.Empty,string.Empty;对于集合类型我们可以返回长度0的空集合而非null;

  六:边界

  在系统开发中不可能一切都得从零开始,自己写所有的代码,更好的方案是需要整合一些开源或者第三方的项目,为我所用。但是不能让这些非自己的代码渗侵中我们的代码各处,有一些所以功能很强大的第三方产品,但不一定具有很好的抽象。很多时候我更宁愿花些时间抽象出我们自己所需要的接口在第三方类库上外覆一层自己的抽象,这样不仅便于TDD,因为我们能够很好的创建伪对象,使的测试独立不依赖外部资源,得到快速反馈;而且在设计上得到很好的扩展,当由于某些原因如第三方类库不再能满足业务需求,或者权益收费等等,我们可以很好的切换底层而使得修改不会扩散到系统各处。外覆类也是处理遗留代码带入测试容器的一种很好实践。

  七:单元测试

  TDD中测试代码在往往和产品代码差不多,在系统中占据一半的代码量,不好的测试代码也可能拖累项目的开发。整洁的测试代码应该是遵循first原则的:

  快速(Fast):测试应该快速,因为需要不断的运行测试得到反馈,我们需要的快速反馈,错误的快速定位。所以你的测试不能依赖太多的外部资源,数据库,硬件环境等等,对于这些外部资源应该采用伪对象模式来隔离。

  独立(Independent):测试应该是独立的,独立于测试用例之间,独立于特定的环境,独立于测试的运行顺利。数据的独立通常采用两种独立方式,每个测试环境的独立,很多时候我们希望每个测试运行完成后环境(如数据库)和运行前保持一致,如数据库高层次测试我们更希望在每次测试完成后不会带来多余或者改变数据。再则是数据的隔离,我们的行为测试(BDD,集成高角度的测试)都会依赖一些固定的信息,通常是登陆系统的人员,我们可以采用么个测试建立一个不同的登陆人员来使的每个测试之间的s数据隔离。