模块化编程(英語:modular programming),是强调将计算机程序的功能分离成独立的軟體模組的软件设计技术,軟體模組(Software Module)是模組化編程的基本單元。模块化编程使得每个模块都包含着执行预期功能的唯一方面(aspect)所必需的所有东西。

简介

编辑

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

模块化编程密切相关于结构化编程面向对象编程,它们有着相同目标,即通过分解成更小部份的方式,促进大型软件和系统的建构,并且都大致起源于1960年代。尽管这些术语在历史上的用法曾经是不相容的,在现代的术语运用中:

  • 模块化编程,指称将整个程序的代码分开成各部份的高层分解。
  • 结构化编程,是采用结构化控制流的低层代码使用。
  • 面向对象编程,是对象的“数据”使用,对象是某种数据结构

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

历史

编辑

模块没有包括在最初的ALGOL 68(1968年)规定中,但是作为扩展被包括于早期的实现中,如ALGOL 68-R英语ALGOL 68-R(1970年)和ALGOL 68C英语ALGOL 68C(1970年),并在此后进行了形式化[1]。开始就设计为模块化编程的第一个语言是Niklaus Wirth的短寿的Modula(1975年)。另一个早期模块化语言是Xerox PARCMesa(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年)是有着最完全的模块系统的语言之一[2],包括了在模块间映射的函子(参数化模块)。

在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),比如用于DartGoJava,有时用来替代“模块”。在其他实现中,它们是不同的概念;在Python中,包是模块的搜集,而在Java 9中,介入并实现了新的模块概念(具有增强访问控制的包搜集)。

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

其他用于模块的术语包括“单元”(unit),它用于Pascal方言中。

语言支持

编辑

正式支持模块概念的语言包括:

参见

编辑

注释

编辑
  1. ^ The term "package" is used for the analog of modules in the JLS;[3]— see Java package. "Modules", a kind of collection of packages, are planned for Java 9 as part of Project Jigsaw; these were earlier called "superpackages" and planned for Java 7.

参考文献

编辑
  1. ^ Lindsey, Charles H. Proposal for a Modules Facility in ALGOL 68 (PDF). ALGOL Bulletin. Feb 1976, (39): 20–29 [2014-12-01]. (原始内容 (PDF)存档于2016-03-03). 
  2. ^ David MacQueen. Modules for Standard ML, LFP '84 Proceedings of the 1984 ACM Symposium on LISP and functional programming: 198–207. August 1984. 
  3. ^ James Gosling, Bill Joy, Guy Steele, Gilad Bracha, The Java Language Specification, Third Edition, ISBN 0-321-24678-0, 2005. In the Introduction, it is stated "Chapter 7 describes the structure of a program, which is organized into packages similar to the modules of Modula." The word "module" has no special meaning in Java.
  4. ^ 存档副本. [2020-04-21]. (原始内容存档于2015-01-05). 
  5. ^ ECMAScript® 2015 Language Specification, 15.2 Modules. [2020-04-21]. (原始内容存档于2019-05-05). 

外部链接

编辑

📚 Artikel Terkait di Wikipedia

POP-2

provided rudimentary support for modularity.  P. M. Burstall, J. S. Collins. An Introduction to the POP-2 Programming Language (PDF). 1968 [2020-05-02]

Scheme

Lambda: The Ultimate GOTO. 1978年: The Art of the Interpreter or, the Modularity Complex (Parts Zero, One, and Two). 1978年: RABBIT: A Compiler for SCHEME

续体

Gerald J. Sussman, Guy L. Steele Jr. The Art of the Interpreter of the Modularity Complex (Parts Zero, One, and Two). 1978 [2021-11-07]. (原始内容存档于2021-11-07)

LISP

active programming languages only Fortran has had a longer life.  Guy L. Steele Jr., Gerald J. Sussman. The Art of the Interpreter of the Modularity Complex

耦合性 (計算機科學)

Journal, 13 (2), 115-139, 1974. F. Beck, S. Diehl. On the Congruence of Modularity and Code Coupling. In Proceedings of the 19th ACM SIGSOFT Symposium and

没有银弹

modularity)、抽象資料型別(abstract data type)、階層式結構(hierarchical structure)。 物件導向程式設計 相較於當時其他流行技術,物件導向程式設計(object-oriented programming)被許多軟體工程研究者寄予更高期待,达特茅斯学院的Mark

JCP

Location API 2.0 for Java ME 294(页面存档备份,存于互联网档案馆) Improved Modularity Support in the Java Programming Language 296 (页面存档备份,存于互联网档案馆) Swing Application Framework