在软件高层设计中,如何分解模块是首要考虑的问题。目前业界公认模块划分要按照“高内聚,低耦合”的原则来进行,那么如何划分才能满足“高内聚,低耦合”呢?下面来对模块分解原理方面进行一些探索,有考虑不周和不成熟之处还请大家不吝指正。
模块是按功能来分解的吗?
许多人可能有过经验,面对一堆功能性需求,多个不同的需求可能要放到同一个模块里,而某个需求又需要分解到多个模块里去实现。
比如一个词典软件(类似金山词霸的软件),通常有查询词典的功能需求和添加用户词库的功能需求,显然不可能简单地为这两个功能各分解一个模块。查询界面和添加用户词库的界面处理部分会被划成一个模块,而对词典的数据管理(查询,添加等)部分会被划分成另外一个模块。
通过对以上词典软件的模块划分的分析,可以得出模块并不是简单地按功能来划分的结论,因此按功能来分解模块并不是一个任何情况下都可行的方案。
模块按专业领域进行分解
仔细观察上面所说的词典软件的模块分解就会发现,所划分的两个模块属于不同的专业领域,一个是交互领域(图形界面),另一个是数据管理领域(数据结构与算法)。这样看来模块划分是按专业领域来划分的了,是不是所有的模块划分都是或者应该按照专业领域来进行划分呢?
通过观察大量的软件的模块分解情况,其实可以发现绝大部分模块都是按照专业领域来分解的,这些专业领域包括软件公共领域的各个子领域,软件所处理业务的专业领域及其子领域等。
软件公共领域常见的子领域有数据结构算法,图形界面,IO处理,网络通信,数据库,加密,安全,图像处理,数学算法等,当然这些子领域还可以进一步划分出更小的子领域来。
软件所处理业务的专业领域则是指具体的业务方面所属的专业领域,如财务软件的业务包括了财务专业领域,CAD软件业务包括了机械制图方面的专业领域等。
这些不同专业领域内的内容都是被划分到不同的模块里,没有人会在同一个模块里同时实现网络通信和数据结构算法的功能。这样可以得到模块分解的一个最基本的原理:
模块分解基本原理:不能在同一模块中实现两个不同专业领域的内容
上面这句话的意思其实和模块按专业领域进行分解是一回事,只不过意思更明确一些。注意这里说的是“实现”,有许多的模块中需要用到许多不同专业领域的接口来进行处理,即在同一模块中可能会调用许多不同专业领域的接口来进行处理,调用接口并不属于“实现”。
模块按专业领域来分解只是一个原理,无法证明它的正确性,因此看一下它会不会与已有的一些设计特性有冲突呢,比如常说的“高内聚,低耦合”,可复用性,可扩展性等是否会产生冲突。
推论1:按专业领域分解的模块是“高内聚,低耦合”的
为什么说按专业领域分解的模块事“高内聚,低耦合”的呢?专业的划分都是人们经过长期的实践和探索划分出来的,专业领域本身就是“高内聚,低耦合”的, 比如数据结构算法专业和网络专业耦合就很小,但每个专业的内部都是高内聚的。
推论2:按专业领域分解的模块是可复用的
这点很容易理解,模块按专业领域分解完后,显然任何两个不同的模块都不会有重复的内容,因此满足可复用的特性。
推论3:按专业领域分解的模块是可扩展的
当有新增需求时,只要将新增需求分解成各个专业领域的内容,新增的内容可以分为三类:
1、在已有模块里已经有对应的实现,
2、属于已有模块的领域,但是没有对应的实现
3、不属于已有模块的领域
对第1种情况中,显然不需要对已有模块做任何修改和添加;对第2种,需要在已有模块里添加相应的接口来实现对应的内容;对第3种,需要增加新的模块来实现对应的内容。
所有这三种情况,都符合软件设计中的可扩展特性,因此按专业领域分解的模块是可扩展的。
推论4:按专业领域分解的模块是可维护的
这点可以由由模块高内聚,低耦合,可扩展性的特性得出。
由此看出模块分解基本原理是和以往对设计的要求是相符合的,但是会不会有反例呢,我实在不能确定,因为这个原理是无法证明的。如果有人发现有不应该按照专业领域来分解模块的反例,请回复一下。
模块按专业领域分解的困难之处
虽然模块按专业领域进行分解看起来好像很完美,可以说绝大部分需求都可以按照这个原则来进行分解。但是并不是说就不存在问题了,实际上按专业分解的前提条件就是要将需求能够分解成已有专业领域的内容。
困难1:如果需求的内容属于新兴未成型的专业领域的内容,那么按专业分解就不是那么容易了。
困难2:许多需求最终需要分解到某个专业领域的某个子领域里来处理,而很多专业领域还在发展之中,它的许多子领域还没定型,这时划分模块也不是一件容易的事情。
对于上面说的这两种情况如何来划分模块,还有待于探索,也请阅读本文的大侠们发表自己的看法。
分享到:
相关推荐
《基于项目驱动的自动化专业微机原理课程模块化教学探索》 微机原理课程是自动化专业的重要基础课程,它涵盖了计算机硬件系统、汇编语言编程、接口技术等多个方面,为学生深入理解计算机工作原理和进行实际应用开发...
由于模块化设计方法已被广泛应用于特种机器人领域,并取得了较好的效果,因此对基于特种机器人的模块化设计方法进行探索与研究是非常有必要的。通过探讨自底向上的模块化设计办法,可以为特种机器人的模块化设计提供...
这样的工具对于程序开发者来说非常有用,因为它们可以帮助理解他人编写的模块工作原理,或者在没有源代码的情况下进行二次开发和修复bug。 描述中提到,这个反编译工具能够处理已经编译的易语言模块,并将其转换回...
模块化教学是一种以学习者为中心的教学模式,它将课程内容分解为多个模块,每个模块都是具有独立功能、学习目标和评估标准的教学单元。在《机械制图》课程中,采用模块化教学,可以将复杂的制图知识按照难易程度和...
在Matlab环境中实现NMF协同过滤,首先需要理解基本的NMF原理。NMF是一种矩阵分解技术,它可以将一个非负的大矩阵W分解为两个非负的小矩阵H和V的乘积,即W = VH。在推荐系统中,用户-物品评分矩阵可以看作是W,通过...
模块化原理的核心思想是将复杂系统分解为相互独立、功能明确的模块,通过模块间的接口进行组合,以实现系统的整体优化。在知识创新管理中,这一原理可以被解读为将复杂的知识体系划分为可重用、可迭代的知识模块,...
TD测量的当前最先进的工具正在源代码级别上工作,并且到目前为止,还没有探索它们可以在体系结构级别上揭示限制的程度(例如,违反模块化原理)。 为了实现这一目标,我们对从20个著名的开源软件项目中检索到的1200...
不再是机械地跟随实验手册操作,而是鼓励学生自主设计实验,探索实验原理,并通过实际操作来组合不同的模块进行项目开发。这样的教学方式更加注重学生的主动性和创造力,同时也锻炼了他们的系统思维能力和创新精神。...
《化学反应原理模块复习》课件深入浅出地为学习者整理和解释了其中的核心概念和理论。通过对电离概念、水的电离、热化学方程式与盖斯定律、原电池与电解池以及化学反应速率与平衡的影响因素这五个关键知识点的复习,...
在IT领域,模块化编程是一种常见的设计思想,它将复杂的软件系统分解为多个独立的、可重用的部分,也就是我们所说的...对于这样的专业工具,持续学习和探索其内在原理及使用技巧,也是提升自身技术能力的重要途径。
单片机实验课的模块化教学是一种新型的教学方法,它通过将教学内容分解为若干个模块,再结合专业的特点,从基础到创新分为多个层次,由简到难地进行教学。这种教学方式不仅可以提高学生的学习兴趣,还能帮助学生更好...
模块化教学法强调以能力培养为核心,将教学内容分解为若干个模块,每个模块围绕一个特定的技能目标进行教学。与传统的以知识传授为主教学方法不同,模块化教学注重知识和技能的实际应用,鼓励学生通过实践来学习和...
易语言E4A(Easy4Android)是一种专为Android平台设计的编程工具,它结合了易语言的简单语法和Android...掌握其工作原理和源码,不仅能让开发者更高效地利用E4A进行开发,还能为他们打开通往更深层次技术探索的大门。
在本实践项目中,我们通过一个推箱子小游戏来探索和运用ES6的模块化特性。ES6(ECMAScript 2015)引入的模块系统是JavaScript代码组织的重要方式,它使得代码更加清晰、可维护,同时也方便了代码重用。在HTML5和Node...
采用模块化教学方法,将教学内容分解成施肥决策、施肥方法、施肥技术与施肥理论应用等多个模块,有助于学生深入理解并掌握不同层面的施肥知识。此外,定期邀请农业领域的专家学者参与课程论证,通过他们的专业视角来...
综上所述,"基于人脸识别的非负矩阵nmf分解"项目旨在探索和利用NMF在人脸识别中的潜力,通过非负矩阵分解学习人脸的内在结构,提高识别的准确性和稳定性。这个项目可能为研究人员和开发者提供了一个实验平台,以深入...
1. 组织结构:利用层次原理图功能,将复杂电路分解为模块,便于管理和复用。 2. 符号定制:根据需要,可以自定义符号,以更直观地表示特定的电路功能。 3. 网络表生成:原理图完成后,AD会自动生成网表,它是连接...
它将复杂的系统分解为独立、可组合的功能模块,每个模块都具备特定的教学功能。这样的设计便于根据课程需求进行灵活搭配,使得实验内容可以更加贴近理论知识,同时降低设备维护和升级的难度。 二、教学实验台的功能...