惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - mahope

一个算法题解 在ASP.NET web 站点中使用log4net (1.2.9) 在.NET 中实现 AOP 解决Web Service中传递子类实例时,序列化的问题。 Q & A:Does ASP.NET support one-way Web Service operations? openwave:Malformed server response web 项目的 csproj 文件要有对应的.webinfo文件才能在vs里面打开 - mahope 软件需求规范(SRS)指南 写需求文档的一般原则 删除everyone对c:的 访问权限后,运行asp.net出现DirectoryNotFoundException未找到路径“C:\”的一部分 - mahope - 博客园 NHibernate Mapping文件中如何指定类的字节数组属性 NHibernate.ADOException : Unable to perform find 对于事件不能调用BeginInvoke,可改用另外一层包装 IBM面试题试解(关于50条狗、50个人、病狗) Einstein's Riddle 爱因斯坦出的智力题? Artificial intelligence: Solving problems for the real world 一些面向对象的设计法则 NHibernate 执行内嵌类(Nested Class)查询 为内嵌类(Nested Class)配置NHibernate的O/R Mapping文件
重构、分支语句、虚函数、抽象函数与多态--《重构:改善既有代码设计》之读书心得
mahope · 2005-09-04 · via 博客园 - mahope

    最近在读 Marting Fowler 所著的 Refactoring  Improving the Desgin of Existing Code 一书。身体力行地完成了" a First Exmaple"--从一个现有代码的重构过程。
    我是用VS.NET 2005 beta2 来做的。虽然这个版本已经实现了不少重构的工具,诸如 Rename、Encapsulate field、Extract Method、Extract Interface、Change signature   等。但是仍然有一些重要的、有用的重构,如:Extract superclass、Move Member(from one class to another)和 Push Up Member没有实现。所以我在重构的过程中有时需要手工改代码。
    这个First Exmaple例子的最初原型是非常简单的,它是一个影碟出租商店用来计算并打印顾客账单的程序。它会显示一个客户租借了哪些影碟和多长时间,根据租借时间的长短计算费用。它还会识别:常规类、儿童类、新发布类三种不同的影碟类型。在计算租借费用的同时它还会计算客户的积分,如果租借的是新发布类的影碟会有额外的积分。
     下面是这个程序中的几个关键类:
   


重构针对这三个类展开,先后采用了Extract Method、Move Method、Removing Temps、Replace Type Code with State/Strategy等方法,最后是Replace Conditional with Polymorphism。这个过程中产生了新类Price(abstract)以及它的三个子类RegularPrice、ChildrensPrice、RegularPrice。

 在最后的重构过程中,我先把Price类的getCharge方法改为虚拟(virtual)的,然后依次从swich语句中抽取子类的实现。
抽取前的Price类:

抽取前的RegularPrice类:

抽取后的Price和RegularPrice:

   继续抽取直至所有实现都转移到子类中, 这时候Price类变成:

       实际上Price类的getPrice方法已经没有任何计算了,这时候也没有子类尚未实现getCharge方法,所以把这个类改为抽象的就顺其自然了。改完后Price变成:

       从这个过程中你可以看到getPrice是如何从一个普通的方法变成virtual、最后变成abstract的。从一定程度上来说abstract方法就是virtual方法的一个特殊形式,只不过这个修饰符约定了所有继承具体类都实现了这个方法,因而这个方法中不需要再有任何实现了。
      有时候花一点时间干点体力活是有好处的!