`
sunxboy
  • 浏览: 2877376 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

开发及软件工程:软件最大的追求是什么

阅读更多
这段时间,Java世界有两件事情值得关注:工业界力推SOA;在开源领域,即将推出的Spring 2.0将支持非贫血模型,将OO编程推向一个新的阶段。

  无论SOA全新架构推出还是OO的持续发展,他们都追求同一个终极目标:松耦合。

  当我们在Java波涛汹涌的潮流中奋击时,我们常常会思考?我为什么要这样做?甚至,我们会想松耦合真的那么酷?可维护性真的是软件唯一?也许我们迷失了方向。

  我们要好好探究一下,软件的最大追求是什么?

  我们的大学计算机教育只是教会我们如何编程?这如同技工学校中教会学员如何使用车床一样,当我们学会了编程,接下来是什么呢?是不是就没有了呢?是不是就是如同车工那样只需日复一日的反复编程呢?

  其实,当你在一个系统中持续编程(增加新的东西),这个系统就变得复杂了,你面临最大的挑战是如何整理你自己的产物。

  也就是说:大学教育只教会我们如何“增加新的东西”,但是没有教育我们如何“整理这些东西”,而后者是目前软件领域日新月异不断发生的革命的新动力。

  下面我们以具体代码来说明“增加新的东西”和“整理这些东西”完全属于不同层次的学问,有些人谈到软件只会想到算法和数据结构,认为这些才是科学,其实这是将软件数学化,软件不只是科学计算的工具,它自身也是一门科学,更象管理学/经济学一样,是科学和艺术的结合。

  在最近Java(TM) Boutique网站上刊登出一篇文章Measuring the Complexity of OO Systems,衡量OO系统的复杂性,该文对软件复杂性几个著名公理进行了详细阐述,这些公理如果你不进行学习和培训,即使你使用OO语言Java等这 样工具,还是显示你是“业余”的。

  软件复杂性包括以下部分(引自Measuring the Complexity of OO Systems):

  * Cyclomatic Complexity (圈复杂性)

  * Response for Class (类的响应)

  * Weighted methods per class (每个类重量方法)

  Cyclomatic Complexity

  Cyclomatic Complexity可以用下面代码来说明:

  Cyclomatic Complexity (CC) = number of decision points +1

  其中number of decision points是指一个if else之类的条件判断语句,比如,是下面这个条语句:

  public void isValidSearchCriteria(SearchCriteria s){

  if(s!=null) {

  return true;

  }else{

  return false;

  }

  }

  Cyclomatic complexity 对代码的可测试性和可维护性上有很大影响,正如上例指出,当你要测试isValidSearchCriteria()方法 ,你必须写三个测试用例来验证它。

  如果这个CC值增加,将有更多的判断点(decision points)数量,也就意味着需要花费更多的力量来测试这些方法。详细更多说明可参考Measuring the Complexity of OO Systems一文。

  所以,if else 或while 等条件语句是对真正OO的一种伤害(这是非OO公理见Thomas McCabe),可以极端地说:一个好的OO系统几乎在业务逻辑层看不到超出两个以上条件的if else等判断语句,这些条件语句都是可以被GoF设计模式的状态模式/策略模式等替代。

  当你的Java系统中充满了大量的if else语句,虽然你使用很酷的语言工具,但是说明你的思维是传统过程的,需要重新学习和培训。

  Response for Class(RFC)

  这是著名的 Chidamber and Kemerer公理之一。以下面代码来说明:

  public class RegistrationManager {

  public void createRegistration(RegistrationData regData){

  DataAccessManager manager = new DataAccessManager();

  AuditManager auditManager = new AuditManager();

  //save the registration

  manager.saveRegistration(regData);

  //audit the creattion

  auditManager.createAuditRecord(regData);

  }

  public Registration findRegistration(String regNumber){

  DataAccessManager manager = new DataAccessManager();

  Registration reg = null;

  //find the registration

  reg = manager.findRegsitration(regNumber);

  return reg;

  }

  }

  这个类RegistrationManager 依赖其他两个类DataAccessManager 和 AuditManager 。

  按照公理公式:

  RFC = M+ R (M = 这个类中方法个数. R = 其他总数)

  在上例中,我们统计类响应RFC数目如下:

  在RegistrationManager中方法数目 = 2

  调用了DataAccessManager的方法数目 = 2

  调用了AuditManager的方法数目 = 1

  这样:RFC(RegistrationManager) = 2 + 2 +1 = 5

  当一个类和很多其他类存在依赖时,它就变得复杂甚至难以修改和维护,这样,RFC值越大,表示你的系统味道越坏。

  当然,因为OO系统是基于类和方法,不可能开发出一个0值RFC的系统,但是我们追求的目标是一种平衡,当你设计OO系统时,必须时刻注意这些公理,尽量避免类的编码达到一个RFC高值。

  我们如果使用现代一些模式:如Ioc模式,可以帮助我们方便不费力气地达到这样一个平衡,因此,使用Spring/Jdon之类框架是降低RFC值的一个捷径。

  Weighted methods per class

  之前几个公理是介绍如何通过类之间交互调用使得软件系统变得异常复杂,一个系统或一个特定的类自身也会变得异常复杂,有很多方法,Weighted Method Per Class公理帮助我们量化定义这些情况。

  这个公理定义会依据两种情况:一个类实现;不同的实现。

  WMC 1 = 一个类中所有方法个数.

  WMC 2 = 所有方法的Cyclomatic Complexities个数.

  无论你选择哪一种公式,一个WMC高值显示这个类也许需要被重整成多个类。

  这个公式可以帮助你让类保持干净,并且和相关行为意义上更加靠近(cohesive)。

  以前面的RFC例子说明:如果你将DataAccessManager和AuditManager类中的方法都定义到当前RegistrationManager类中,你会得到一个WMC高值,这说明这个类需要重整了。

  良好的软件设计

  前面章节我们反复提到重整(refactoring),它的意思就是:你不但会“增加新的东西”,而且还要学会“整理这些东西”(重整)。

  正如儿童玩玩具一样,他可以无师自通很快学会玩一个新东西,但是,当他玩完很多新玩具以后,他就很难学会整理他到处乱丢的玩具。由此可见:学会编程不值得骄傲(可能源自天生),懂得如何整理才是真正的专业程序员。

  现在,让我们回到问题的本质,上述列举了软件的复杂性,复杂会导致难于维护和测试,那我们需要整理,那么整理是否可量化一种程度呢?

  我们使用“松耦合”这个概念来表示易于维护、易于测试、易于扩展的程度,当然,松耦合值越高,我们系统更易于维护。当前,软件世界的发展,SOA、Ioc/AOP不都是在追求松耦合的最大化吗?

  松耦合一个反义词“紧耦合”,从我们学会玩编程这个玩具开始起,我们就面临两种选择:一种朴素的、无需训练的、近似自然的“紧耦合”路线;一种是经过科学培训的“松耦合”道路。选择哪一条道路就取决于你是否受过专业训练了。

  所以,对于编程这个玩具,不在于你是否会玩,而在于你怎么玩?玩的水平。如果不明白这个道理,中国软件的萧条永远不会结束。

分享到:
评论

相关推荐

    《软件工程概论》期末复习题及参考答案

    《软件工程概论》期末复习题及参考答案涵盖了软件工程的基础知识,包括软件的特性、软件工程方法学、软件开发模型、软件危机的表现、软件工程的目标、需求分析、软件测试方法以及软件维护等方面。以下是对这些知识点...

    软件工程期末试卷带参考答案

    软件工程是一门研究软件开发全过程和方法的学科,它涉及到软件的需求分析、设计、编码、测试以及维护等多个环节。在软件工程的期末试卷中,通常会涵盖以下重要知识点: 1. **软件危机**:指在软件开发过程中遇到的...

    软件工程-理论与实践(许家珆)习题答案

    - **D)以较低的成本开发出高质量的软件**:这也是软件工程追求的目标之一。 #### 二、判断题解析 **1. 软件就是程序,编写软件就是编写程序。(×)** - **解析**:软件不仅仅是程序,还包括文档、数据以及其他辅助...

    软件工程经济学课件

    这份资料适合对软件工程经济学有浓厚兴趣的学员,特别是那些追求卓越和高效管理的开发者和项目经理。课程内容可能涵盖以下几个关键知识点: 1. **软件工程概述**:软件工程不仅仅是编写代码,它还包括需求分析、...

    软件工程与软件过程改进.pptx

    软件工程是一门跨学科的研究领域,它结合了计算机科学、项目管理和工程学等多个领域的理论和技术,旨在实现软件产品的高效开发、高质量交付及有效维护。软件工程的核心目标在于确保软件开发过程能够系统化、规范化、...

    序论软件工程与项目管理.pptx

    9. **软件工程环境与管理**:软件工程环境是方法、工具和软硬件支持的集成,而软件工程管理则旨在确保项目的按时按预算完成,追求经济效益和社会效益的最大化。 通过以上内容,我们可以理解软件工程不仅仅涉及编程...

    软件工程复习题.pdf

    软件工程的出现是为了解决软件危机,追求软件生产工程化。软件危机表现为软件无法满足用户需求、维护困难、可靠性差等问题。软件组成包括程序、数据和文档,界面是用户与软件交互的媒介。 UML(统一建模语言)是...

    软件工程的软件工程系统架构.pptx

    ### 软件工程系统架构知识点详解 #### 第1章 软件工程的基本概念 ...以上内容概述了软件工程的基本概念、需求分析及软件设计等方面的关键知识点,这些内容对于理解和掌握软件工程的核心理念和技术有着重要的意义。

    软件工程2.pptx

    软件工程同样如此,它需要工业化生产,追求可复用性、易维护性,以实现经济效益和社会效益的最大化。 2. **工程的定义**:工程涵盖了应用自然科学原理到不同领域,如土木、水利、机械等。软件工程则是这一概念在...

    软件工程教程

    5. **《计算机科学技术百科全书》中的定义**:软件工程是应用计算机科学、数学及管理科学等原理来开发软件的技术。它借鉴了传统工程的原则与方法,旨在提高软件的质量和降低成本。这里强调了跨学科的知识融合。 ###...

    软件工程考试题带答案.pdf

    24. **软件工程的目标**:追求以较低成本制造较高质量的软件。 25. **软件的可移植性**:指软件在不同环境间转换的难易程度。 26. **软件生存周期**:从软件的构思、开发、使用到废弃的整个过程。

    奥鹏2020年6月福师《软件工程》在线作业一_2.pdf

    软件工程是一门涉及软件开发全过程的学科,包括需求分析、设计、编码、测试和维护等多个环节。本题涉及的知识点涵盖了软件工程的多个方面: 1. **判定表**:判定表是一种表示多逻辑条件和其对应操作的有效工具,...

    信息管理技术 全国计算机等级考试三级信息管理技术培训辅导教程_软件工程.doc

    而软件工程管理则涉及项目组织、进度、质量控制和成本预算,确保软件开发按工程化原则进行,追求经济效益和社会效益的最大化。 软件开发方法学是研究软件开发过程的不同模式,如瀑布模型、原型化方法和面向对象方法...

    软件工程相关部分经典试题汇总.

    1. 软件工程是计算机科学的一个重要分支,主要涉及软件的开发、维护和管理。模拟试题通常用于帮助学生或从业者准备相关的资格认证考试,例如软件工程师资格考试。 2. TURBO PASCAL 是一种早期的集成开发环境(IDE)...

    软件工程实践者的思想

    总的来说,《大道至简:软件工程实践者的思想》揭示了软件开发人员在实践中所秉持的智慧和价值观,这些思想是推动软件工程发展的重要力量。通过理解和采纳这些思想,我们可以更好地应对软件开发的挑战,创造更优秀的...

    软件工程的伦理与社会责任.pptx

    - **软件工程的定义及重要性**: - **定义**:软件工程是一门运用科学化、系统化的原理和方法,结合现代技术和工具,旨在高效、高质量地开发和维护软件的工程学科。 - **重要性**:随着信息技术的飞速发展,软件...

    二级公共基础知识(软件工程).pptx

    软件工程是一门综合性的学科,它涉及到计算机科学、数学以及管理科学,旨在通过工程化的原理和方法解决软件开发中的问题,提高软件的生产效率、质量和降低成本。软件工程的主要目标是确保软件项目的成功,遵循一系列...

Global site tag (gtag.js) - Google Analytics