摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接过去的。记得当时一口气看完了整个系列并没有多少感觉,因为这些基本上项目都在使用,只是我们没有专门把它标示和整理出来,所以也没有引起多大的重视。现在突然接手这个重构项目,由于团队成员技术和经验参差不齐,所以有必要专门整理一个重构的纲要,当然这个系列也非常适合做新系统的代码规范参考,只要有代码的地方,这个重构规范就很有价值。周末也不想出去闲逛,因为在刚到这个美丽的城市,没有亲戚或者朋友,所以才能静下心来两天时间写完这个重构参考规范。同时也感受了Windows Live writer写文章的快感。当然重构的整体架构得另当别论(整体架构在我的这篇文章有专门的讲解(http://www.cnblogs.com/zenghongliang/archive/2010/06/23/1763438.html)。大的架构设计好了以后,这些重构细节点就成了东风之后的大火,对整个项目也是至关重要。31天重构这个系列和《代码大全》、《重构:改善既有代码的设计》比较起来最大的特点就是比较简单、浅显易懂。那么我这些文章也都是学习Sean Chambers的31天重构的笔记整理,所以如果大家对这个笔记有任何异议也可以指出。

具体也可以通过http://www.lostechies.com/blogs/sean_chambers/archive/2009/07/31/31-days-of-refactoring.aspx查看原文。

概念:本文中的”避免双重否定”是指把代码中的双重否定语句修改成简单的肯定语句,这样即让代码可读,同时也给维护带来了方便。

正文:避免双重否定重构本身非常容易实现,但我们却在太多的代码中见过因为双重否定降低了代码的可读性以致于非常让人容易误解真正意图。存在双重否定的代码具有非常大的危害性,因为这种类型的代码容易引起错误的假设,错误的假设又会导致书写出错误的维护代码,最终会导致bug产生。具体可以看下面的代码:

using  System.Collections.Generic;using  LosTechies.DaysOfRefactoring.SampleCode.BreakMethod.After;

namespace  LosTechies.DaysOfRefactoring.SampleCode.DoubleNegative.Before{public class  Order{public void  Checkout(IEnumerable<Product> products, Customer  customer)        {if  (!customer.IsNotFlagged)            {// the customer account is flagged                // log some errors and returnreturn;            }

// normal order processing}    }

public class  Customer{public decimal  Balance { get; private set; }

public bool  IsNotFlagged        {get  { return  Balance < 30m; }        }    }}
如上代码中的双重否定可读性非常低,因为我们很难搞明白双重否定的正确值。要重构它也非常容易,如下是重构后的代码:
using System.Collections.Generic;using LosTechies.DaysOfRefactoring.SampleCode.BreakMethod.After;

namespace LosTechies.DaysOfRefactoring.SampleCode.DoubleNegative.After{public class Order{public void Checkout(IEnumerable<Product> products, Customer customer)        {if (customer.IsFlagged)            {// the customer account is flagged                // log some errors and returnreturn;            }

// normal order processing}    }

public class Customer{public decimal Balance { get; private set; }

public bool IsFlagged        {get { return Balance >= 30m; }        }    }}

 

总结: ”双重否定“很容易让人产生错误的判断,也很难让人理解你的代码,所以这个重构在我们的代码中是很重要的,尤其是在判断条件很多且业务复杂的时候。

原文链接: http://www.cnblogs.com/KnightsWarrior/archive/2010/06/29/1767510.html

转载于:https://my.oschina.net/chen106106/blog/43818

31天重构学习笔记26. 避免双重否定相关推荐

  1. 31 天重构学习笔记26. 避免双重否定

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有 订阅 Sean Chambers的blog,所以是在国外的社区上闲逛的时候 ...

  2. 31 天重构学习笔记索引

    由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接过去的 ...

  3. 31天重构学习笔记下载

    前言 前两天写了一篇程序猿也爱学英语(上),有图有真相的文章,写作那篇文章只是自己一时兴起,或者说是自己的兴趣使然.文中的观点只是自己的学习心得和体会,属一家之言且鉴于本人不是学英语出身,所以也肯定有 ...

  4. 31 天重构学习笔记5. 提升字段

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接 ...

  5. 31 天重构学习笔记28. 为布尔方法命名

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年 10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链 ...

  6. 31 天重构学习笔记29. 去除中间人对象

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年 10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链 ...

  7. 31天重构学习笔记3. 提升方法

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接 ...

  8. 31 天重构学习笔记14. 分离职责

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有 订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链 ...

  9. 31 天重构学习笔记9. 提取接口

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接 ...

最新文章

  1. 3ds Max V-Ray5 完整指南大师班视频教程
  2. Tomcat启动分析server.xml
  3. 启用第三方Chrome插件
  4. Linux从零开始(二、基础命令)
  5. 国家开放大学计算机应用模块3客观题答案,国家开放大学《计算机应用基础》考试与答案形考任务模块3模块3Excel2010电子表格系统—客观题答案.pdf...
  6. 龙头地位无可撼动!腾讯占全球游戏市场15% 连续6年登营收榜首
  7. 中国内置扬声器市场趋势报告、技术动态创新及市场预测
  8. Redis 通配符查找及批量删除key
  9. pycharm双击没有反应(Idea机制与之相同)
  10. 17.nginx 的 rewrite 功能
  11. Android基本动画
  12. Go基础-go的源码文件以及常用命令
  13. amazeui学习笔记--css(HTML元素1)--按钮Button
  14. CMakeLists.txt文本编辑工具
  15. 华硕e202s安装linux系统,华硕笔记本E202S原装win10系统可以改win7吗?
  16. Linux服务器性能评估
  17. SQL DML操作之增删改查
  18. Tuscany插件的安装
  19. 千锋教育威哥学Java——爆破专栏丨Spring Security系列教程之解决Spring Security环境中的跨域问题
  20. Go语言入门-《Go程序设计语言》学习笔记

热门文章

  1. 《用Castor 处理XML文档》学习笔记
  2. 【单片机基础】C51语言基础
  3. 用 Python 进行金融数据可视化
  4. Linux智能家居项目
  5. Android_学习安卓必备网址
  6. Web前端工程师怎么样呢?薪资待遇如何呢?
  7. Linux:shell 脚本 自动解压压缩文件tar.gz到指定目录
  8. 三维点云论文——图片常用格式LaTeX排版
  9. 应届生求职经历-一路坎坷
  10. 完成清除工作,可以Destory窗口标志