浏览 3283 次
锁定老帖子 主题:小步快跑是这样玩的(上)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2014-01-04
最后修改:2014-01-31
因此,解决遗留系统的根本办法,就是在软件由简单软件向复杂软件转变的关键时刻,适时做出调整,使软件重新回到高质量的状态。这里,我们要做出的调整被称为重构,而做出这种调整的最佳方式,就是“小步快跑”啦。说得那么玄乎,到底什么是“小步快跑”呢?说不尽千言万语,倒不如一个简单的示例: 故事是这样的,当用户登录一个网站时,网站往往需要给用户打一个招呼:“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){ //这里将原有的代码通过“抽取方法”抽取到3个函数中 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!"; } } } (续) 相关文档 遗留系统:IT攻城狮永远的痛 需求变更是罪恶之源吗? 系统重构是个什么玩意儿 我们应当改变我们的设计习惯 小步快跑是这样玩的(上) 小步快跑是这样玩的(下) 代码复用应该这样做(1) 代码复用应该这样做(2) 代码复用应该这样做(3) 做好代码复用不简单(1) 特别说明:希望网友们在转载本文时,应当注明作者或出处,以示对作者的尊重,谢谢! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |