设计与模式(NET).doc
《设计与模式(NET).doc》由会员分享,可在线阅读,更多相关《设计与模式(NET).doc(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 设计模式 III重构既有代码1. 程序员与软件设计当你开始学习这本书时,应该已经写过上万行代码了吧。此时你已经配得上“程序员”这个称号,虽然需要在前面加上“初级”二字。再积累几万行代码,你就可以摘下“初级”的帽子,换上一顶新帽子:“平庸”或“高级”。两者区别何在?平庸程序员是流水线上的加工员、是一个翻译者,将设计师勾勒的模型简单的转换为代码;高级程序员是思想者、创造者,在技术领域内追求更完美的实现,创造更有价值的代码。前者类似于工匠,后者类似于艺术家,成为前者还是后者,软件设计能力是一个重要的衡量指标。图1 关于平庸程序员的漫画一个很常见的误解是程序员并不需要了解设计,企业中有架构设计师会帮
2、你完成一切。实际上在很多企业中专职的架构设计师只是一种传说,程序员必须自己决定该做什么以及怎么做,设计能力的缺失导致了大量冗余、低效、充满Bug且不易维护的代码,甚至一些工程失败的直接原因就是编码能力的低下。反之具备设计能力的程序员在编写代码时具有章法,不急于动手,先进行全盘的思考、制定方案,再配合优秀的开发模式,往往能在更短的时间内编写出更高质量的代码。有统计数据指出,一个高级程序员与一个平庸程序员的产出比可达10 : 1,显然企业更愿意使用高级程序员以节省成本。具备软件设计能力是高级程序员与平庸程序员的分水岭,如何提升软件设计能力就是本书所关注的内容。本书从四种不同的角度介绍了软件设计,第
3、1章介绍了“重构”这一利器,用于对已有的代码进行二次设计,第2章介绍了面向对象编程的重要原则,可以作为代码结构是否优秀的判断标准,第3、4、5章介绍了常用的设计模式,类似于中国功夫中的“招式”,使用设计模式可以解决大部分常见的问题。在学习本书时应该注意到:软件设计的基本理论好学,但灵活应用却不容易,需要持续对基本理论进行思考、推敲。学习完本书并不是学习软件设计的结束、而只是开始,在后续其他课程的学习中,应该不断将本书所讲内容与新的知识进行比对、参照、应用,这样才能快速的提高软件设计能力。2. 重构重构指在不改变代码功能的情况下,调整代码的架构,使代码具有更好的可读性、可扩展性等优点。有三种典型
4、的情况需要使用重构:1. 拿到了别人的代码,要在其基础上修改以添加功能,这时发现原来的代码结构混乱,功能不全,还有一些隐含的bug。2. 自己最初写代码时只注意实现软件的功能,未注意软件的结构,发生再添加新功能时代码无法扩展。3. 需要将代码包装为公用代码供大家使用,需要设计更好的软件结构和接口。可见重构更类似于一种补救的方式,很多程序员在拿到一个需求后总是热心于快速实现功能,而忽略了代码的结构,为以后的维护、升级增加了困难。在软件功能实现后回过头来进行重构,则可以持续保持软件结构的合理性。在重构领域,最具影响力的著作当数Martin Fowler所写的重构改善既有代码的设计一书。重构一书中通
5、过对一段具有代表性的代码不断进行重构展示了重构技术的特点和魅力,下面以一个简单的例子了解重构的基本要素,然后通过重构一书深入了解重构的各种技术手段。 图2 Martin Fowler与其著作3. 开始重构下面展示了一个简单的个人所得税收据打印的例子。Tax类代表申报人信息,包括了申报人姓名,月收入两个属性,Report类为收据打印类,提供Print打印方法,代码如下:代码演示:重构前Tax类using System;namespace Com.QhIt.Before public class Tax private string name; public string Name get ret
6、urn name; set name = value; private double saraly; public double Saraly get return saraly; set saraly = value; public Tax() public Tax(string name, double saraly):base() this.name = name; this.saraly = saraly; 代码演示:重构前Report类using System;namespace Com. XinZhanedu.Before public class Report public vo
7、id Print(Tax tax) /打印收据头 Console.WriteLine(个人所得税申报专用收据); Console.Write(申报日期: + DateTime.Now.ToString(yyyy-MM-dd); Console.WriteLine(t操作人:张三); Console.WriteLine(-); /打印收据正文 Console.WriteLine(缴税人姓名:t0 ,tax.Name); Console.WriteLine(缴税人月收入:t0:c2元 , tax.Saraly); int level = 0; if (tax.Saraly 2000) level
8、= 1; if (tax.Saraly 4000) level = 2; if (tax.Saraly 6000) level = 3; if (tax.Saraly 8000) level = 4; if (tax.Saraly 10000) level = 5; Console.WriteLine(应缴税级别:t + level + 级); double t = 0; switch (level) case 0: t = 0; break; case 1: t = tax.Saraly * 0.05; break; case 2: t = tax.Saraly * 0.08; break;
9、 case 3: t = tax.Saraly * 0.10; break; case 4: t = tax.Saraly * 0.15; break; case 5: t = tax.Saraly * 0.20; break; Console.WriteLine(应缴收税额:t0:c2元,t); 代码演示:重构前测试类using System;namespace Com. XinZhanedu.Before public class Program public static void Main(string args) Tax tax = new Tax(李四, 3500); Report
10、 report = new Report(); report.Print(tax); 运行效果如下图所示:图3 重构前 第一次重构:拆分大方法现在代码已经实现了主要功能,但是Report类中一长段Print方法令人隐隐不安。如果将打印收据看做由打印表头和打印内容两部分的话,可以将Print方法拆分PrintHeader和PrintContent两个方法,将大的方法拆分为小的方法,可以增加方法被复用的机率,每个方法也可以独立变化,不会影响其他方法。拆分后的Report类代码如下:代码演示:第一次重构Reportusing System;namespace Com. QhIt.Verson1 pu
11、blic class Report public void Print(Tax tax) PrintHeader(); PrintContent(tax); public void PrintHeader() /打印收据头 Console.WriteLine(个人所得税申报专用收据); Console.Write(申报日期: + DateTime.Now.ToString(yyyy-MM-dd); Console.WriteLine(t操作人:张三); Console.WriteLine(-); public void PrintContent(Tax tax) /打印收据正文 Console
12、.WriteLine(缴税人姓名:t0, tax.Name); Console.WriteLine(缴税人月收入:t0:c2元, tax.Saraly); int level = 0; if (tax.Saraly 2000) level = 1; if (tax.Saraly 4000) level = 2; if (tax.Saraly 6000) level = 3; if (tax.Saraly 8000) level = 4; if (tax.Saraly 10000) level = 5; Console.WriteLine(应缴税级别:t + level + 级); double
13、 t = 0; switch (level) case 0: t = 0; break; case 1: t = tax.Saraly * 0.05; break; case 2: t = tax.Saraly * 0.08; break; case 3: t = tax.Saraly * 0.10; break; case 4: t = tax.Saraly * 0.15; break; case 5: t = tax.Saraly * 0.20; break; Console.WriteLine(应缴收税额:t0:c2元, t); 第二次重构:方法只实现单一功能一个方法应该只实现一个单一的
14、功能,观察重构后的PrintConent方法,其中包含了打印单据、计算缴税级别、计算缴税金额三种功能,应继续拆分,这样今后个人所得税计算方式改变后不会影响到打印功能,改变后的Report类代码如下:代码演示:第二次重构Reportusing System;namespace Com. QhIt.Verson2 public class Report public void Print(Tax tax) PrintHeader(); PrintContent(tax); public void PrintHeader() /打印收据头 Console.WriteLine(个人所得税申报专用收据)
15、; Console.Write(申报日期: + DateTime.Now.ToString(yyyy-MM-dd); Console.WriteLine(t操作人:张三); Console.WriteLine(-); public void PrintContent(Tax tax) /打印收据正文 Console.WriteLine(缴税人姓名:t0, tax.Name); Console.WriteLine(缴税人月收入:t0:c2元, tax.Saraly); int level = CountLevel(tax); Console.WriteLine(应缴税级别:t + level +
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 NET
限制150内