重构改善既有代码的设计--简化条件表达式

一 简化条件表达式

这个是几乎所有的工程都会存在的问题,不当的条件表达式造成代码的冗余。

下面我们列出普遍的问题,并给出一般的应对方法。

【1】条件判断过长,表达不清晰。

 if((i!=0&&i == m_nDClickIndex[1])&&(m_nDClickIndex[1]!=m_nDClickIndex[0]))
   {   ....   }

解决办法:将很长的判断式子封装成函数或者定义成宏。并以一个清晰表达意图的名字命名,这种做法在现代oop语言中很常见,比如 java c# 中就大量使用这种手法。

#define  TrangelPos  (i!=0&&i == m_nDClickIndex[1])&&(m_nDClickIndex[1]!=m_nDClickIndex[0])

if(TrangelPos)
 ..................

【2】检查条件不同,最终处理的行为一致。

if (header == "业务操作日志")
         {
             OperationLog operationLog = new OperationLog();
             operationLog.Show();
             this.Close();
          }
         else if (header == "就业帮扶")
          {
             JobHelp jobhelp = new JobHelp();
             jobhelp.Show();
             this.Close();
          }
         else if (header == "统计报表")
         {
            ReportStatistics reportStatistics = new ReportStatistics();
            reportStatistics.Show();
            this.Close();
          }

解决办法:将代码中相同的部分抽取出来。

   private UserControl ItemFactory(String header)
        {
            if (header == "就业协议书鉴证")
                return new JobCertificationShow();

            else if (header == "毕业生就业调整")
                return new EmploymentAdjustShow();

            else if (header == "成教生业务")
                return new AEStudentsCheckInShow();

}
  UserControl SelectedItem=ItemFactory(header);
  if(SelectedItem!=null)
      SelectedItem.Show();
  this.close();

【3】大量使用控制标记。

for(int i=0;i<len;i++)
{
  if(!found)
  {
       if(...)
        {
            found=true;
         }
   }

}

解决办法:用break或者是continue来取代标记。

for(int i=0;i<len;i++)
{
       if(...)
        {
           break;
         }
}

【4】大量的判断条件的嵌套

if(...)
     result=...;
else if(...)
       result=...;
else
{
     if(...)
         result=...;
}

return result;

解决办法:大量的嵌套导致表达不清,用卫语句去除嵌套。

if(....) return ....
else if(...) return...
else  return ....

【5】使用类型码区分不同的类型

switch(type){

      case 1: return getBase1();

      case 2: return getBase2();

      case 3: return getBase3();

      case 4: return getBase4();

}

解决办法:之所以或有类型码是因为在一些场合某个对象的一些特性有稍许的不同,比如说我想将一些绘图操作封装到一个draw类中。刚开始的时候可能我的业务逻辑不是很复杂,这个类只用来画圆。但是后来的情况变了,它在某个情况下要能画正方形,在另一种情况下要能画三角形。那么就会有人用类型码去判断 draw 类该画什么。但是这样的做法可能会导致会面的逻辑很复杂,所以最好的办法就是用多态来替换类型码。对于正方形,三角形,圆形实现不同子类。

shape{
   draw();
}

Trangel extends shape{

    draw()
   {
     .....
    }
}

Rectangel extends shape{

    draw()
   {
     .....
    }
}

Circel extends shape{

    draw()
   {
     .....
    }
}

shape b;

b=new Trangel(0;
b.draw();//三角形

b=new Rectangel();
b.draw();//矩形

b=new Circel();//圆形
b.draw();

【6】对null对象的大量判断

object=getobject();
if(objct!=null) object.action();
else ...

解决办法:定义一个object 对应的 null 对象。使得null 对象和object 对象的行为统一。

getobject()
{
   if(this==null)
      return nullobject;
   return object;
}

nullobject{
   action()
     {
      ........
      }
}
object = getobject();
object.action();
时间: 2024-10-10 08:50:09

重构改善既有代码的设计--简化条件表达式的相关文章

《重构——改善既有代码的设计》读书笔记

重构--改善既有代码的设计 1 重构概述 1.1 重构的概念(What) Refactoring 名词:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低修改成本. 动词:使用一系列重构方法,在不改变软件可观察行为的前提下,调整其结构. 1.2 为什么要重构(Why) 改进软件设计 提高代码质量和可读性,使软件系统更易理解和维护 帮助尽早的发现缺陷 提高编程速度 1.3 何时重构(When) 何时重构: 1)随时随地进行. 2)三次法则:第一次做某件事只管去做:

