实用软件工程----IT企业软件的开发与管理赵池龙8.1软件实现概论软件实现的输入是《详细设计说明书》,输出是源程序、目标程序及用户指南。根据“五个面向理论”,编程实现的主要方法是“面向对象实现”。因为现在流行的编程语言,基本上都是面向对象的语言,如Delphi,VisualBasic,C++,C#,Java等。所以软件实现,主要的方法都是“面向对象实现”。宏观上讲,“面向对象实现”的目标是:按照《详细设计说明书》的要求,从公司的函数库、存储过程库、类库、构件库、中间件库中挑选有关的部件,遵照软件公司的程序设计规范,按照《详细设计说明书》中对数据结构、算法分析和模块实现等方面的设计说明,用面向对象的语言,通过穿针引线的方法,将这些部件组装起来,分别实现各模块的功能,从而实现目标系统的功能、性能、接口、界面等要求。微观上讲,软件实现是指通过编码、调试、单元测试、集成测试等活动创建软件产品的过程。软件实现与软件设计、软件测试密不可分。软件设计为软件实现提供输入,软件实现的输出是软件测试的输入。尽管软件设计和软件测试是独立的过程,但软件实现本身也涉及到设计和测试工作,它们之间的界限视具体项目而定。软件实现还会产生大量的软件配置项,例如,源文件、测试用例等,因此软件实现过程还涉及配置管理,如图8-2所示。软件实现示意图软件实现编码调试软件设计单元测试集成测试开发计划配置管理实现过程是不可缺少的需求分析和软件设计是为了更有效地软件实现,软件测试是为了保证软件实现的正确性,因此,软件实现成为软件工程的核心任务之一。软件实现在开发过程中占据很大的比例,根据项目性质的不同,大约占30%~80%之间。一般而言,软件企业越大越正规,软件实现的比重就越轻。反之,软件实现的比重就越重。只有软件实现是软件工程中唯一不可缺少的步骤。因为:有个别特殊项目可能不经过需求分析和设计就直接进入编码实现阶段,有个别特殊项目会省略掉测试,但无论如何,实现过程是不可缺少的。设计与实现有时是迭代进行的由于软件设计过程可能贯穿于整个开发过程,因此,有时不应将它看作一个独立的阶段。对某些小型的项目,设计过程通常在实现时完成;对某些大型的项目,会明确地划分架构设计和详细设计两个阶段,即使如此,有些详细设计工作仍会留在实现阶段完成。这就是迭代模型产生的背景之一。软件企业需要管理好的问题大型软件企业在软件实现工作中,还需要管理好如下问题:1.建立公司的软件开发财富库2.构件的实现及构件库的管理3.中间件的实现及中间件的管理4.程序设计风格与编程规范的管理1.建立公司的软件开发财富库新增函数的实现及函数库的管理,新增存储过程的实现及存储过程库的管理,新增类的实现及类库的管理,新增构件的实现及构件库的管理,新增中间件的实现及中间件的管理。这些库统称为开发财富库。如果读者所在的软件组织处在初创时期,函数库、类库、构件库都是空白,那么就只能利用面向对象语言自带的函数和基础类库,从头创业,一边对系统进行编程实现,一边在实践中积累函数、类和构件,逐步建立自己的函数库、类库和构件库,为日后的开发准备财富。2.构件的实现及构件库的管理【定义8-1】所谓构件(Component),就是被标识的、且可被复用的软件制品(Arteface)。构件与部件、组件基本上是一个意思,有时会认为部件和组件的粒度比构件大一些或范围广一些。上述定义有三个特点:第一、构件要被明确标识,即有一个被调用的名字;第二、构件应该可复用,不可复用的只能称做模块或子系统;第三、构件是软件制品,在宏观上软件制品可以是项目计划、成本估计、体系构架、需求模型、设计模型、程序代码、窗口界面、文档、数据结构、测试用例等。构件的实现及构件库的管理(续)微观上的构件,通常是指程序代码级的构件。这种构件在技术上的三个流派:Sun的Java平台、Microsoft的COM+平台、IBM的CORBA平台。构件具有接口标准、通信协议、同步和异步操作。构件有两种级别:(1)可执行文件级别上的构件,它是已通过编译的构件,因而与语言无关。(2)源代码级别上的构件,实际上只是构件模板,可以用多种语言实现,当然与语言有关。构件的实现及构件库的管理(续)大型软件企业内部有构件库。构件库是组织管理构件的仓库,程序员必须知道新增构件的实现及构件库的管理,它是软件实现的重要内容。构件库管理系统的功能:构件的分类、入库、检索、浏览与存储,对不再使用的构件进行删除,对构件使用情况的统计与评价。3.中间件的实现及中间件的管理中间件是一个非常大的组件,一般在网络上运行,完成批量数据的传递和通信工作,调用方式是通过一组事先约定的格式与参数进行的。常见的中间件为文件传输中间件,如IBM公司的消息队列中间件MQ(MessageQueue),在网络节点之间进行点对点的数据通信和传输。又如城市医疗保险系统中的中间件,它在市医保局节点和全市各家医院节点之间,进行点对点的数据通信和传输,病号每次划价计费,节点之间就交换一次信息。在详细设计说明书中,已对新增中间件的功能和算法进行了详述,此处只要将详细设计翻译为源程序即可。4.程序设计风格与编程规范的管理为了提高编程实现的质量,不仅需要有良好的程序设计风格,而且需要大家一致遵守的编程规范。程序设计风格的内容包括:规范化的程序内部文档、数据结构的详细说明、清晰的语句层次结构、遵守某一编程规范。编程规范的内容包括:命名规范、界面规范、提示及帮助信息规范、热键定义等。8.2软件实现原则(1)尽量简单在软件实现过程中,应创建简单、易读的代码。相同功能的代码只写一次。(2)易于验证。无论是在编码、测试还是实际操作中,应该很容易地发现其中的错误。自动化的单元测试可帮助产生易于验证的代码。(3)适应变化。外部环境、软件需求和软件设计,在整个开发过程中可能会随时变化,因此要求软件实现时考虑适应这些变化。(4)遵守某一编程规范。(5)选择项目组成员最熟悉的工具或语言。*8.3编程语言编程语言可分为三类:1.语言符号使用文本来构建软件。这些文本遵循一定的语法规则,并提供相应的语义,使用者可以直观地理解软件将完成的工作。如HTML、XML等标记语言。2.形式化符号采用精确的、形式化定义的符号来构建软件。形式化符号和形式化方法是系统级编程的重要形式。如Pascal语言。3.可视化符号采用可视化的部件来构建软件,通常用于界面元素的编程。如VisualBasic语言。编程语言(续)(1)JavaJava是一种面向对象的编程语言,语法结构与C++类似。Java在虚拟机上运行,通过为不同的平台提供虚拟机,实现了Java跨平台的特性。Java被广泛用于应用服务器端程序和移动设备程序中。(2)CC既具有高级语言的特征,又具有低级语言的功能,被广泛应用于系统软件,嵌入式应用软件。(3)C++在C基础上发展起来的一种面向对象的语言,C++提供了类,多态,异常处理,模板,标准类库等。编程语言(续)(5)VisualBasicVisualBasic是一种面向对象、可视化的编程语言,用于开发Windows桌面应用程序和Web应用程序。(7)C#C#语法与Java类似,是.Net平台上编程语言。(10)DelphiDelphi是一种强类型的高级编译语言,支持面向过程、面向数据和面向对象的三种开发方法。Delphi源自Pascal,提供了大量的快速应用程序开发组件。主要用于数据库应用程序开发。*8.4编码技术1.编码标准遵循规范化的源代码布局和命名规范,可以创建可读性好,易于理解的代码。大型软件企业都有一套开发标准、编码标准、界面标准,在全企业内推广应用,形成自已的企业文化。新员工必须严格遵守,迅速适应。编码技术(续)2.代码布局代码的布局不影响程序的执行速度、内存使用,以及对用户可见的属性。代码布局应遵循的基本原则:代码布局能够正确地反映程序的逻辑结构。好的代码布局能加强程序的可读性。可读性好的代码,更易于理解,易于维护,可以减少修改、调试以及审查的工作量。通常,程序员通过缩排和空格表示程序内部的逻辑。又称锯齿形程序布局。编码技术(续)3.实体命名代码中存在大量的实体名,如变量名、方法名、类名、接口名、包名等。好的命名可以提高代码的可读性。在对一个实体进行命名时,最重要的一点,是名称能够准确地反映实体的本质。先使用一句话来描述实体所代表的事物,然后抽取一个或几个单词作为实体的名称。研究表明,命名长度在10到16个字符之间,调试代码所需的工作量最少,过长或过短的命名不易于代码的理解。3.实体命名(续)实体命名可遵循的规则:(1)类名和对象:在Java和C++中,通常类名的首字母大写,对象名的首字母小写。(2)全局变量:加上统一的前缀,例如,表示所有在线人数可以使用g_totalOnline。(3)成员变量:在类的成员变量前添加统计的前缀,例如_或m_,这样可以很容易地区分成员变量和局部变量。(4)常量:在Java和C++中,通常以全部大写的单词表示常量,单词间以下划线分隔。例如MAX_VALUE表示最大值。编码技术(续)4.错误处理程序执行过程中,可能出现可预测和不可预测的错误,错误处理方式将影响到软件的正确性、稳定性以及其它的非功能属性。可以采取以下措施进行处理:(1)返回一个中性值:当错误发生时,程序继续执行,返回一个中性的值。例如,数值计算返回0;字符串操作返回空字符串。(2)返回下一个有效值:当一次操作失败后,执行下一次操作。例如,从网络中读取数据失败后,取下一个有效值。(3)返回前一个有效值:当一次操作失败时,返回上一次成功操作的值。例如,从网络中读取数据失败时,返回上一次读到的有效值。4.错误处理(续)(4)返回最相近的有效值:例如,一个方法计算应返回一个非负数,如果计算值小于0,则返回0。(5)记录日志:当错误发生时,记录日志文件,并继续执行。(6)返回错误代码:返回错误代码,指示错误发生的原因,调用者可根据错误代码进行错误处理。(7)调用错误处理函数:用错误处理函数来统一地进行错误处理,这样做的好处是可以集中地对错误进行管理。(8)显示错误信息:当错误发生时,向用户提示错误信息。例如,用户录入了非法数据时,向用户提示正确的输入格式。(9)退出程序:这种方式对一些安全性要求较高的程序比较适合,防止继续操作可能带来的破坏。编码技术(续)5.代码重构代码重构是软件进化的重要手段,需要重构的例子有:(1)重复代码:重复的代码需要你做重复的修改,即要修改一个地方,就要平行地修改其它地方。(2)函数过长:在面向对象的编程中,很少需要超过一屏的函数。出现这种情况,暗示着你使用了过程化编程方式,来进行面向对象的编程。(3)循环过长:过长的循环体最好变成独立的函数,可有效地降低循环的复杂度。(4)内聚性差:如果你发现一类是一些不相关的责任的集合,这个类应该分解成多个类,每个类负责一个逻辑相关的责任集合。(5)参数过多:好的函数通常比较简短,不应有过多的参数。过多的参数通常表示方法没有很好地抽象。编码技术(续)6.成对编程成对编程的定义:当进行成对编程时,一个程序员输入代码,另一个在旁边观察代码中是否存在错误,并思考下一步要进行的工作。成对编程的优点:(1)可以提高代码的可读性和可理解性,产生高质量的代码。(2)提高编程效率,使编程速度更快,代码错误更少。后期测试和纠错的工作量就大大降低。(3)成对编程可以提高开发团队的凝聚力和协作精神。*8.5软件实现管理1.过程模型这里讲的过程模型,是指软件开发模型。过程模型从其规范程度可分为两大类,重量级开发模型和轻量级的敏捷开发模型。不同的软件开发模型,对软件实现的重视程度不同。(1)对于瀑布模型和RUP模型等重量级开发模型,实现阶段必须在前期工作(需求分析、架构设计、详细设计)的基础上才能进行。(2)对于敏捷开发过程等轻量级开发模型,实现阶段趋向于和其它的软件开发活动(需求、设计、测试)同步执行。敏捷开发过程倾向于将编码、设计、测试混合在一起构成实现活动。软件实现管理(续)2.开发计划影响开发计划的因素是:(1)过程模型影响开