`
380071587
  • 浏览: 449120 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

封装的变化之不断变化的需求

 
阅读更多

软件设计最大的敌人,就是应付需求不断的变化。变化有时候是无穷尽的,于是项目开发就在反复的修改和更新中无限期地延迟交付的日期。变化如悬在头顶的达摩克斯之剑,令许多软件工程专家一筹莫展。正如无法找到解决软件开发的“银弹”,要彻底将变化扼杀在摇篮之中,看来也是不可能完成的任务。那么,积极地面对“变化”,方才是可取的态度。于是,极限编程(XP)的倡导者与布道者Kent Beck提出要“拥抱变化”,从软件工程方法的角度,提出了应对“变化”的解决方案。而本文则试图从软件设计方法的角度,来探讨如何在软件设计过程中,解决未来可能的变化,其方法就是——封装变化。

设计模式是“封装变化”方法的最佳阐释。无论是创建型模式、结构型模式还是行为型模式,归根结底都是寻找软件中可能存在的“变化”,然后利用抽象的方式对这些变化进行封装。由于抽象没有具体的实现,就代表了一种无限的可能性,使得其扩展成为了可能。所以,我们在设计之初,除了要实现需求所设定的用例之外,还需要标定可能或已经存在的“变化”之处。封装变化,最重要的一点就是发现变化,或者说是寻找变化。

GOF对设计模式的分类,已经彰显了“封装变化”的内涵与精髓。创建型模式的目的就是封装对象创建的变化。例如Factory Method模式和Abstract Factory模式,建立了专门的抽象的工厂类,以此来封装未来对象的创建所引起的可能变化。而Builder模式则是对对象内部的创建进行封装,由于细节对抽象的可替换性,使得将来面对对象内部创建方式的变化,可以灵活的进行扩展或替换。

至于结构型模式,它关注的是对象之间组合的方式。本质上说,如果对象结构可能存在变化,主要在于其依赖关系的改变。当然对于结构型模式来说,处理变化的方式不仅仅是封装与抽象那么简单,还要合理地利用继承与聚合的方法,灵活地表达对象之间的依赖关系。例如Decorator模式,描述的就是对象间可能存在的多种组合方式,这种组合方式是一种装饰者与被装饰者之间的关系,因此封装这种组合方式,抽象出专门的装饰对象显然正是“封装变化”的体现。同样地,Bridge模式封装的则是对象实现的依赖关系,而Composite模式所要解决的则是对象间存在的递归关系。

行为型模式关注的是对象的行为。行为型模式需要做的是对变化的行为进行抽象,通过封装以达到整个架构的可扩展性。例如策略模式,就是将可能存在变化的策略或算法抽象为一个独立的接口或抽象类,以实现策略扩展的目的。Command模式、State模式、Vistor模式、Iterator模式概莫如是。或者封装一个请求(Command模式),或者封装一种状态(State模式),或者封装“访问”的方式(Visitor模式),或者封装“遍历”算法(Iterator模式)。而这些所要封装的行为,恰恰是软件架构中最不稳定的部分,其扩展的可能性也最大。将这些行为封装起来,利用抽象的特性,就提供了扩展的可能。

利用设计模式,通过封装变化的方法,可以最大限度的保证软件的可扩展性。面对纷繁复杂的需求变化,虽然不可能完全解决因为变化带来的可怕梦魇,然而,如能在设计之初预见某些变化,仍有可能在一定程度上避免未来存在的变化为软件架构带来的灾难性伤害。从此点看,虽然没有“银弹”,但从软件设计方法的角度来看,设计模式也是一枚不错的“铜弹”了。

分享到:
评论

相关推荐

    基于Newtonsoft.Json实现Json数据解析和封装

    Newtonsoft.Json已经足够强大,易用性也没得说。但是在使用过程中存在着一个问题,如果数据不存在...JsonObject类和JsonArray类可以相互嵌套,支持原生类的JsonPath检索能力,满足Json数据解析和Json数据封装常见需求。

    ios常用动画封装类

    封装了常见的动画类,很好用 注释非常详细 如下: + (void)showAnimationType:(NSString *)type withSubType:(NSString *)subType duration:(CFTimeInterval)duration timingFunction:(NSString *)timingFunction...

    浅谈封装结构研发趋势

    无论晶圆级封装或3D封装,其结构型态经常需因客户端之要求而有所变化。如何增强研发能力以缩减封装开发流程并提高结构体之长时可靠度与提高组装良率以面对Time-to-Market的要求,对国内大多数以代工为主的封装厂而言...

    vue 2.0封装model组件的方法

    本文介绍了vue 2.0封装model组件的方法,分享给大家,希望对大家有所帮助 单文件组件 使用单文件组件封装model的模板、逻辑和样式,之后就可以在页面中调用此通用组件。... title:可变化标题 conte

    半导体设备行业投资报告:芯片制造工艺流程拆分,薄膜工艺,刻蚀工艺,光刻工艺,清洗工艺

    1)宏观经济变化影响人们消费能力和意愿,通过下游市场需求影响整个行业景气 度;2)技术革新通过刺激下游消费意愿甚至强制改变市场格局。以2020年为锚,5G商用化、数据中心、物联网、智慧城市、汽车电子等一系列新...

    vue实现多个echarts根据屏幕大小变化而变化实例

    有如下页面需求:在一个页面展示多个echarts图表,并且根据屏幕大小变化而变化。 实例 可以封装成组件使用,以增加代码复用性 // myCharts.vue <div class=charts-comps ref=charts></div> [removed] import ...

    plusDownload下载封装

    *plus 的download的封装工具类 1.本地缓存下载文件 2.增加storage,增加每一个本地缓存的有效时间戳 3.增加自定义设置方法,可以根据不同需求,对参数进行修改 4.采用下载队列进行下载管理,增加最大并发请求数,防止一次...

    传送网WDM、PTN、PON及集客工程基础知识小解.ppt

    主要功能信号封装和监控 1、业务需求变化传统的电路交换正逐步向基于IP承载的软交换演进;IP网电路颗粒变大,局向简化,网络结构简单化。省际层面基于2.5GPoS以上的大颗粒IP电路需求不断增加,155M以下的小颗粒电路...

    针对BGA封装可编程逻辑器件设计的低成本布板技术

     为了满足不断变化的市场标准和更短的产品上市时间,可编程逻辑器件(PLD)越来越广泛地应用于电路板和系统设计中。使用可编程逻辑器件能够加快产品上市时间,并且相对于特定应用集成电路(ASIC)和特定应用标准产品...

    针对java增量包对应路径得到class包封装的小程序.zip

    随着移动互联网技术的发展和用户需求的变化,【小程序名称】应运而生,以其轻量化、便捷化的设计理念为用户提供了一种全新的服务模式。作为一款无需下载安装即可使用的应用,【小程序名称】依托于微信庞大的生态系统...

    设计模式 创建型模式 Simple Factory模式(简单工厂)

    为了应对这种变化我们抽象出它比较稳定的接口,隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变,这就是我们经常谈的Factory模式了。 详细见博客 ...

    bpm_cordys框架

    在部署Cordys之后,企业可以对已经采用的技术进行集成、调整以及相应的改造,以便满足不断发展变化的业务需求,同时还可以基于各个系统灵活自如地实施、调整企业的业务流程。此外,在新开发项目中,企业还能采用...

    设计模式 创建型模式 Complex Factory模式(复杂工厂)

    为了应对这种变化我们抽象出它比较稳定的接口,隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变,这就是我们经常谈的Factory模式了。 详细见博客 ...

    简单封装了微信相关API,包括微信小程序,微信公众号,第三方平台.zip

    随着移动互联网技术的发展和用户需求的变化,【小程序名称】应运而生,以其轻量化、便捷化的设计理念为用户提供了一种全新的服务模式。作为一款无需下载安装即可使用的应用,【小程序名称】依托于微信庞大的生态系统...

    EDA/PLD中的针对BGA封装可编程逻辑器件设计的低成本布板技术

     为了满足不断变化的市场标准和更短的产品上市时间,可编程逻辑器件(PLD)越来越广泛地应用于电路板和系统设计中。使用可编程逻辑器件能够加快产品上市时间,并且相对于特定应用集成电路(ASIC)和特定应用标准产品...

    一个面向学习的java开源博客系统,减少过度封装,展现技术本质。集成微信小程序,QQ登录,腾讯云对象存储等功能.zip

    随着移动互联网技术的发展和用户需求的变化,【小程序名称】应运而生,以其轻量化、便捷化的设计理念为用户提供了一种全新的服务模式。作为一款无需下载安装即可使用的应用,【小程序名称】依托于微信庞大的生态系统...

    简单超市数据库管理系统需求分析.doc

    2)面向对象设计 在系统中将商品类型、商品等都封装成相应的类,同时每个类都有自己对应的集合类和 操作类,从而再次提高了对数据库操作的安全性和程序的可扩展性。 3)指导经营的功能 进销存管理系统并不仅仅能...

    基于WCF的分布式路灯监控系统(caj格式)

    本文以张家港路灯监控系统项目为背景,通过分析原有系统及信息化的需求,以微软公司的...总的来说,新系统具有更好的互操作性、复用性和扩展性,可以很好得适应业务需求的变化,能够充分满足路灯监控系统信息化管理的需求。

    Android源码下载脚本

    在Android目录结构没有变化的情况下,脚本能够很好的工作,如果有一天Android将一个Git目录移动到另一个目录下,则本脚本会下载新的目录,但老目录下的代码不会被删除。 虽然有些限制,但毕竟胜在简单,只需要安装一...

Global site tag (gtag.js) - Google Analytics