《重构&mdash;&mdash;改善既有代码的设计》【PDF】下载

<重构--改善既有代码的设计>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196358 编辑推荐 重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码.多年前,正是<重构:改善既有代码的设计>原版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分.<重构:改善既有代码的设计>也因此成为与<设计模式>齐名的经典著作,被译为中.德.俄.日等众多语言,

《重构--改善既有代码的设计》总结or读后感:重构是程序员的本能

此文写得有点晚,记得去年7月读完的这本书,只是那时没有写文章的意识,也无所谓总结了,现在稍微聊一下吧. 想起写这篇感想,还是前几天看了这么一篇文章 研究发现重构软件并不会改善代码质量 先从一个大家都有的经历说起吧. 刚开始学编程时,比如,要统计数字出现的次数,我们会这么定义变量 int i=0;//统计次数 老师看了说,代码要有可读性,见名知意; 于是,我们把它改成 int count=0; 后来才知道,原来这么一手这就是重构的第一式,重命名 (eclipse快捷键 alt+shift+R,最近

【转】PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数

原文地址: PHP 杂谈<重构-改善既有代码的设计>之一 重新组织你的函数 思维导图 点击下图,可以看大图. 介绍 我把我比较喜欢的和比较关注的地方写下来和大家分享.上次我写了篇<php 跟老大的对话>.还是有很多疑问,这书帮了我不少的忙. 如果你比较繁忙,或者懒得看文字,建议你直接看截图,也会有很大的收获的.你可以通过比较截图中的代码就能知道孰优孰劣了. 代码部分我为什么用图呢?因为我经常用手机看代码,博客园的代码在手机里乱七八糟的,还是看图比较舒服. 专业术语 我们毕竟是用英文

重构改善既有代码的设计思维导图

最近闲来无事就把之前看的书,做了一张张的思维导图,来分享给大家 重构改善既有代码的设计思维导图: --------------- 不知道是博客园的问题,还是我的浏览器的问题,图片没法上传,如有人想要想看 可以给我发邮件: [email protected]  只为共同学习.也可以留言!!!

好书推荐之:重构-改善既有代码的设计

下载地址 高清 1.3M 重构-改善既有代码的设计 版权声明:本文为博主原创文章,未经博主允许不得转载.

实践提高《重构改善既有代码的设计第2版》PDF中文+PDF英文+对比分析

重构是编程的基础,是在不改变外部行为的前提下,有条不紊地改善代码.编程爱好者都知道,Martin Fowler 的<重构:改善既有代码的设计>已经成为全球有经验的程序员手中的利器,既可用来改善既有代码的设计.提升软件的可维护性,又可用于使既有代码更易理解.焕发出新的活力. <重构改善既有代码的设计(第2版)>在第1 版的基础上做了全面修订,反映了编程领域业已发生的许多变化.第2 版中介绍的重构列表更加内聚,并用JavaScript 语言重写了代码范例.此外,第2 版中还新增了与函数

【重构.改善既有代码的设计】9、简化条件表达式

简化条件表达式 Decompose Conditional(分解条件式) 你有一个复杂的条件(if-then-else)语句. 从if.then.else 三个段落中分别提炼出独立函数. 分解为多个独立函数,根据每个小块代码的用 途,为分解而得的新函数命名,并将原函数中对应的代码替换成「对新建函数的调用」,从而更清楚地表达自己的意图. 对于条件逻辑,[将每个分支条件分解,形成新函数」还可以给你带来更多好处:可以突出条件逻辑,更清楚地表明每个分支的作用,并且突出每个分支的原因. Consolida

《重构-改善既有代码的设计》读书笔记

重构,第一个案例 1.1 起点 如果发现现有的代码结构使你无法很方便地添加新特性,那就先重构,使特性的添加比较容易进行后,再添加特性; 1.2 重构的第一步 为即将修改的代码建立可靠的测试环境 – 是人就会犯错,所以需要可靠的测试; 测试结果能够自我检验 – 成功"OK",失败列出失败清单并打印行号 (自动化对比测试结果是提高效率的前提); 1.3 分解并重组"巨型"函数 切分提炼长函数(Extract Method),并移至更合适的类(Move Method) –