大话重构读书笔记——小步快跑的开发模式

系统重构,就是在不改变软件的外部行为的基础上,改变软件内部的结构,使其更加易于阅读、易于维护和易于变更。关于基础第一篇,请参考文章大话重构读书笔记——基础篇一

小步快跑让我们每次重构的时候只关注一个问题,运用一个重构手法去解决这一个问题。

以下是一个非常简单的HelloWorld程序,源码如下:

 1     public class HelloWorld
 2     {
 3         public string SayHelloWorld(string user)
 4         {
 5             DateTime date = DateTime.Now;
 6             int hour = date.Hour;
 7 
 8             string words = null;
 9             if (hour >= 6 && hour < 12)
10             {
11                 words = "Good morning!";
12             }
13             else if (hour >= 12 && hour < 19)
14             {
15                 words = "Good afternoon!";
16             }
17             else
18             {
19                 words = "Good night!";
20             }
21             words = "Hi, " + user + "." + words;
22             return words;
23         }
24     }
View Code

观察程序,发现它包含三个相对独立的功能代码段,因此我们采用重构中的“抽取方法”,将它们分别抽取到三个函数getHour(), getFirstGreeting(), getSecondGreeting()中,并让原函数对其引用:

 1     public class HelloWorld
 2     {
 3         public string SayHelloWorld(string user)
 4         {
 5             int hour = getHour();
 6             return getFirstGreeting(user) + getSecondGreeting(hour);
 7         }
 8 
 9         private int getHour()
10         {
11             DateTime date = DateTime.Now;
12             return date.Hour;
13         }
14 
15         private string getFirstGreeting(string user)
16         {
17             return "Hi, " + user + ".";
18         }
19 
20         private string getSecondGreeting(int hour)
21         {
22             if (hour >= 6 && hour < 12)
23             {
24                 return "Good morning!";
25             }
26             else if (hour >= 12 && hour < 19)
27             {
28                 return "Good afternoon!";
29             }
30             else
31             {
32                 return "Good night!";
33             }
34         }
35     }
View Code

这样的重构虽然使程序发生了较大变化,但其中真正执行的代码却没有变化,还是那些代码。此时,如果我们还需要对用户问候语进行变更和关于时间的问候语进行变更,那么需要改动的程序依然比较大,为此,我们再次对HelloWorld程序进行分裂,运用重构中的“抽取类”,对用户问候的程序分裂到GreetingToUser类中,将关于时间的问候程序分裂到GreetingAboutTime类中。

此时, 在HelloWorld类中的代码如下:

1     public class HelloWorld
2     {
3         public string SayHelloWorld(string user)
4         {
5             GreetingToUser greetingToUser = new GreetingToUser(user);
6             GreetingAboutTime greetingAboutTime = new GreetingAboutTime();
7             return greetingToUser.getGreeting() + greetingAboutTime.getGreeting();
8         }
9     }
View Code

而分裂出的GreetingToUser类代码如下:

 1     public class GreetingToUser
 2     {
 3         private string user;
 4         public GreetingToUser(string user)
 5         {
 6             this.user = user;
 7         }
 8         public string getGreeting()
 9         {
10             return "Hi, " + user + ".";
11         }
12     }
View Code

分裂出的GreetingAboutTime类代码如下:

 1     public class GreetingAboutTime
 2     {
 3         public int getHour()
 4         {
 5             DateTime date = DateTime.Now;
 6             return date.Hour;
 7         }
 8         public string getGreeting()
 9         {
10             int hour = getHour();
11             if (hour >= 6 && hour < 12)
12             {
13                 return "Good morning!";
14             }
15             else if (hour >= 12 && hour < 19)
16             {
17                 return "Good afternoon!";
18             }
19             else
20             {
21                 return "Good night!";
22             }
23         }
24     }
View Code

此时,如果我们还需要对时间的问候语进行变更的话,仅仅需要专注于修改GreetingAboutTime就可以了,这就是因重构带来的改善。
同时,我们发现,过去只需要getHour()就好了,但是如果需要问候“元旦快乐”、“情人节快乐”的话,getHour()就没办法完成这个功能了,需要getMonth()与getDay(),继续对上述代码进行重构,将与时间有关的程序抽取到新类DateUtil中:

DateUtil类代码如下:

 1     public class DateUtil
 2     {
 3         private DateTime date = DateTime.Now;
 4         public int getHour()
 5         {
 6             return date.Hour;
 7         }
 8 
 9         public int getMonth()
10         {
11             return date.Month;
12         }
13 
14         public int getDay()
15         {
16             return date.Day;
17         }
18     }
View Code

与此同时,变更的GreetingAboutTime类代码如下:

 1     public class GreetingAboutTime
 2     {
 3         public string getGreeting()
 4         {
 5             DateUtil dateUtil = new DateUtil();
 6             int month = dateUtil.getMonth();
 7             int day = dateUtil.getDay();
 8             int hour = dateUtil.getHour();
 9             if (month == 1 && day == 1)
10             {
11                 return "Happy New Year!";
12             }
13             if (month ==3 && day==26)
14             {
15                 return "Happy Valentine's Day";
16             }
17             ......
18 
19             if (hour >= 6 && hour < 12)
20             {
21                 return "Good morning!";
22             }
23             if (hour >= 12 && hour < 19)
24             {
25                 return "Good afternoon!";
26             }
27             return "Good night!";
28         }
29     }            
View Code

小步快跑是一种逐步进化式的程序优化过程,它是重构思想的重要核心。

转载于:https://www.cnblogs.com/Ribbon/p/4369070.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值