软件设计之模块划分
在一些小型的项目当中,由于项目的关系简单,规模较小,所以有时候负责完成项目的往往是一个人或者几个人。这个时候对于模块的概念和应用显得很少,因为项目规模较小的原因,模块划分的重要性难以体现。但是,在一些大型项目中,就必须充分考虑到模块划分,因为参与项目的人数往往有很多人,同时人员变动很大。如果不充分进行模块划分的话,那么就会造成很严重的问题。这就相当于在乡下盖房子,可以自己几个人承包下来,也不需要设计图纸,只要有石匠、木匠就可以搞定。但是在城市中建设一栋高层大楼的话,就必须要有设计师来进行设计,还得有各个部门来配合才行。如果还是和乡下盖房子一样的话,那么就会引起很严重的后果。
模块划分的重要性
所谓软件的模块划分是指在软件设计过程中,为了能够对系统开发流程进行管理,保证系统的稳定性以及后期的可维护性,从而对软件开发按照一定的准则进行模块的划分。根据模块来进行系统开发,可提高系统的开发进度,明确系统的需求,保证系统的稳定性。
在系统设计的过程中,由于每个系统实现的功能不同,所以每个系统的需求也将会不同。也就导致了系统的设计方案不同。在系统的开发过程中,有些需求在属性上往往会有一定的关联性,而有些需求之间的联系很少。如果在设计的时候,不对需求进行归类划分的话,在后期的过程中往往会造成混乱。
软件设计过程中通过对软件进行模块划分可以达到一下的好处:
(1) 使程序实现的逻辑更加清晰,可读性强。
(2) 使多人合作开发的分工更加明确,容易控制。
(3) 能充分利用可以重用的代码。
(4) 抽象出可公用的模块,可维护性强,以避免同一处修改在多个地方出现。
(5) 系统运行可方便地选择不同的流程。
(6) 可基于模块化设计优秀的遗留系统,方便的组装开发新的相似系统,甚至一个全新的系统。
模块划分的方法
很多人都参与过一些项目的设计,在很多项目设计过程中对于模块划分大多都是基于功能进行划分。这样划分有一个好处,由于在一个项目的设计过程中,有着诸多的需求。而很多需求都可以进行归类,根据功能需求分类的方法进行模块的划分。可以让需求在归类上得到明确的划分,而且通过功能需求进行软件的模块划分使得功能分解,任务分配等方面都有较好的分解。
按照任务需求进行模块划分是一种基于面向过程的划分方法,利用面向过程的思想进行系统设计的好处是能够清晰的了解系统的开发流程。对于任务的分工、管理,系统功能接口的制定在面向过程的思想中都能够得到良好的体现。
按任务需求进行模块划分的主要步骤如下:
(1) 分析系统的需求,得出需求列表;
(2) 对需求进行归类,并划分出优先级;
(3) 根据需求对系统进行模块分析,抽取出核心模块;
(4) 将核心模块进行细化扩展,逐层得到各个子模块,完成模块划分。
在很多情况下,在划分任务需求的时候,有些需求和很多个模块均有联系,这个时候,通过需求来确定模块的划分就不能够降低模块之间的耦合了。而且有些模块划分出来里面涉及的数据类型多种多样,显然这个时候根据系统所抽象出来的数据模型来进行模块划分更加有利。
在系统进行模块划分之前,往往都会有一个数据模型的抽象过程,根据系统的特性抽象出能够代表系统的数据模型。根据数据模型来进行模块划分,可以充分降低系统之间的数据耦合度。按照数据模型进行模块的划分,降低每个模块所包含的数据复杂程度,简化数据接口设计。同时,对于数据的封装可以起到良好的作用,提高了系统的封闭性。
抽象数据模型的模块划分方案是一种基于面向对象的思想进行的。这种思想的特点就是不以系统的需求作为模块的划分方法,而是以抽象出系统的数据对象模型的思想对模块进行划分。而利用这种思想进行模块划分的主要好处能够接近人的思维方式对问题进行划分,提高系统的可理解性,可以从较高层次上对系统进行把握!
按照数据模型进行模块划分的主要步骤如下:
(1) 根据系统框架抽象出系统的核心数据模型;
(2) 根据核心数据模型将系统功能细化,并将数据模型与视图等剥离,细化数据的流向;
(3) 依据数据的流向制定模块和接口,完成模块划分。
模块划分的准则
当系统被划分成若干个模块之后,模块之间的关系称之为块间关系,而模块内部的实现逻辑都属于模块内部子系统。对于软件的模块划分要遵循一些基本原则,遵循基本原则进行模块划分所设计出来的系统具有可靠性强,系统稳定,利于维护和升级。
设计模块往往要注意很多的问题,好的模块划分方案可以对系统开发带来很多的便利,提高整个系统的开发效率,而且对于系统后期的维护难度也会降低不少。反之,如果模块划分的不恰当,不仅不能带来便利,往往还会影响程序的开发。
在进行软件模块划分的时候,首先要遵从的一个准则就是确保每个模块的独立性,所谓模块独立性,即:不同模块相互之间的联系尽可能少,尽可能的减少公共的变量和数据结构。每个模块尽可能的在逻辑上独立,功能上完整单一,数据上与其他模块无太多的耦合。
模块独立性保证了每个模块实现功能的单一性,接口的统一性,可以将模块之间的耦合度充分降低。在进行软件模块划分的时候,如果各个模块之间的联系过多,模块独立性差容易引起系统结构混乱,层次划分不清晰。导致有的需求和多个模块均有关联,严重影响系统设计。
对于模块独立性的好处主要可以归纳为以下几点:
(1) 模块功能完整独立;
(2) 数据接口简单;
(3) 程序易于实现;
(4) 易于理解和系统维护;
(5) 利于限制错误范围;
(6) 提高软件开发速度,同时软件质量高。
在软件设计的过程中,往往需要对系统的结构层次进行分析,从中抽取出系统的设计框架,通过框架来指导整个软件设计的流程。而一个良好的系统框架也是决定整个系统的稳定性、封闭性、可维护性的重要条件之一。
因此,在对软件进行模块划分的过程中,要充分遵照当前系统的框架结构。模块的划分要和系统的结构层次相结合,根据系统的层次对各个模块也进行层次划分。如果系统的模块划分和框架结构相违背的话,则会导致类似数据混乱,接口复杂,模块耦合性过高等等的问题出现。
如果模块划分的方法主要是依据任务需求而进行划分的话,那么可以先将任务需求根据系统框架划分出系统等级。通过对任务需求的等级划分对模块划分起到引导作用,同时,依照系统结构层次来对模块划分。
在进行模块划分的时候,有很多情况下不能够清晰的把握每个模块的具体内容。往往会出于对需求归类或者数据统一的角度上对模块进行设计。这种设计理念是对的,但是如果只是单纯的从这几个方面来进行模块设计的话,那么也会导致在模块划分上出现另外一些情况。比如说设计的某一个模块,虽然数据接口统一,但是内部实现的功能非常多,单一模块的规模过大,包含的内容过多。这样设计模块会导致什么问题出现呢?
如果一个模块包含的内容过多,会导致程序实现难度增加,数据处理流程变得复杂,程序维护性降低,出错范围不易确定等情况的出现。同时,由于模块实现的功能丰富,则必然会导致接口也变得繁多,那么与其他模块之间的独立性就得不到保证。而且,一个模块包含太多的内容也会给人一种一团乱糟糟的感觉,严重影响对程序的理解。
在设计模块的时候,需要遵循每个模块功能单一、接口简单、结构精简的原则。对每个模块的设计确保该模块的规模不要太大,接口尽量的单一简化。这样的话,虽然可能会导致模块的数量上比较多,但是能够确保模块的独立性,而且不会影响系统的整体的框架结构。关于模块内部的具体实现和接口设计将在下一部分进行讲解。