`
zhouyrt
  • 浏览: 1162051 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

软件的模块化开发

 
阅读更多
什么是模块化

模块化这个词最早出现在研究工程设计中的《Design Rules》,这本探路性质的书中。其后模块化原则还只是作为计算机科学的理论,尚不是工程实践。此时硬件的模块化一直是工程技术的基石之一。如标准螺纹、汽车组件、计算机硬件组件等。

软件模块化的原则也是随着软件的复杂性诞生的。从开始的机器码、子程序划分、库、框架、再到分布在成千上万公里的互联网上主机上的程序库。模块化是解决软件复杂性的重要方法之一。

模块化以分治法为依据,但是否意味着我们把软件无限制的细分下去。事实上当分割过细,模块总数增多,每个模块的成本确实减少了,但模块接口所需代价随之增加。要确保模块的合理分割则须了解信息隐藏,内聚度及耦合度。

 

模块化的意义

一句话:解决软件的复杂性问题,或说降低软件的复杂性。不至于随着变大而不可控而失败,使其可控,可维护,可扩展。

从这个意义上说:要编写复杂软件又不至于失败的唯一方法就是用定义良好的接口把若干简单模块组合起来。如此,多数问题只会出现在局部,那么就有希望对局部进行改造、优化甚至替换,而不至于牵动全局。

更术语一些的定义:模块化是一个软件系统的属性,这个系统被分解为一组高内聚、低耦合的模块。这些模块拼凑下就能组合出各种功能的软件,而拼凑是灵活的,自由的。经验丰富的工程师负责模块接口的定义,经验较少的则负责实现模块的开发。

 

什么是模块

上面提到,模块化是以分治法为依据。简单说就是把软件整体划分,划分后的块组成了软件。这些块都相对独立,之间用接口(协议)通信,每个块完成一个功能,多个块组合可以完成一系列功能。

以上可以看出划分后的模块应该具有清晰的,有文档描述的边界(接口/协议)。不同的语言对于模块的实现不同。比如SmallTalk,没有模块的概念,所以类就成了划分的唯一物理单元。Java有包的概念,也有类的概念。因此单独的类可以用来划分模块,包也可以用来划分。JavaScript是基于对象的语言,它创建对象无需先声明一个类,因此对象是天然用来划分模块的。

无论那种语言,封装是写模块的首要特质。即模块不会暴露自身的实现细节,不会调用其它模块的实现码,不会共享全局变量。一切只靠接口通信。模块化和封装是密不可分的。

 

模块的大小

模块分的越多,每一块就越小,接口的定义就越重要。全局复杂度和受bug影响的程度也会相应降低。软件应设计成由层次分明的嵌套模块组成,而且每层的模块粒度应该降至最低。Hatton绘制了一张缺陷密度和模块大小的关系图,发现曲线呈U型,凹面朝上。



 

 

可以看到,模块过大或过小都会滋生更多的bug。Hatton的经验表明,200~400行之间的逻辑行的代码是最佳的。

 

紧凑的模块

紧凑型是一个设计是否能装入人脑的的设计。紧凑的设计让人乐于使用,不会在你的想法与实际工作之间格格不入。紧凑不等同于“薄弱”,也不等同于“容易学习”。对于某些紧凑学习而言,在掌握其精妙的内在概念模型之前,要理解它是非常困难的。比如 Lisp 语言的设计就是紧凑的,又如 jQuery 库的设计也是非常紧凑的。

 

正交的模块

正交性是有助于使复杂设计也能紧凑的最重要特性之一。在纯正交设计的软件中,任何操作均无 副作用。每一个动作(方法调用)只做一件事,不会影响其它。

Douglas McIlroy 的“只做好一件事”的忠告是针对简单性的建议,但其实也暗含了对正交性的强调。

 

  • 大小: 50.8 KB
分享到:
评论

相关推荐

    激光雷达光电探测及应用工程软件模块化开发.docx

    激光雷达光电探测及应用工程软件模块化开发 激光雷达光电探测系统是激光雷达遥感大气系统开发的重要环节。激光雷达是通过望远镜接收大气散射回来的回波信号进行大气分析。因为需要探测十几甚至几十公里外的大气参量...

    基于人工智能的模块化嵌入式软件开发研究.pdf

    封装性则保证了软件模块化开发中组合和拆分功能的灵活性,同时不干扰其他功能。 在基于人工智能的模块化嵌入式软件开发设计流程中,首先需要根据用户需求对嵌入式软件的功能进行分析和划分,形成不同的模块序列。这...

    软件模块化概述与技术

    软件模块化是软件工程中的一种重要技术,它的目标是将软件分解成许多小的、独立的模块,每个模块完成各自不同的功能,使得软件易于开发、维护和复用。结构化编程是软件模块化的开始,它将软件分解成许多函数块,每个...

    Java9模块化开发核心原则与实践

    Java9是Java语言的一个重大更新,其引入了模块化系统,这一变化对于大型...理解并熟练掌握Java9的模块化开发,对于提升软件质量和开发效率具有重要意义。开发者应积极探索这一新特性,以便在实际项目中充分发挥其优势。

    模块化开发(英文版)

    模块化开发是一种软件工程方法,它强调将复杂系统分解为更小、更易管理的部件或模块,并且这些模块可以独立地开发和测试。在web前端开发中,模块化通常与组件化紧密相关,它帮助开发者创建具有可重用性的用户界面...

    大规模组件的模块化开发

    在IT行业中,模块化开发是一种高效且可维护的软件开发策略,尤其对于处理大规模组件时更为重要。2012年阿里技术嘉年华的嘉宾演讲PPT聚焦于这一主题,揭示了如何通过模块化来应对复杂性和扩展性挑战。在本篇内容中,...

    软件项目模板-模块开发卷宗.zip

    《软件项目模板-模块开发卷宗》是一个针对软件开发过程中的模块化开发提供详细指导的文档集合,通常在软件工程领域被广泛使用。模块化开发是将大型复杂系统分解为可独立管理和编程的小型模块,以提高代码的可读性、...

    模块化嵌入式人工智能软件的开发与应用.pdf

    模块化嵌入式人工智能软件的开发与应用是一篇旨在探讨如何通过模块化、嵌入式技术来开发人工智能软件的论文。文章深入分析了网络技术的发展以及信息技术在人们日常生活中的应用,强调了模块化嵌入式人工智能软件的...

    ASPNetMVC模块化开发.rar

    ASP.NET MVC 模块化开发是一种先进的软件设计模式,它允许开发者将应用程序分解为独立、可重用的模块,每个模块都有自己的特定功能。这种架构风格显著提高了代码的可维护性和扩展性,使得大型项目的管理变得更为高效...

    GB 软件开发国家标准

    1. **模块开发卷宗编写规范.doc**:此文件讲述了在软件开发过程中如何编写模块开发卷宗,它包含了模块的设计、实现、测试和维护等信息,是软件模块化开发的重要文档,有助于团队成员理解和复用代码。 2. **概要设计...

    基于人工智能的模块化嵌入式软件开发研究 (1).pdf

    本文探讨了基于人工智能的模块化嵌入式软件开发的研究与实践,分析了当前传统嵌入式软件开发中存在的效率低、可靠性不足、操作繁琐等问题,并提出了通过引入人工智能技术来改善这些问题的方法。文章阐述了采用模块化...

    NetCore下WPF基于Prism的模块化开发

    本篇文章将深入探讨如何在NetCore环境下利用Prism进行WPF的模块化开发。 首先,我们要了解.NET Core。它是微软推出的一个跨平台的开发框架,支持Windows、Linux、macOS等多个操作系统。与传统的.NET Framework相比...

    C#+WPF+Prism模块化开发示例

    **C# WPF Prism模块化开发示例** 在软件开发中,C#、WPF(Windows Presentation Foundation)和Prism框架结合使用,可以构建出高效、可维护且可扩展的桌面应用程序。本示例旨在介绍如何利用Prism进行模块化的WPF...

    OSGi.NET-master.zip_c#osgi_osgi_osgi.net github_模块化

    最后,“模块化”一词意味着该框架的核心特性是支持软件模块化开发。 **描述解析:** "C#版OSGi模块化框架,本代码来源自Github" 这个描述进一步确认了代码是用C#编写的OSGi实现,并且可以从GitHub上获取。模块化...

    雷达数据处理软件模块化研究.pdf

    因此,软件模块化思想被应用于雷达数据处理软件的开发中,以提高软件的开发效率和可靠性。软件模块化是指将复杂的软件系统分解为互相独立的软件功能模块,每个模块都可以独立开发、测试和维护,从而提高软件的开发...

    行业管理软件模块化框架源码

    行业管理软件模块化框架源码是一种常见的软件开发实践,它主要目标是提高代码的复用性、可维护性和可扩展性。在这个框架中,不同功能的模块被设计为相互独立,可以灵活组合和配置,以适应不同行业的特定需求。下面...

    小程序模块化开发——模块.zip

    模块化开发是现代软件工程中一个核心的概念,它允许我们将大型项目分解为可复用、独立的小单元,即模块。每个模块都有自己的功能,可以单独编写、测试和维护,然后通过特定方式组合成完整应用。在小程序开发中,模块...

    PHP渐进式模块化后台 InitAdmin

    3. **模块化支持**:模块化是软件工程中的一个重要概念,它将复杂系统分解为可复用的、独立的部分。InitAdmin支持模块化,意味着开发者可以将后台功能划分为多个模块,如用户管理、权限控制、数据统计等。每个模块都...

Global site tag (gtag.js) - Google Analytics