模块化编程

模块化编程（），是强调将计算机程序的功能分离成独立的、可相互改变的“模块”（module）的软件设计技术，它使得每个模块都包含着执行预期功能的一个唯一方面（aspect）所必需的所有东西。

简介
模块接口表达了这个模块所提供的和所要求的元素。这些在接口中定义的元素可以被其他模块检测到。模块实现包含了工作代码，它们对应于在接口中声明的元素。

模块化编程密切相关于结构化编程和面向对象编程，它们有着相同目标，即通过分解成更小部份的方式，促进大型软件和系统的建构，并且都大致起源于1960年代。尽管这些术语在历史上的用法曾经是不相容的，在现代的术语运用中：
模块化编程，指称将整个程序的代码分开成各部份的高层分解。
结构化编程，是采用结构化控制流的低层代码使用。
面向对象编程，是对象的“数据”使用，对象是某种数据结构。

在面向对象编程中，使用接口作为一种架构上的模式（pattern）来构造模块叫做基于接口编程 。

历史
模块没有包括在最初的ALGOL 68（1968年）规定中，但是作为扩展被包括于早期的实现中，如（1970年）和（1970年），并在此后进行了形式化。开始就设计为模块化编程的第一个语言是Niklaus Wirth的短寿的Modula（1975年）。另一个早期模块化语言是Xerox PARC的Mesa（1976年），Wirth提出了Modula和Mesa的继任者Modula-2（1978年），它影响了以后的语言，特别是通过它的后继者Modula-3（1988年）。

模块化编程从1980年代开始广泛传播：最初的Pascal语言（1970年）不包括模块，但是后来的版本特别是UCSD Pascal（1978年）和Turbo Pascal（1983年），以“单元”的形式包括了它们，受Pascal影响的Ada（1980年）也是如此。扩展Pascal ISO 10206:1990标准，在模块支持上保持接近于Modula-2。Standard ML（1984年）是有着最完全的模块系统的语言之一，包括了在模块间映射的函子（参数化模块）。

在1980年代和1990年代，模块化编程被遮盖于并经常被混淆于面向对象编程，特别是由于C++和Java的流行。例如，C语言家族中的C++（最初在1980年是具有类的C）和Objective-C（1983年）很早就已经支持了对象和类，只在30年后甚至更久之后才支持模块。Java（1995年）以包的形式支持模块，然而代码组织的主要单元是类。但是Python（1991年）从开始就突出的使用模块和对象二者，使用模块作为代码组织的主要单元，使用包作为大尺度的单元；而Perl 5（1994年）包括了对模块和对象二者的支持，具有能从CPAN（1993年）获得的大量的模块。

模块化编程现在已经普及了，自从1990年代以来，它能在几乎所有主要语言的开发中找到。模块的相对重要性因语言而异，并在基于类的面向对象语言中，仍与作为组织和封装的单元的类存在重叠和混淆，而它们都被良好的确立为独立的概念。

术语
术语汇集（assembly），比如用于.NET语言C#、F#或Visual Basic .NET，或者包（package），比如用于Dart、Go或Java，有时用来替代“模块”。在其他实现中，它们是不同的概念；在Python中，包是模块的搜集，而在Java 9中，介入并实现了新的概念（具有增强访问控制的包搜集）。

进一步的，术语“包”在软件中有其他用途（例如.NET NuGet包）。组件（component）是类似的概念，但是典型的用于高层；组件是整个系统的一部份，而模块是个别程序的一部份。术语“模块”的尺度在不同语言之间差异巨大；在Python中它是小尺度的，而每个文件是一个模块；在Java 9中它被规划为是大尺度的，这里的模块是包的搜集，而包是文件的搜集。

其他用于模块的术语包括“单元”（unit），它用于Pascal方言中。

语言支持
正式支持模块概念的语言包括：Ada、Algol、、C#, Clojure、COBOL、D、Dart、、Erlang、Elixir、Elm、、F#、Fortran、Go、Haskell、汇编语言、（CL）、、Java、MATLAB、ML、Modula、Modula-2、Modula-3、Morpho、、Oberon、、Objective-C、OCaml、一些派生的Pascal（、Object Pascal、Turbo Pascal、UCSD Pascal）、 Perl、PL/I、PureBasic、Python、Ruby、Rust、JavaScript、Visual Basic .NET、WebDNA。

参见
 架构描述语言
 內聚性 (計算機科學)
 基于组件的软件工程
 康威定律
 耦合性 (計算機科學)
 函式库
 模組化設計
 插件
 片段
 结构化分析
 结构化编程

注释

参考文献

外部链接 
 How To Decompose a System into Modules 

编程典范