软件设计--模块划分

2019-07-13 06:00发布

软件模块设计,简单说就是把一个复杂的整体划分成一块块的局部,由复杂到简单。模块化的代码也便于阅读,为什么大多数代码都那么难懂?如果简单归结于代码设计太差,这样的解释太容易了,也太廉价了,但却没有任何帮助。

模块划分的重要性

所谓软件的模块划分是指在软件设计过程中,为了能够对系统开发流程进行管理,保证系统的稳定性以及后期的可维护性,从而对软件开发按照一定的准则进行模块的划分。根据模块来进行系统开发,可提高系统的开发进度,明确系统的需求,保证系统的稳定性。
在系统设计的过程中,由于每个系统实现的功能不同,所以每个系统的需求也将会不同。也就导致了系统的设计方案不同。在系统的开发过程中,有些需求在属性上往往会有一定的关联性,而有些需求之间的联系很少。如果在设计的时候,不对需求进行归类划分的话,在后期的过程中往往会造成混乱。
软件设计过程中通过对软件进行模块划分可以达到一下的好处:
(1) 使程序实现的逻辑更加清晰,可读性强。
(2) 使多人合作开发的分工更加明确,容易控制。
(3) 能充分利用可以重用的代码。
(4) 抽象出可公用的模块,可维护性强,以避免同一处修改在多个地方出现。
(5) 系统运行可方便地选择不同的流程。
(6) 可基于模块化设计优秀的遗留系统,方便的组装开发新的相似系统,甚至一个全新的系统。

模块划分的方法

很多人都参与过一些项目的设计,在很多项目设计过程中对于模块划分大多都是基于功能进行划分。这样划分有一个好处,由于在一个项目的设计过程中,有着诸多的需求。而很多需求都可以进行归类,根据功能需求分类的方法进行模块的划分。可以让需求在归类上得到明确的划分,而且通过功能需求进行软件的模块划分使得功能分解,任务分配等方面都有较好的分解。
按照任务需求进行模块划分是一种基于面向过程的划分方法,利用面向过程的思想进行系统设计的好处是能够清晰的了解系统的开发流程。对于任务的分工、管理,系统功能接口的制定在面向过程的思想中都能够得到良好的体现。
按任务需求进行模块划分的主要步骤如下:
(1) 分析系统的需求,得出需求列表;
(2) 对需求进行归类,并划分出优先级;
(3) 根据需求对系统进行模块分析,抽取出核心模块;
(4) 将核心模块进行细化扩展,逐层得到各个子模块,完成模块划分。
在很多情况下,在划分任务需求的时候,有些需求和很多个模块均有联系,这个时候,通过需求来确定模块的划分就不能够降低模块之间的耦合了。而且有些模块划分出来里面涉及的数据类型多种多样,显然这个时候根据系统所抽象出来的数据模型来进行模块划分更加有利。
在系统进行模块划分之前,往往都会有一个数据模型的抽象过程,根据系统的特性抽象出能够代表系统的数据模型。根据数据模型来进行模块划分,可以充分降低系统之间的数据耦合度。按照数据模型进行模块的划分,降低每个模块所包含的数据复杂程度,简化数据接口设计。同时,对于数据的封装可以起到良好的作用,提高了系统的封闭性。
抽象数据模型的模块划分方案是一种基于面向对象的思想进行的。这种思想的特点就是不以系统的需求作为模块的划分方法,而是以抽象出系统的数据对象模型的思想对模块进行划分。而利用这种思想进行模块划分的主要好处能够接近人的思维方式对问题进行划分,提高系统的可理解性,可以从较高层次上对系统进行把握!
按照数据模型进行模块划分的主要步骤如下:
(1) 根据系统框架抽象出系统的核心数据模型;
(2) 根据核心数据模型将系统功能细化,并将数据模型与视图等剥离,细化数据的流向;
(3) 依据数据的流向制定模块和接口,完成模块划分。

模块划分的准则

当系统被划分成若干个模块之后,模块之间的关系称之为块间关系,而模块内部的实现逻辑都属于模块内部子系统。对于软件的模块划分要遵循一些基本原则,遵循基本原则进行模块划分所设计出来的系统具有可靠性强,系统稳定,利于维护和升级。 设计模块往往要注意很多的问题,好的模块划分方案可以对系统开发带来很多的便利,提高整个系统的开发效率,而且对于系统后期的维护难度也会降低不少。反之,如果模块划分的不恰当,不仅不能带来便利,往往还会影响程序的开发。
在进行软件模块划分的时候,首先要遵从的一个准则就是确保每个模块的独立性,所谓模块独立性,即:不同模块相互之间的联系尽可能少,尽可能的减少公共的变量和数据结构。每个模块尽可能的在逻辑上独立,功能上完整单一,数据上与其他模块无太多的耦合。
模块独立性保证了每个模块实现功能的单一性,接口的统一性,可以将模块之间的耦合度充分降低。在进行软件模块划分的时候,如果各个模块之间的联系过多,模块独立性差容易引起系统结构混乱,层次划分不清晰。导致有的需求和多个模块均有关联,严重影响系统设计。
对于模块独立性的好处主要可以归纳为以下几点:
(1) 模块功能完整独立;
(2) 数据接口简单;
(3) 程序易于实现;
(4) 易于理解和系统维护;
(5) 利于限制错误范围;
(6) 提高软件开发速度,同时软件质量高。 当我们面对一个新系统时,一般我们都从三个层面来了解他。1.他和哪些外界系统有交互;2.他是什么,由哪些部分组成;3.他对外界事件是如何响应的。这就是软件设计中常用的Interface View,Interaction View(也叫Dynamic View),Static View。那相应的我们把一个模块的代码分为三个子部分,Data部分对应Static View,Context部分对应Interaction View以及Interface部分对应Interface View。

Interface View

揭示该系统与其他系统的接口关系。在实现中,还可以使用不同文件来区分提供给不同模块的接口。

Static View

揭示了组成系统的对象,包括概念对象、实体对象和对象间的关系,以及装载这些对象的容器。在代码实现时,应该是一个个的class或container。这部分是整个模块的抽象。为了抽象出更容易理解的代码,可以参照以下几个原则:1)对象及对象关系必须真实反映领域知识;2)尽可能减少对象间的依赖;3)如果要引入对象间的依赖,优先考虑是不是放在Context部分更合理。

Context View

揭示系统在输入事件下的响应。这部分的工作应该是1)对象的创建、删除和事件通知,2)对容器进行移入,移出和查询操作。这部分代码应该专注于外界事件触发下,对象的增、删、改以及对象在容器间的移动。他只关注对象的变化和交互,不做具体的事情,而且只是提供一个对象相关发生关联的上下文。