说了那么多,相信你对小步快跑的概念有了一个初步的印象,但理解还不是很深。让我们来看一看一个实际工作中的例子,来亲身感受一下什么是大布局,什么是大设计,什么是小设计。
还是回到前面那个Hello World的例子,起初的需求总是简单而清晰的。当用户登录一个网站时,网站往往需要给用户打一个招呼:“hi, XXX! ”。同时,如果此时是上午则显示“Good morning! ”,如果是下午则显示“Good afternoon! ”,除此显示“Good night! ”。对于这样一个需求我们在一个HelloWorld类中写了十来行代码:

/** * The Refactoring's hello-world program * @author fangang */public class HelloWorld {    /**    * Say hello to everyone   * @param now     * @param user    * @return the words what to say  */   public String sayHello(Date now, String user){        //Get current hour of day     Calendar calendar = Calendar.getInstance();      calendar.setTime(now);        int hour = calendar.get(Calendar.HOUR_OF_DAY);

     //Get the right words to say hello        String words = null;     if(hour>=6 && hour<12){            words = "Good morning!";       }else if(hour>=12 && hour<19){         words = "Good afternoon!";     }else{            words = "Good night!";     }     words = "Hi, "+user+". "+words;       return words; }}

如果需求没有变更,一切都是美好的。但事情总是这样,当软件第一次提交,变更就开始了。系统总是不能直接获得用户名称,而是先获得他的userId,然后通过userId从数据库中获得用户名。后面的问候可能需要更加精细,如中午问候“Good noon! ”、傍晚问候“Good evening! ”、午夜问候“Good midnight! ”。除此之外,用户希望在一些特殊的节日,如新年问候“Happy new year! ”、情人节问候“Happy valentine’s day! ”、三八妇女节问候“Happy women’s day! ”,等等。除了已经列出的节日,他们还希望临时添加一些特殊的日子,因此问候语需要形成一个库,并支持动态添加。不仅如此,这个问候库应当支持多语言,如选择英语则显示“Good morning! ”,而选择中文则显示“上午好!”……总之,各种不同的需求被源源不断地被用户提出来,因此我们的设计师开始头脑发热、充血、开始思维混乱。是的,如果你期望你自己能一步到位搞定所有这些需求,你必然会感到千头万绪、顾此失彼,进而做出错误的设计。但如果你学会了“小步快跑”的开发模式,一切就变得没有那么复杂了。
首先,我们观察原程序,发现它包含三个相对独立的功能代码段,因此我们采用重构中的“抽取方法”,将它们分别抽取到三个函数getHour(), getFirstGreeting(), getSecondGreeting()中,并让原函数对其引用:

/** * The Refactoring's hello-world program * @author fangang */public class HelloWorld {    /**    * Say hello to everyone   * @param now     * @param user    * @return the words what to say  */   public String sayHello(Date now, String user){        int hour = getHour(now);     return getFirstGreeting(user)+getSecondGreeting(hour);   }

   /**    * Get current hour of day.    * @param now     * @return current hour of day    */   private int getHour(Date now){        Calendar calendar = Calendar.getInstance();      calendar.setTime(now);        return calendar.get(Calendar.HOUR_OF_DAY);    }

   /**    * Get the first greeting.     * @param user    * @return the first greeting     */   private String getFirstGreeting(String user){     return "Hi, "+user+". ";    }

   /**    * Get the second greeting.    * @param hour    * @return the second greeting    */   private String getSecondGreeting(int hour){       if(hour>=6 && hour<12){            return "Good morning!";     }else if(hour>=12 && hour<19){         return "Good afternoon!";       }else{            return "Good night!";       } }}

这次重构虽然使程序结构发生了较大变化,但其中真正执行的代码却没有变化,还是那些代码。随后,我们核对需求发现,用户需求分成了两个不同的分支:对用户问候语的变更,和关于时间的问候语变更。为此,我们再次对HelloWorld的程序进行了分裂,运用重构中的“抽取类”,将对用户问候的程序分裂到GreetingToUser类中,将关于时间的问候程序分裂到GreetingAboutTime类中:

/** * The Refactoring's hello-world program * @author fangang */public class HelloWorld {    /**    * Say hello to everyone   * @param now     * @param user    * @return the words what to say  */   public String sayHello(Date now, String user){        GreetingToUser greetingToUser = new GreetingToUser(user);        GreetingAboutTime greetingAboutTime = new GreetingAboutTime(now);        return greetingToUser.getGreeting() + greetingAboutTime.getGreeting();   }}

/** * The greeting to user * @author fangang */public class GreetingToUser { private String user;  /**    * The constructor with user   * @param user    */   public GreetingToUser(String user){       this.user = user;    } /**    * @return greeting to user   */   public String getGreeting(){      return "Hi, "+user+". ";    }}

/** * The greeting about time. * @author fangang */public class GreetingAboutTime {  private Date date;    public GreetingAboutTime(Date date){      this.date = date;    } /**    * @param date    * @return the hour of day    */   private int getHour(Date date){       Calendar calendar = Calendar.getInstance();      calendar.setTime(date);       return calendar.get(Calendar.HOUR_OF_DAY);    } /**    * @return the greeting about time    */   public String getGreeting(){      int hour = getHour(date);        if(hour>=6 && hour<12){            return "Good morning!";     }else if(hour>=12 && hour<19){         return "Good afternoon!";       }else{            return "Good night!";       } }}

系统重构到这一步,我们来看看用户关于时间问候语部分的变更需求:问候需要更加精细,如中午问候“Good noon! ”、傍晚问候“Good evening! ”、午夜问候“Good midnight! ”。除此之外,用户希望在一些特殊的节日,如新年问候“Happy new year! ”、情人节问候“Happy valentine’s day! ”、三八妇女节问候“Happy women’s day! ”,等等。此时我们发现,我们对时间问候语的变更不再需要修改HelloWorld或其它什么类,而是仅仅专注于修改GreetingAboutTime就可以了,这就是因重构带来的改善。
同时,我们发现,过去只需getHour()就足够,而现在却需要getMonth()与getDay()。随着程序复杂度的提升,我们适时进行了一次重构,将与时间相关的程序抽取到一个新类DateUtil中,就可以顺利地改写原有的时间问候语程序:

/** * The utility of time * @author fangang */public class DateUtil { private Calendar calendar;    /**    * @param date    */   public DateUtil(Date date){       calendar = Calendar.getInstance();       calendar.setTime(date);   } /**    * @return the hour of day    */   public int getHour(){     return calendar.get(Calendar.HOUR_OF_DAY);    } /**    * @return the month of date  */   public int getMonth(){        return calendar.get(Calendar.MONTH)+1;   } /**    * @return the day of month   */   public int getDay(){      return calendar.get(Calendar.DAY_OF_MONTH);   }}

/** * The greeting about time. * @author fangang */public class GreetingAboutTime {  private Date date;    public GreetingAboutTime(Date date){      this.date = date;    } /**    * @return the greeting about time    */   public String getGreeting(){      DateUtil dateUtil = new DateUtil(date);      int month = dateUtil.getMonth();     int day = dateUtil.getDay();     int hour = dateUtil.getHour();

     if(month==1 && day==1) return "Happy new year! ";       if(month==1 && day==14) return "Happy valentine's day! ";      if(month==3 && day==8) return "Happy women's day! ";       if(month==5 && day==1) return "Happy Labor day! ";      ......

      if(hour>=6 && hour<12) return "Good morning!";       if(hour==12) return "Good noon! ";        if(hour>=12 && hour<19) return "Good afternoon! ";       if(hour>=19 && hour<22) return "Good evening! ";     return "Good night! ";  }}

最后,我们建立user表存放用户信息,创建UserDao接口及其实现类,为GreetingToUser提供用户信息访问的服务;我们用greetingRule表存放各种问候语,创建GreetingRuleDao接口及其实现类,为GreetingAboutTime提供一个可扩展的、支持多语言的问候语库(如图3.1所示)。所有这一切都是在现有基础上,通过小步快跑的方式一步一步演变的。

[align=center]
[img]http://dl2.iteye.com/upload/attachment/0100/5575/b5ab44c2-6ea8-306f-a3e7-b882a7c247c3.jpg[/img]
[/align]
[align=center]图3.1 HelloWorld的设计图[/align]

小步快跑是一种逐步进化式的程序优化过程,它是重构思想的重要核心。后面我们还会用更多实际工作中的示例,让你真实体会到小步快跑的开发过程。

大话重构连载首页:[url]http://fangang.iteye.com/blog/2081995[/url]
特别说明:希望网友们在转载本文时,应当注明作者或出处,以示对作者的尊重,谢谢!

大话重构连载11:小步快跑是这样玩的相关推荐

  1. 小步快跑是这样玩的(下)

    系统重构到这一步,我们来看看用户关于时间问候语部分的变更需求:问候需要更加精细,如中午问候"Good noon! ".傍晚问候"Good evening! ". ...

  2. 小步快跑是这样玩的(上)

    软件的发展规律就是这样的,起初十分简单明了,使我们可以轻松地进行合理的设计.接着开始变更,业务变得越来越复杂,程序也随之变得越来越复杂了.正是因为软件开始由简单软件向复杂软件转变,而我们的设计却没有合 ...

  3. 大话重构连载9:大布局你伤不起

    2019独角兽企业重金招聘Python工程师标准>>> 作为优秀开发人员,重构应当成为一种习惯,自然而然地运用重构的开发模式,自然而然地在优化和调整我们的代码.它首先要求我们掌握重构 ...

  4. 创业者如何小步快跑,从0开始实现自己的产品?

    2019独角兽企业重金招聘Python工程师标准>>> 某周末和学员聊完,兴起,在在行上的分类里面找自己.可是在产品里面,找来找去,完全不见踪影,反而在研发和运营里面找到了我的话题, ...

  5. log4net直切ElasticSearch,小步快跑首选

    很多小步快跑的公司,开发人员可能就3-4个,面对巨大业务压力,日连夜的赶着上线,快速试错,自然就没时间搭建一些基础设施,比如说logCenter,但初期项目不稳定,bug又多,每次都跑到生产去找日志, ...

  6. 弘辽科技:淘宝悄悄公布新规,在电商赛道小步快跑。

    疫情又来了,全国人民的生活节奏再次慢了下来.线下生活越慢,对线上服务的要求就越高,尤其是电商. 今年刚开始,淘宝在不动声色中推出了不少新规则.先是年初灰度测试了"未发货秒退款",对 ...

  7. 小步快跑,快速迭代:安全运营的器术法道

    作者 | 腾讯安全平台部 lake2 在进行安全体系建设工作的时候,人们往往容易看到的成果是新研发了一个安全系统,采用了一个新的技术,似乎做出一个系统采用一种技术就可以一劳永逸地解决某类问题了.可现实 ...

  8. 智能手机的终场战事:小步快跑进入“智慧时代”

    撰文 / 张贺飞 编辑 / 沈洁 2022年的春季发布会,照旧是一番热闹景象. OPPO.荣耀.华为.三星等品牌陆续推出新品,经历过2021年的"小阳春"后,几乎所有的主流厂商都在 ...

  9. 基于JSoup库的java爬虫开发学习——小步快跑

    因某需求,需要使用java从网页上爬取一些数据来使用,花了点时间看了一下JSoup,简单介绍一下 jsoup is a Java library for working with real-world ...

最新文章

  1. 关于Silverlight中多项目共享DLL文件的讨论
  2. node爬取app数据_在电销行业中,运营商大数据究竟起着怎样的作用
  3. mac能远程到wjn的linux,linux远程桌面vnc-server安装配置
  4. string 类的初始化和赋值(程序成长之路的一颗米)
  5. linux-git服务搭建
  6. 程序猿必备工具『CSDN浏览器助手』之超实用小工具测评
  7. php接收get参数false是字符串,php怎么接收url参数
  8. Metasploit Framework(6)客户端渗透(上)
  9. Dorado Debugger工具
  10. centos7搭建apache服务器
  11. php框架thinkphp教程,thinkPHP5.0框架安装教程详解
  12. Java必知必会的问题
  13. python 空集_Python——集(set)
  14. CDN还有这么多衍生品?! 云帆加速借技术创新笑傲短视频新蓝海
  15. Python Pyinstaller安装与使用
  16. 细讲如何判断文法是否是LL(1)文法
  17. 思考是勤奋的一部分,人最大的懒惰是思想懒惰
  18. python-常用算法
  19. 规律的生活,规律的学习
  20. 华为云,安全创新的云服务标杆,助力企业数字化转型

热门文章

  1. python 微信机器人 关键词_python-微信机器人之词云
  2. MySQL 事件跟踪器 , MySQL 无须重启服务 跟踪 SQL , 也无须配置日志
  3. 「算法与数据结构」从入门到进阶吐血整理推荐书单
  4. 清华大学计算机陈蓓,2010年安徽高考状元文科陈蓓 理科张浩源刘梦醒郝姗姗
  5. 服务办公软件金山偷换“核高基”重大软件专项课题名称,瞒天过海,欺骗大众...
  6. long long 型变量
  7. 很齐全的怀孕须知.不认真看不配做妈妈.
  8. homeassistant
  9. What is Java thread priority? 什么是java线程优先级
  10. java毕业设计——基于java+JSP+sqlserver的智能在线考试信息管理系统设计与实现(毕业论文+程序源码)——智能在线考试信息管理系统