当前位置:编程学习 > JAVA >>

代码质量之可扩展性

<span style="font-weight: bold;">可扩展性的动力——不断变化的用户需求</span>

世界上不变的是变化,软件需求不会变化?不可能!一个系统是否拥抱变化是由它的可维护性和可扩展性决定的,软件环境的变化(可能是业务环境,运行环境)导致软件要进行改动才能满足人们对它的要求,这种系统本身适应变化的能力就是可扩展性。

可扩展性对系统的性能和复杂度都有影响,复杂度很高的项目很难维护,亦很难测试,我比较推崇可预见的、简单的扩展设计,愈简单愈好,避免前期大量的设计,对后期的无法预见的扩展,我们可以通过持续的重构来达到目标。所以,可扩展性不是一蹴而就的,是需要随着你对业务领域理解的深入而不断重构获得,一般三次可以达到比较理想的程度。

对于可扩展性的预见就像买股票一样,如果你买中了,你将会受益颇多,如果你没有买中,那么你的代码质量将面临臃肿和沉沦。这对你今后的维护和开发都造成不小的麻烦。

 

<span style="font-weight: bold;">如何构建灵活的系统?</span>

<span style="font-weight: bold;">白箱可扩展性</span>

<span style="font-style: italic;">开放箱式可扩展性</span>

含义:原始源代码可以查看和修改。

手段:

<ul style="direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"><li style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"><span>直接修改代码,没有足够的注释,需要阅读一易做图相关联的代码,才能理解其中的含义;代码风格混乱,完全不按标准出牌;码跟其他模块有牵连,需要其他模块修改,自己的工作才能进行。</span></li><li style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"><span>直接修改代码,有足够的注释,良好的代码风格,容易阅读和理解,而且修改之处值局限在一个类或者一个模块中。</span></li></ul><span style="font-style: italic;">玻璃箱可扩展性</span>

含义:可以查看源代码,但不能修改。

手段:

<ul style="direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"><li style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"><span lang="zh-cn">引入源代码工程和</span><span lang="en-us">jar</span><span lang="zh-cn">包,组合封装使用第三方的类库</span></li><li style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"><span lang="zh-cn">引入源代码工程和</span><span lang="en-us">jar</span><span lang="zh-cn">包,利用继承,编写子类,在子类中添加新的业务逻辑</span></li></ul>

<span style="font-weight: bold;">黑箱可扩展性</span>

<p style="margin: 0in; font-size: 10.5pt;"><span lang="zh-cn">含义:扩展现有系统而不直接扩展其原始代码,源代码通常不可见,提供文档和约定。到了黑箱这一步,才算真正满足</span><span style="font-family: calibri;" lang="en-us">ocp</span><span lang="zh-cn">原则</span><span lang="zh-cn">。</span>手段:

<ul style="direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;" type="disc"><li style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"><span>修改配置文件,需重新读取配置文件使其生效。通常来说,这些配置文件保存着技术参数或者业务逻辑等等。</span></li><li style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"><span>通过配置向导,比如使用什么数据库,使用什么语言环境,一般是在程序安装时候或者初始化配置时候将用户的选择保存在硬盘上,程序启动时会自动读取这些文件。</span></li><li style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"><span lang="zh-cn">对象动态装配,使用</span><span lang="en-us">java</span><span lang="zh-cn">反射技术,在运行时期装载类(</span><span lang="en-us">class.forname</span><span lang="zh-cn">),比较有名的是</span><span lang="en-us">spring</span><span lang="zh-cn">中的</span><span lang="zh-cn">依赖注入</span><span lang="zh-cn">,它其实也要配置</span><span lang="en-us">bean</span><span lang="zh-cn">文件。</span></li><li style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"><span>基于模块的运行时动态扩展,前面所说的都只是在比较细粒度上的技术扩展方式,而且都需要重新编译项目,才可能使新功能生效,都没有达到模块级别的扩展。osgi可以实现模块级别的动态扩展,而且是运行时的。所谓运行时模块的动态扩展,就是说你可以将新开发的类和文件按照bundle进行组织,然后直接扔到运行时环境下,这些功能就可以用了。eclipse的插件体系结构就是以equinox(一个osgi规范的实现)为核心构建的。     </span></li><li style="margin-top: 0; margin-bottom: 0; vertical-align: middle;"><span lang="zh-cn">基于平台,让开发人员自行扩展,平台和框架通常定义了一些hotspot(热点),在这些点上,可以进行扩展,比如</span><span style="font-family: calibri; font-size: 10.5pt;" lang="en-us">window</span><span lang="zh-cn">提供数千个</span><span style="font-family: calibri; font-size: 10.5pt;" lang="en-us">api</span><span lang="zh-cn">供应用程序调用,还有</span><span style="font-family: calibri; font-size: 10.5pt;" lang="en-us">firefox</span><span lang="zh-cn">、</span><span style="font-family: calibri; font-size: 10.5pt;" lang="en-us">chrome</span><span lang="zh-cn">的插件,以及各种应用平台(</span><span style="font-family: calibri; font-size: 10.5pt;" lang="en-us">facebook</span><span lang="zh-cn">、</span><span style="font-family: calibri; font-size: 10.5pt;" lang="en-us">taobao</span><span lang="zh-cn">),它们大多数都是通过中间语言进行扩展,具体的技术细节还不太清楚。</span></li></ul>  

补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,