- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
重构案例1
重构,第一个案例该从何说起呢?按照传统做法,一开始介绍某个东西时,首先应该大致讲讲它的历史、主要原理等等。可是每当有人在会场上介绍这些东西,总是能诱发我的瞌睡虫。我的思绪开始游荡,我的眼神开始迷离,直到主讲人秀出实例,我才能够提起精神。实例之所以能够拯救我与太虚之中,因为它让我看见事情在真正进行。谈原理,很容易流于泛泛,又很难说明如何实际应用。给出一个实例,就可以帮助我把事情认识清楚。所以我决定从一个实例说起。在此过程中我将告诉你很多重构的道理,并且让你对重构过程有一点感觉。然后我才能向你展开通常的原理介绍。但是,面对这个介绍性实例。我遇到了一个大问题。如果我选择一个大型程序,那么对程序自身的描述和对整个重构过程的描述就太复杂了,任何读者都不忍卒读(我试了一下,哪怕稍微复杂一点的例子都会超过100页)。如果我选择一个容易理解的小程序,有恐怕看不出重构的价值。和任何立志要介绍“应用于真实世界中的有用技术”的人一样,我陷入了一个十分典型的两难困境。我只能带引你看看如何在一个我所选择的小程序中进行重构,然而坦白说,那个程序的规模根本不值得我们那么做。但是如果我给你看的代码是大系统的一部分。重构技术很快就变得重要起来。所以请你一边欣赏这个小例子,一边想象它身处于一个大得多的系统。起点实例非常简单。这是一个影片出租店用的程序,计算每一位顾客的消费金额并打印详单。操作者告诉程序:顾客租了哪些影片、租期多长,程序便根据租赁时间和影片类型算出费用。影片分为三类:普通片、儿童片和新片。除了计算费用,还要为常客计算积分,积分会根据租片种类是否为新片而有不同。我用了几个类来表现这个例子中的元素。图1-1是一张UML类图,用以显示这些类。我会逐一列出这些类的代码。Movie(影片)Movie只是一个简单的纯数据类。public class Movie{public static final int CHILDRENS = 2;public static final int REGULAR = 0;public static final int NEW_RELEASE = 1;private String _title;private int _priceCode;public Movie(String title ,int priceCode){_title = title;_priceCode = priceCode;}public int getPriceCode(){return _priceCode;}public void setPriceCode(int arg){_priceCode = arg; }public string getTitle(){return _title;};}Rental (租赁)Rental表示某个顾客租了一部影片。class Rental{private Movie _movie;private int _daysRented;public Rental(Movie movie, int daysRented){_movie = movie;_daysRented = daysRented;}public int getDaysRented(){Return _daysRented;}Public Movie getMovie( ){Return _movie;}}Customer(顾客)Customer类用来表示顾客。就像其他类一样,它也拥有数据和相应的访问函数:Class Customer {Private String _name;Private Vector _rentals = new Vector( );Public Customer (String name){_name = name ;}Public void addRental(Rental arg){_rentals.addElement(arg);}Public String getName ( ){Return _name;}}Customer还提供了一个用于生成详单的函数。这个起始程序设计得并不好,生成详单的函数中有一个长长的statement()做的事情太多了,它做了很多原本应该由其他类完成的事情。在这个例子里,我们的用户希望对系统做一点修改。首先他们希望以HTML格式输出详单,这样就可以直接在网页上显示,这非常符合时下的潮流。现在请你想一想,这个变化会带来什么影响。实际上,根本不可能在打印HTML报表的函数中复用statement()的任何行为。你唯一可以做的就是编写一个全新的htmlStatement(),大量重复statement()的行为。当然,现在做这个还不太费力,你可以把statement()复制一份
文档评论(0)