(计算机应用技术专业论文)重构技术在养犬管理信息系统中的应用.pdf_第1页
(计算机应用技术专业论文)重构技术在养犬管理信息系统中的应用.pdf_第2页
(计算机应用技术专业论文)重构技术在养犬管理信息系统中的应用.pdf_第3页
(计算机应用技术专业论文)重构技术在养犬管理信息系统中的应用.pdf_第4页
(计算机应用技术专业论文)重构技术在养犬管理信息系统中的应用.pdf_第5页
已阅读5页,还剩55页未读 继续免费阅读

(计算机应用技术专业论文)重构技术在养犬管理信息系统中的应用.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 在当今这个信息化社会中,网络技术和分布式技术广泛的应用到社会的各个 领域。以此为基础建立起来的各种信息系统,给现代生活带来了巨大变革。随着 社会信息化程度的提高,随着竞争的加剧和客户需求的多样化,对于管理信息系 统的开放性、灵活性、重用性和快捷迅速的反应能力都提出了更高的要求,这种 变化对管理信息系统的开发提出了新的挑战:如何快速且高质量地开发出能够满 足不同需求的管理信息系统,如何更好的在原有系统基础上开发出新的管理信息 系统,如何在开发过程中应对客户频繁的需求变更,如何在开发过程中处理系统 中的代码与系统结构的不断腐化。面对这些新的挑战,传统的软件开发方法已经 显得无能为力了,建立良好的开发环境,引入重构技术和设计模式己经成为解决 这一问题的最佳方法之一。系统重构的目标就是一个简单完好的设计,而一个简 单完好设计最重要的特性就是容易适应变化,设计模式则是对简单完好设计的最 好诠释。 本文首先介绍了课题开发的背景,第二章介绍了设计模式及重构技术的理论 部分,在随后的章节中介绍了通用权限模块的设计,并介绍基于c s 结构和基于 j 2 e e 平台应用此通用权限模块的成功案例,分析了设计中存在的不足,阐述了 重构技术和设计模式在养犬系统的权限模块中的应用策略,从而提出了一种优化 代码设计的新思路,试图通过在实际开发中引入重构技术和设计模式对代码设计 进行优化,从页面重构,代码重构,引入设计模式三个方面着重论述了重构技术 和设计模式在具体实施时的灵活运用,并经过了养犬管理信息系统的实际验证, 提高了系统的性能,使得系统的可扩展性和可维护性都有所提高。最后是对所做 工作的总结与展望。 关键词:重构设计模式管理信息系统n e t a b s t r a c t i nt h ei n f 0 n n a t i o n b a s e ds o c i e t y , t h ew e ba n dd i s t r i b u t et e c h n i q u eh a v eb e e n w i d e l ya p p l i e di ne v e r yd o m a i n so fs o c i e t y i n f o r m a t i o ns y s t e m sw h i c hb a s eo nt h e w e bt e c h n i q u em a k eal o to fc h a n g e so ns o c i a ll i f e w t l lt h ei m p r o v e m e n to f c o m m u n i c a t i o no fs o c i e t y , a n dw i t ht h ec u s t o m e r sd e m a n d i n gb e c o m i n gm o r ea n d m o r ed i v e r s i f y i n g ,t h c yn e e dt h em a n a g e m e n ti n f o r m a t i o ns y s t e m s ( m i s ) t ob em o r e o p e n ,f l e x i b l e ,q u i c k l y r e s p o n s i b l ea n dr e u s a b l e t h i sk i n do fv a r i e t yp u t sf o r w a r dt h e n e wc h a l l e n g et ot h ed e v e l o p m e n to fm i s ,f o re x a m p l e ,h o wt od e v e l o pm i sw i t h h i g hq u a l i t ya ss oa sf a s tt os a t i s f yt h ed i f f e r e n tr e q u i r e m e n t s ,h o wt od e v e l o pan e w m a n a g e m e n ti n f o r m a t i o ns y s t e mb a s e do nt h eo r i g i n a ls y s t e m , h o wt or e p l yt h e c u s t o m e r sm u l t i f a r i o u sn e e da l t e r a t i o ni nd e v e l o p m e n tp r o c e s s ,h o wt oh a n d l ew i t h c o n t i n u o u s l yc o r r u p to ft h ec o d ea n dt h es y s t e ms t r u c t u r ei nd e v e l o p m e n tp r o c e s s f a c et h e s en e wc h a l l e n g e s ,t h et r a d i t i o n a ls o f t w a r ed e v e l o p m e n tm e t h o d ss e e mt ob e i n c a p a b l e ,u s i n gt h er e f a c t o r i n gt e c h n i q u ea n dd e s i g n i n gp a t t e r nb e c o m e so n eo ft h e b e s tm e t h o d st h a tr e s o l v e st h i s p r o b l e m - b u i l d i n gu pt h eg o o dd e v e l o p m e n t e n v i r o n m e n t t h et a r g e to fr e f a c t o r i n gi sab r i e fd e s i g n , w h i c hm o s ti m p o r t a n t c h a r a c t e r i s t i ci sa ne a s yo r i e n t a t i o nv a r i e t y ,a n dd e s i g n i n gp a t t e mi st h eb e s t a n n o t a t i o no ft h eb r i e fd e s i g n t h ef i r s tc h a p t e ri n t r o d u c e dt h eb a c k g r o u n do ft h et o p i cd e v e l o p m e n t ,a n d c h a p t e r2i n t r o d u c e dt h et e c h n i c a lt h e o r i e so fd e s i g np a t t e r na n dr e f a c t o r i n g t h er e s t c h a p t e r si n t r o d u c e dt h ed e s i g no ft h er i g h tm o d u l e ,a n a l y z e dt h ee x i s t e n ts h o r t a g ei n t h ed e s i g n ,a n dp u tf o r w a r dak i n do fe x c e l l e n tt u r nt h ec o d ed e s i g no ft h i n k i n g ,t r yt o u s er e f a e t o r i n gt e c h n i q u ea n dd e s i g n i n gp a t t e r nt om a k et h ec o d ed e s i g nb e t t e r , a n d d i s c u s st h ef l e x i b l yu s eo fr e f a c t o r i n gt e c h n i q u ea n dd e s i g n p a t t e r ni ns y s t e m d e v e l o p m e n tf r o mt h ep a g er e f a c t o r i n g ,t h ec o d er e f a c t o r i n g ,a n dt h ed e s i g np a t t e r n t h r e ee m p h a s i z e d i ti sv e r i f i e db yt h ed o gm a n a g e m e n ti n f o r m a t i o ns y s t e mt h a ti t i m p r o v et h ef u n c t i o no ft h es y s t e m , r e d u c eag r e a td e a lo fg a r b a g ec o d e ,a n di m p r o v e t h ee x p a n s i b i l i t ya n dt h em a i n t a i n a b l eo ft h es y s t e m t h el a s t c h a p t e rm a k e sa s u m m a r ya n do u t l o o ko ft h ew o r k k e yw o r d s :r e f a c t o r i n g ,d e s i g np a t t e r n ,b f i s ,n e t 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作和取得的 研究成果,除了文中特别加以标注和致谢之处外,论文中不包含其他人已经发表 或撰写过的研究成果j 也不包含为获得基盗盘鲎或其他教育机构的学位或证 书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中 作了明确的说明并表示了谢意。 学位论文作者签名:粥 签字日期: 砷年月彳日 学位论文版权使用授权书 本学位论文作者完全了解苤洼盘堂有关保留、使用学位论文的规定。 特授权墨凄盘堂可以将学位论文的全部或部分内容编入有关数据库进行检 索,并采用影印、缩印或扫描等复制手段保存、汇编以供查阅和借阅。同意学校 向国家有关部门或机构送交论文的复印件和磁盘。 ( 保密的学位论文在解密后适用本授权说明) 学位论文作者签名: 、 研锨 导师签名: j 尹 彳修交 签字日翌:叼年,月吵日签字日期:砧矽年1 月叶日 2 第一章绪论 第一章绪论 1 1 课题的研究背景与意义 信息化是社会发展的先导,而在企业的信息化进程中,应用系统的开发无疑 正在成为信息化发展的主流。一个不争的事实摆在了我们的面前,就是在当今社 会的信息系统建设项目中,应用系统开发项目所占的比例越来越大。这种变化使 系统开发面临着新的挑战:如何快速且高质量地开发出能够满足不同需求的应用 系统,如何更好的在原有系统基础上开发出新的应用系统,如何在开发过程中应 对客户频繁的需求变更,如何在开发过程中处理系统中的代码与系统结构的不断 腐化。面对这些挑战,传统的开发方法己显得无能为力了,建立良好的开发环境, 引入重构技术己经成为解决这一问题的最佳方法之一。 重构【嘧捌( r e f a c t o r i n g ) 就是在不改变可观察行为的前提下,对软件内部结 构的改变,目的是使它更易于理解并且能够更廉价地进行改变。就是说系统重构 之前软件实现什么功能,之后照样实现什么功能。重构是使用各种手段重新整理 一个对象设计的过程,使设计更加灵活并且更可重用。开发人员可能有几个理由 来做这件事情,其中效率和可维护性是最重要的原因。 系统重构的目标就是一个简单完好的设计,而一个简单完好设计最重要的特 性就是容易适应变化。这就要使得代码更易为人所理解,能够简单地被修改和扩 展。为了达到这个目的,系统中就要有最少数目的类和方法。要易于理解系统, 那么系统中每一个类应当和需要解决的问题的每一个重要概念相对应,如果人工 加入许多毫无意义的类或者太多与问题概念无法对应的类,系统将无法理解。另 外,设计模式,6 】是对简单完好设计的最好诠释。设计模式是面向对象设计经验 的总结,主要有以下特点: 1 ) 设计模式侧重于系统动态行为特征的分析和抽象。 2 ) 设计模式更侧重于对象组合而不是继承。如今软件系统的演化越来越依 赖于对象复合而不是继承。继承常被认为破坏了封装性,子类揭示了父 类的实现细节,其实现与父类有紧密的依赖关系。基于对象组合可使类 的层次和数量减少,从而设计更为简洁,可扩展性好。 3 ) 设计模式为类继承中的层次划分提供指导。面向对象设计中类的层次划 分至关重要,类可分为哪几个层次,哪些方法,属性应该在那个层次引 入等等。类的层次划分过少将导致设计的封装性差,过多则导致程序笨 第一章绪论 重而失去可维护性,可调整性,可扩展性。设计模式从系统动态行为特 征的角度,将类之间的相互作用进行分层包装,在此基础上合理分配各 方法属性。 好的设计模式,就是对于待解决的问题所能发现的最简单、最易重用的设计 结构。另一方面,使用广为人知的设计模式也使得代码更容易为人理解、接受, 大大提高了交流的效率、宽度和深度。 1 2 国内外研究现状 目前国外软件重构方面的主要工作有: m a r t i n f o w l e r 整理前人和自己在重构方面的工作经验j 总结手动重构的方法, 给出重构的分类 7 1 。 j o s h u ak e r i e v s k y 总结了在重构时应用设计模式的手动方法,并给出每个模式 可以应用的约束。它的重构主要讨论构造式和结构式设计模式。 m e l oc i n n e i d e 提出将设计模式以保留程序行为的方式自动引入已存在代码 的方法。他构建了可复用的迷你模式( m i n i p a t t e m ) 库来帮助完成设计模式转换的 工作嘲。 目前国内软件重构方面的主要工作有: 文献 9 】首先提出一种基于m a s 的企业信息化系统层次结构,然后设计了1 0 类完成特定软件功能的a g e n t ,在此基础上构建基于m a s 的可重构管理信息系 统框架并研究了系统的实施方案。 文献【l o 】首先分析归纳了w e b 应用系统的各种体系结构特征,在此基础上讨 论了即存应用系统向w e b 进行升级重构的可行方案,给出其基本框架。 文献 1 1 】提出一种自动引入中间人设计模式到己存在代码的重构方法,用来 解决具有复杂依赖关系的类之间协作的封装问题。 文献 1 2 1 结合证券交易仿真系统,介绍了对系统重构的应用。 文献【1 3 】结合实际的项目经验,给出了一个结合运用重构技术和面向方面编 程技术的功能模型,并利用此功能模型来指导和促进应用系统快速且健康地发 展。 文献 1 4 1 结合a s p 原理,采用领域工程的方法对灯饰企业信息化需求进行系 统分析,使用软构件的方法对系统进行设计和开发,引用工作流实现企业业务流 程的定制和动态改变,开发出面向灯饰企业的可动态重构的a s p 模式的管理信 息系统。 文献 1 5 】研究了基于w e b 的软件系统中重构技术的理论、方法和应用。 2 第一章绪论 1 3 研究的内容和主要工作 在传统的管理信息系统的设计过程中,由于客户需求的不断变化,代码和系 统的体系结构也在不断的修改,结果被改的面目全非,重复代码也是随处可见, 使得应用系统中几乎所有的重要信息都变得重复,开发团队根本不能看到这种代 码还有什么良好的设计,即使有的话也已经不可辨识了。软件开发周期往往很长, 这给系统的设计和维护带来了很大的困难。本课题就是研究在整个开发过程中如 何利用重构技术改善代码设计,保持代码的易读性、易修改性,并在此基础上构 建一个设计良好的养犬管理信息系统,提高编程效率,具有比较强的理论意义和 实际应用价值。 本文的研究内容和主要工作包括以下方面: 1 设计模式和重构技术的分析总结。分析总结了设计模式的原则,设计模 式的四个要素,并对经典的2 3 种设计模式进行概括。 2 介绍了通用权限模块的设计,并介绍基于c s 结构和基于j 2 e e 平台应用 此通用权限模块的成功案例,分析了设计中存在的不足,并在此基础上依据设 计模式和重构策略改进代码设计,使得养犬系统中的权限模块变得设计良好。 3 重构这个系统。 这个系统选用c 样语言,基于n e t 构架。主要概括如下: 参照w e b 标准,重构w e b 项目中的动态网页。 参照设计模式,重构系统架构。 参照重构策略,改进代码设计。 4 总结重构后设计的优势和不足,以及下一步需要解决的问题。 1 4 文章结构安排 本文首先介绍相关的技术背景,然后分析现有的解决方案。在此基础上提出 本系统的改进方案,接着说明关键技术和实现机制。根据这个思路,本文组织如 下: 第一章绪论是本文的总体概括,主要介绍课题的研究背景与意义,国内外研 究现状以及论文的内容。 第二章设计模式和重构技术是本文的理论基础,本章分为两小节内容,第一 节主要详细介绍设计模式的原则,设计模式的要素和设计模式与重构的关系。第 二节主要介绍重构的目的,重构的策略,最后介绍了重构在软件开发中的地位及 其作用。 第一章绪论 第三章,介绍了通用权限模块的设计,并介绍基于c s 结构和基于j 2 e e 平 台应用此通用权限模块的成功案例,分析了设计中存在的不足,提出了参照通用 权限的设计开发原理对养犬系统中的权限管理模块进行重构的思想,这是本文的 重点。 第四章,重构技术在养犬管理信息系统中的应用。详细介绍根据第二章介绍 的理论部分,从页面重构,代码重构和引入设计模式几个方面介绍如何把理论与 实际相结合,并给出应用实例。 第五章,总结与展望。对全文研究工作进行总结,并对未来研究工作作出展 望。 4 第二章设计设计模式及重构技术 2 1 设计模式 第二章设计模式及重构技术 2 1 1 设计模式概述 设计模式的定义为:对被用来在特定场景下解决一般设计问题的类和相互通 信的对象的描述t 4 j 。鲁迅先生曾经说过说:“地上本没有路,走得人多了也就成 了路 。设计模式如同此理,它是经验的传承,并非体系,是被前人发现,经过 总结形成了一套某一类问题的一般性解决方案,是代码设计经验的总结。开发的 目标是追求有效的设计,而设计模式可以为这个目标提供某种参考模型、设计方 法。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠 性【1 6 1 。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制 真正工程化。这体现在:设计模式使人们可以更加简单方便地复用成功的设计和 体系结构。设计者可以从中学习前人的一些设计经验,迅速成为软件设计领域的 专家;设计模式易于软件扩展。将己证实的技术表述成设计模式也会使新系统开 发者更加容易理解旧系统设计思路,甚至可以在原有系统上进行扩展来满足新的 需求,解决了软件产业的人员流动问题;设计模式有利于系统维护。通过提供一 个显式类和对象作用关系以及它们之间潜在联系的说明规范,设计模式能够提高 已有系统的文档管理和系统维护的有效性。 2 1 2 研究设计模式的意义 设计模式可以为软件设计带来很多好处: 设计模式为开发者提供了好的设计经验,模式中所描述的解决方案使人们从 不同角度对一个问题进行研究,然后得出来最通用,最灵活的解决方案,其有效 性已经在很多设计中得到证实,其中蕴含了有经验的程序员的设计经验。将经过 验证的技术表述为模式可以使新系统的开发者更容易理解,并且以过去成功的开 发经验来指导当前的软件开发,可避免传统上靠一次经验而导致的失误。 设计模式为项目之间、程序员之间重用面向对象代码提供一种方便的途径, 使得重用成功设计和结构更加容易。每个模式都是软件设计中可重用元素,一个 熟悉设计模式的设计者可以在其设计中直接应用模式,而无需重新设计和开发它 们。一个没有经验的程序员也可借助于设计模式提高设计水平。多个模式可以组 第二章设计设计模式及重构技术 合起来构成完整的系统,这种基于模式的设计具有更大的灵活性,可扩展性和更 好的重用性。同时,基于模式的设计还能够加快设计的速度,并提高开发队伍的 生产力和软件的质量。 模式为程序员提供了共同的词汇。当一个模式被写出来,它就可以在程序员 之间讨论,这使得程序员可以更好地合作和分享他们的智慧,也可以避免讨论问 题的歧义。 设计模式的基本思路是将程序中可能变化的部分与不变的部分分离,尽量减 少对象之间的耦合,当某些对象发生变化时,不会导致其他对象都发生变化。为 了实现这个目标,模式中一个常见的方法是在类或对象间增加一个中间类或对 象,这样做的结果不仅使得代码更容易扩展和维护,而且也让程序更容易读懂。 通过明确地表达类和对象的关系和意图,设计模式甚至可以改进现有系统的文档 和维护。可以说,设计模式帮助设计者更快更好的设计。 由此可见,对设计模式进行研究是很有意义的。 2 1 3 设计模式和架构 模式关注的重点在于通过经验提取的“准则或指导方案”在设计中的应用, 因此在不同层面考虑问题的时候就形成了不同问题域上的模式。模式的目标是把 共同问题中的不变部分和变化部分分离出来,不变的部分,就构成了模式,因此, 模式是一个经验提取的“准则 ,并且在一次一次的实践中得到验证,在不同的 层次有不同的模式,小到语言实现,大到架构。所以也有另外一些人强调要划分 三种不同层次的模式:架构模式( a r c h i t e c t u r a lp a t t e r n ) 、设计模式( d e s i g np a t t e r n ) 、 成例( i d i o m ) u 引。成例有时称为代码模式( c o d i n gp a t t e r n ) 。这三者之间的区别在于 三种不同的模式存在于它们各自的抽象层次和具体层次上。在不同的层面上,模 式提供不同层面的指导。架构模式也叫做系统模式,描述软件系统里的基本的结 构组织或纲要。架构模式提供一些事先定义好的子系统,指定它们的责任,并给 出把它们组织在一起的法则和指南。总体来说架构更加关注的是一个系统的高层 次策略,涉及到大尺度的组件以及整体性质和力学。架构的好坏可以影响到总体 布局和框架性结构。而设计模式是中等尺度的结构策略。这些中等尺度的结构实 现了一些大尺度组件的行为和它们之间的关系。模式的好坏不会影响到系统的总 体布局和总体框架。代码模式是特定的范例和与特定语言有关的编程技巧。代码 模式的好坏会影响到一个中等尺度组件的内部、外部的结构或行为的底层细节, 但不会影响到一个部件或子系统的中等尺度的结构,更不会影响到系统的总体布 局和大尺度框架。 另外,设计模式有助于对框架结构的理解,成熟的框架通常使用了多种设 6 第二章设计设计模式及重构技术 计模式,如果熟悉这些设计模式,毫无疑问,开发者将迅速掌握框架的结构。一 般开发者如果突然接触e j b 、j 2 e e 和n e t 等框架,会觉得特别难学,难掌握, 那么转而先理解和掌握设计模式,无疑是给了开发者剖析e j b 、j 2 e e 或n e t 框 架的一把利器。 2 1 4 设计模式的原则 近年来,开发者为了代码复用,增加可维护性,都开始注意设计模式。这里 有三大面向对象的设计原则【1 7 】: 1 针对接口编程,而不是针对实现编程。接口在这里可以理解为抽象类。 调用程序无需知道所使用对象的特定类型,只需要知道对象拥有调用程序所期望 的接口。类似于黑盒。 2 优先使用对象组合,而不是类的继承。类继承通常为白盒复用。对象组 合通常为黑盒复用。继承在某种程度上破坏了封装性,子类父类耦合度高;而对 象组合则只要求被组合的对象具有良好定义的接口,耦合度底。 3 封装变化点 使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修 改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。 还有几个具体的原则:“开一闭原贝l j ( o p e nc l o s e dp r i n c i p a l ) 、里氏代换原则 ( l i s k o vs u b s t i t u t i o np r i n c i p l e ) 、合成复用原则( c o m p o s i t i o nr e u s ep r i n c i p l e ) 、 依赖倒置原则( d e p e n d e n c eh v e r s i o np r i n c i p l e ) 、接口隔离原则( i n t e r f a c e s e g r e g a t i o np r i n c i p l e ) 【1 8 】。设计模式就是实现了这些原则,从而达到了代码复用、 增加可维护性的目的。 1 “开一闭”原则( o c p ) 一个维护性良好的系统应该遵循“开一闭原则”。即:封闭对原来代码的修 改,开放对原来代码的扩展( 如类的继承,接口的实现) 。模块应尽量在不修改 原来的代码情况下进行扩展。 2 里氏代换原则( l s p ) 里氏代换原则是由“b a r b a r al i s k o v 提出的。如果调用的是父类的话,那么 换成子类也完全可以运行。即子类必须能够替换它们的基类,但反过来的代换不 成立。可以说:里氏代换原则是继承复用的一个基础。 3 合成复用原则( c r p ) 就是说要少用继承,多用合成关系来实现。当发现修改一个小功能,或增加 一个小功能时,就引发一次代码地震,也许是设计抽象度不够理想,功能代码太 过分散所引起的。而面向对象是要把波动限制在尽量小的范围。要让各个类尽可 第二章设计设计模式及重构技术 能少的跟别人联系,“不要与陌生人说话。这样,城门失火,才不至于殃及池鱼。 扩展性和维护性才能提高。 4 依赖倒置原则( d 口) 抽象不应该依赖于实现细节,实现细节应当依赖于抽象。高层模块不应该 依赖于低层模块,二者都应该依赖于抽象。依赖倒置原则形式化了抽象藕合的概 念,清楚地表述了应该在抽象层耦合,而不要在具体层耦合。从编程上来说,当 开发者不能确定是否类的实现在将来会改变时,都应该应用这一原理。其解决方 法有两个。第一,通过c l a s s 类及其n e w l n s t a n c e 方法来动态加载对象。第二, 使用对象工厂。 5 接口隔离原则( i s p ) 不应该强迫客户程序依赖于它们不用的方法。接口分离原理建议:多个专用 接口优于一个单一的通用接口。所定义的任何接口都应具有高内聚性。接口提供 了灵活性:它可以使对象呈现为一种接口对象类型。因此,接口就是对象在其生 命期中在某些时刻所扮演的某种简单的角色。在设计接口及接口上的操作时,应 当遵循不要让接口具有多重角色。一个接口应该保证实现该接口的类的实例对象 可以只呈现为单一的角色。 2 1 5 模式的四个基本要素 通常一个设计模式由4 个基本要素组成: , 1 模式名称( p a t t e r nn a m e ) 设计模式的名称,它用一两个词来描述模式的问题、解决方案和效果。设 计模式允许开发者在较高的抽象层次上进行设计。基于一个模式词汇表,开发人 员自己以及同事之间就可以讨论模式并在编写文档时使用它们。模式名可以帮助 思考,便于与其他人交流设计思想及设计结果。找到恰当的模式名也是设计模式 编目工作的难点之一。 2 上下文( c o n t e x t ) 描述了模式的应用场景,即在何种状况下发生作用。 3 动机( s y s t e mo f f o r c e s ) 描述该设计模式的预期的目标。它解释了设计问题和问题存在的前因后果, 它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不 灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列 先决条件。 4 解决方案( s o l u t i o n ) 详细描述该设计模式的结构、实现、各组件之间相互关系及各自的职责和协 第二章设计设计模式及重构技术 作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描 述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具 有一般意义的元素组合( 类或对象组合) 来解决这个问题。 出发点的不同会产生对什么是模式和什么不是模式的理解不同,一个人所理 解的模式对另一个来说可能只是基本构造部件。一个设计模式命名,抽象确定了 一个通用设计结构的主要方面。这些设计结构能够被用来构造可复用的面向对象 的设计。设计模式确定了所包含的类和实例,它们的角色,协作方式及其职责分 配,每个设计模式都有集中于一个特定的面向对象设计问题或设计要点,描述了 什么时候使用它,在另一些设计约束条件下是否还能使用,以及使用的效果和如 何取舍。 2 1 6 经典的2 3 种设计模式分类口町 设计模式主要用于得到简洁灵活的系统设计,e n r i c hg a m m a 等人将设计模式 按其解决问题的不同分为创建型( c r e a t i o n a l ) ,结构型( s t r u c t u r a l ) 和行为型 ( b e h a v i o r a l ) 三种。 2 1 6 1 创建型模式 该类型模式是对对象实例化过程的抽象,它通过采用抽象类所定义的接口封 装了系统中对象如何创建,组合等信息。 1 ) 抽象工厂模式( a b s t r a c tf a c t o r y ) :抽象工厂是创建对象族。它能确保 该创建对象家族的一致性,和对象家族发生改变的灵活性,在跨平台的 设计中可以得到应用。 2 ) 原型模式( p r o t o t y p e ) :一种将对象生成的责任代理给自己的模式。它 与c + + 中的拷贝函数不同,c + + 不支持拷贝函数的多态,即当对象使 用基类的指针进行引用时,无法按照子类进行拷贝,会造成切割。 p r o t o t y p e 在j a v a 中得到大量的应用。 3 ) 生成器模式( b u i l d e r ) :侧重点在于对象创建的过程中,避免在c o d e 中出现大量的硬代码,当被创建对象结构发生改变时,避免了对散布在 程序中的大量的n e w 语句的修改。 4 ) 工厂方法模式( f a c t o r ym e t h o d ) :实现了生成对象不确定时的解决方案。 实际上在c + + 和j a v a 中,对于虚函数的理解比较容易,即某个方法不确 定时,使用虚函数来声明,而将具体的实现交给子类,f a c t o r ym e t h o d 实 现了对象创建时的多态。 5 ) 单件模式( s i n g l e t o n ) :s i n g l e t o n 模式主要作用是保证在j a v a 应用程序 9 第二章设计设计模式及重构技术 中,一个类c l a s s 只有一个实例存在。s i n g l e t o n 模式类似于一种技巧, 它强制实现了有限定量对象的产生。 2 1 6 2 结构型模式 该类型模式主要用于如何组合已有的类和对象以获得更大的结构。一般借鉴 封装,代理,( 多) 继承等概念将一个或多个类或对象进行组合,封装,以提供 统一的外部视图或新的功能。 1 ) 组合模式( c o m p o s i t e ) :适用于表达整体一部分关系,可以忽略单个对 象和合成对象之间的差别,它实际上采用的是一种树结构。 2 ) 装饰模式( d e c o r a t o r ) :动态地给一个对象添加一些额外的职责。就增 。加功能来说,d e c o r a t o r 模式相比生成“子类 更为灵活。 3 ) 代理模式( p r o x y ) :为其他对象提供一种代理以控制对这个对象的访问。 结构与d e c o r a t o r 非常相似,它们的侧重点不同,一种是修改对象的行为, 另一种控制访问。 4 ) 桥接模式( b r i d g e ) :实现了抽象和实现之间的永久绑定,可以理解为在基 于已有的构件上设计时,而且已有的设计可能会发生变化,它往往与 a b s t r a c tf a c t o r y 共同用于跨平台设计情况。 5 ) 外观模式( f a g a d e ) :为子系统中的一组接口提供一个一致的界面,f a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 6 ) 适配器模式( a d a p t e r ) :用于对象的接i z l ,将两个不兼容的类纠合在一 起使用。属于结构型模式,需要有a d a p t e r ( 被适配者) 和a d a p t o r ( 适 配器) 两个身份,用于在两种接口之间创建一个混合接口。 7 ) 享元模式( f l y w e i g h t ) :用于对象的存储开销。避免大量拥有相同内容 的小类的开销( 如耗费内存) ,使大家共享一个类( 元类) 。 2 1 6 3 行为模式 该类模式主要用于对象之间职责及其提供的服务的分配,它不仅描述对象或 类的模式,还描述它们之间的通信模式,特别是描述一组对等的对象怎样相互协 作以完成其中任一对象都无法单独完成的任务。 1 ) 职责链模式( c h a i no f r e s p o n s i b i l i t y ) :用于链状结构,将职责沿链进行 传递,不显示指定责任的承担人,由对象自己实现责任的实施。 2 ) 命令模式( c o m m a n d ) :将某个职责封装成对象,可以与m e m e n t o 结合 在一起用于u n d o 。 3 ) 模板模式( t e m p l a t e ) :定义一个操作中算法的骨架,将一些步骤的执 1 0 第二章设计设计模式及重构技术 行延迟到其子类中。 4 ) 中介者模式( m e d i a t o r ) :通过中介对象的引入将网状的结构变成以中 介者为中心的星型结构,从而保证了对象结构上的稳定,即不会因为新 对象的引入造成大量类中指针的修改。 5 ) 观察者模式( o b s e r v e r ) :可以大量应用于控制密集型的系统中。 6 ) 状态模式( s t a t e ) :经典m v c 模式的变形,与m e d i a t o r 的结构类似, 在对象级别是星形结构。它们均是将网状结构变成星形结构,但侧重点 不同。 7 ) 策略模式( s t r a t e g y ) :将算法进行封装,适合应用于对效率要求较高的 软件中,为效率提高预留接口。 8 ) 访问者模式( v i s i t o r ) :在对象级别中实际为矩阵结构,与a b s t r e t f a c t o r y 类似。它们以采用对象的代理,为矩阵的一个维度提供灵活性和一致性。 9 ) 备忘录模式( m e m e n t o ) :是一个保存另外一个对象内部状态拷贝的对 象,这样以后就可以将该对象恢复到原先保存的状态。 1 0 ) 解释器模式( i n t e r p r e t e r ) :定义语言的文法,并且建立一个解释器来解 释该语言中的句子。 2 1 7 设计模式与重构的关系 重构是模式设计中不可缺少的一部分。在实践中,几乎不可能会有一步到位 的设计模式。这一方面是由于分析和设计一个领域的应用程序需要具有该领域的 丰富知识,而这种知识不是在一开始都能获得的,通常需要在实践反馈的过程中 才能一步步加深自己对该领域的理解。因而一开始的设计可能并不能正确反映系 统的内在本质,也不可能在代码中得到很好的反映。另一方面,即使一开始的设 计是完好的,随着用户对系统使用的深入,新的需求可能会被加入,旧的需求会 被修改、删除,一个最先的设计不可能完全预料到这些变化。设计模式是通过不 断的系统重构来实现的。而设计模式也为重构提供了目标。重构意味着对一个应 用系统所做的修改是为了优化系统,而不是提供增强特性。重构是一项能够使得 开发人员确信在开发中对以结构为中心的视图进行维护的技术,其重点在于优化 应用设计。 2 2 重构 程序设计的过程中,代码被阅读和被修改的次数远远多于它被编写的次数。 很多项目在初步的设计中结构是优良的,代码品质是优秀的,但随着项目不断进 第二章设计设计模式及重构技术 展,需求和人员的变化,结构越来越不适合现状,代码质量越来越差,虽然也能 实现功能,但代码品质的腐化很严重。这种情况下,需要的就是重构! 不断重构, 才能让代码不断保持优雅,保持效率,保持可维护性。 2 2 1 重构的定义 关于重构的定义很多,引用重构一改善既有代码的设计作者下的定义, 重构就是“对软件内部结构的一种调整,目的是在不改变软件之可察行为前提下, 提高其可理解性,降低其修改成本 【1 1 。重构是一种程序整理方法,可以将整理 过程中不小心引入错误的机率降到最低。本质上说,重构就是“在代码写好之后 改进它的设计”。这与目前软件开发设计观点相反。目前软件开发的设计观点是 先设计而后编码。首先得有一个良好得设计,然后才能开始编码。但是,随着时 间流逝,人们不断提出新的需求,设计者不断修改代码,于是程序将逐渐失去自 己的结构,程序员愈来愈难通过阅读源代码而理解原本设计。重构正好与此相反。 通过重构可以使代码设计变得良好,简洁。重构的每个步骤都很简单,只要把某 个值域( f i e l d ) 从一个类移到另一个类,把某些重复使用的代码从一个函数 ( m e t h o d ) 拉出来构成另一个函数。但是,这些小小的修改积累起来就可以根本 改善设计质量【l 】。通过重构,开发者会发现所谓设计不再是一切动作的前提,而 是在整个开发过程中逐渐浮现出来。 2 2 2 重构的目的 通过重构可以达到以下的目标: 改进软件设计 因为好多程序设计人员在完全理解整体设计之前就开始了程序设计,还有很 多软件根本就没有很好的设计,这样,程序员在进行程序设计的时候必然要面临 很多潜在的问题,最明显的例子就是程序的结构越来越混乱,可读性差,并且出 现了很多的重复的代码。这意味着要完成一件事情常常需要更多的代码。因此重 构最重要的课题之一就是排除重复。代码结构的流失是积累性的。重构很象是在 整理代码,因此,需要进行重构以改善软件设计。这样做虽然不能直接提高软件 的效率,但却让代码的修改和理解变得更为容易、系统的结构更加清晰。 使代码更易为人所理解 这里的理解包含两个方面的含义。首先,在重构的过程中,加深设计者本身 对系统的理解。孔子说过:温故而知新。重构代码时逼迫设计者加深理解原先所 写的代码,发现其中的问题和隐患,构建出更好的代码。其次,重构使得代码更 容易被他人理解,修改和维护。软件的生命周期往往需要多批程序员来维护,系 1 2 第二章设计设计模式及重构技术 统重构支持更小的类、更短的方法、更少的局部变量、更小的系统耦合,让名字 反映出设计者的意图。这样使代码具备很好的可读性,让其他人员能够看得懂。 有助于提高编程效率 改善程序设计、提高代码的可读性、减少缺陷都是为了稳住阵脚。良好的设 计才是快速软件开发的根本。重复代码愈多,开发人员理解系统的时间和修改代 码花费的时间就会愈长。停下来通过重构改进设计,或许会在当前减缓速度,但 它带来的后发优势却是不可低估的。 2 2 3 重构的策略 通过重构,开发人员可以保证随时在程序中反映出自己对于“应该如何设计 程序 的完整理解。对系统理解不够完整的设计决策,也会很快地将它们的影响 蔓延到整个程序中。要根除这种错误,一个、两个、甚至十个单独的行为都是不 够的,只有持续而无处不在的重构才有可能成功。 四种大型重构策略如下: t e a s e a p a r ti n h e r i t a t a n c e :用于处理混乱的继承体系,这种继承体系往往 以一种令人迷惑的方式组合了数个不同方面的变化。 c o n v e r tp r o c e d u r a ld e s i g nt oo b j c o t s :可以帮助开发人员解决如何处理程 序性代码的问题。 s e p a r a t ed o m a i nf r o mp r e s e n t a t i o n :许多使用面向对象语言的程序员,其 实并没有真正理解面向对象技术,因此常会需要使用这项重构。以传统 的双层结构方式编写的代码,可以通过这种手法将业务逻辑和用户界面 隔离开来。 e x t r a c th i e r a r c h y :可以将过于复杂的类转变为一群子类,从而简化系统。 除了大型重构策略之外,还需要进行一些细枝末节的调整。主要的重构策略 如下【l 】: 尽量消除重复的代码,将它们合而为一 良好设计的其中一条准则就是所有逻辑都只在唯一地点指定。为此,必须消 除重复代码,将它们合而为一。根据重复的代码出现在不同的地方,分别采取不 同的重构的策略。这有两种情况,如果同一个类中有相同的代码块,通过提炼类 提炼出重复的代码,然后在这些地方调用上述提炼出方法。如果不同类中具有相 同的代码,把它提炼成一个新类,在另一个类中调用新生成的类,从而消除重复 代码。 拆解过长的函数【2 0 】 很久以前程序员就已经意识到了程序愈长就愈难理解。程序愈长,就意味着 第二章设计设计模式及重构技术 花在代码阅读和理解上的时间越长。过长的函数在日常代码中经常可见,在c 眷 中常通过# r e g i o n # e n d r e g i o n 区隔为不同的功能区域。最好的解决办法就是把过长 的函数按照功能的不同进行适当拆解为小的函数,并且给这些小函数一个好名 字。通过名字来了解函数提供的功能,提高代码的理解性。 拆解过大的类 过大的类往往是类抽象不合理的结果,类抽象不合理将降低了代码的复用 率。过长的方法由于包含的逻辑过于复杂,错误机率将直线上升,而可读性则直 线下降,类的健壮性很容易被打破。当看到个过长的方法时,需要想办法将其 划分为多个小方法,以便于分而治之。 重构策略:通过e x t r a c t c l a s s 将一些相关成员变量移植到新的类中,如 e m p l o y e e 类,一般会包含有联系方式的相关属性( 电话,m o b i l e ,地址,z i p 等 等) ,则可以将这些移植到新的e m p l o y e e c o n t a c t 类中。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论