大话重构连载11:小步快跑是这样玩的
说了那么多,相信你对小步快跑的概念有了一个初步的印象,但理解还不是很深。让我们来看一看一个实际工作中的例子,来亲身感受一下什么是大布局,什么是大设计,什么是小设计。
还是回到前面那个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:小步快跑是这样玩的相关推荐
- 小步快跑是这样玩的(下)
系统重构到这一步,我们来看看用户关于时间问候语部分的变更需求:问候需要更加精细,如中午问候"Good noon! ".傍晚问候"Good evening! ". ...
- 小步快跑是这样玩的(上)
软件的发展规律就是这样的,起初十分简单明了,使我们可以轻松地进行合理的设计.接着开始变更,业务变得越来越复杂,程序也随之变得越来越复杂了.正是因为软件开始由简单软件向复杂软件转变,而我们的设计却没有合 ...
- 大话重构连载9:大布局你伤不起
2019独角兽企业重金招聘Python工程师标准>>> 作为优秀开发人员,重构应当成为一种习惯,自然而然地运用重构的开发模式,自然而然地在优化和调整我们的代码.它首先要求我们掌握重构 ...
- 创业者如何小步快跑,从0开始实现自己的产品?
2019独角兽企业重金招聘Python工程师标准>>> 某周末和学员聊完,兴起,在在行上的分类里面找自己.可是在产品里面,找来找去,完全不见踪影,反而在研发和运营里面找到了我的话题, ...
- log4net直切ElasticSearch,小步快跑首选
很多小步快跑的公司,开发人员可能就3-4个,面对巨大业务压力,日连夜的赶着上线,快速试错,自然就没时间搭建一些基础设施,比如说logCenter,但初期项目不稳定,bug又多,每次都跑到生产去找日志, ...
- 弘辽科技:淘宝悄悄公布新规,在电商赛道小步快跑。
疫情又来了,全国人民的生活节奏再次慢了下来.线下生活越慢,对线上服务的要求就越高,尤其是电商. 今年刚开始,淘宝在不动声色中推出了不少新规则.先是年初灰度测试了"未发货秒退款",对 ...
- 小步快跑,快速迭代:安全运营的器术法道
作者 | 腾讯安全平台部 lake2 在进行安全体系建设工作的时候,人们往往容易看到的成果是新研发了一个安全系统,采用了一个新的技术,似乎做出一个系统采用一种技术就可以一劳永逸地解决某类问题了.可现实 ...
- 智能手机的终场战事:小步快跑进入“智慧时代”
撰文 / 张贺飞 编辑 / 沈洁 2022年的春季发布会,照旧是一番热闹景象. OPPO.荣耀.华为.三星等品牌陆续推出新品,经历过2021年的"小阳春"后,几乎所有的主流厂商都在 ...
- 基于JSoup库的java爬虫开发学习——小步快跑
因某需求,需要使用java从网页上爬取一些数据来使用,花了点时间看了一下JSoup,简单介绍一下 jsoup is a Java library for working with real-world ...
最新文章
- 关于Silverlight中多项目共享DLL文件的讨论
- node爬取app数据_在电销行业中,运营商大数据究竟起着怎样的作用
- mac能远程到wjn的linux,linux远程桌面vnc-server安装配置
- string 类的初始化和赋值(程序成长之路的一颗米)
- linux-git服务搭建
- 程序猿必备工具『CSDN浏览器助手』之超实用小工具测评
- php接收get参数false是字符串,php怎么接收url参数
- Metasploit Framework(6)客户端渗透(上)
- Dorado Debugger工具
- centos7搭建apache服务器
- php框架thinkphp教程,thinkPHP5.0框架安装教程详解
- Java必知必会的问题
- python 空集_Python——集(set)
- CDN还有这么多衍生品?! 云帆加速借技术创新笑傲短视频新蓝海
- Python Pyinstaller安装与使用
- 细讲如何判断文法是否是LL(1)文法
- 思考是勤奋的一部分,人最大的懒惰是思想懒惰
- python-常用算法
- 规律的生活,规律的学习
- 华为云,安全创新的云服务标杆,助力企业数字化转型
热门文章
- python 微信机器人 关键词_python-微信机器人之词云
- MySQL 事件跟踪器 , MySQL 无须重启服务 跟踪 SQL , 也无须配置日志
- 「算法与数据结构」从入门到进阶吐血整理推荐书单
- 清华大学计算机陈蓓,2010年安徽高考状元文科陈蓓 理科张浩源刘梦醒郝姗姗
- 服务办公软件金山偷换“核高基”重大软件专项课题名称,瞒天过海,欺骗大众...
- long long 型变量
- 很齐全的怀孕须知.不认真看不配做妈妈.
- homeassistant
- What is Java thread priority? 什么是java线程优先级
- java毕业设计——基于java+JSP+sqlserver的智能在线考试信息管理系统设计与实现(毕业论文+程序源码)——智能在线考试信息管理系统