模組化編程
模組化編程(英語:modular programming),是強調將電腦程式的功能分離成獨立的、可相互改變的「模組」(module)的軟體設計技術,它使得每個模組都包含著執行預期功能的一個唯一方面(aspect)所必需的所有東西。
簡介
模組介面表達了這個模組所提供的和所要求的元素。這些在介面中定義的元素可以被其他模組檢測到。模組實現包含了工作代碼,它們對應於在介面中聲明的元素。
模組化編程密切相關於結構化編程和物件導向程式設計,它們有著相同目標,即通過分解成更小部份的方式,促進大型軟體和系統的建構,並且都大致起源於1960年代。儘管這些術語在歷史上的用法曾經是不相容的,在現代的術語運用中:
在物件導向程式設計中,使用介面作為一種架構上的模式(pattern)來構造模組叫做基於介面編程 。
歷史
模組沒有包括在最初的ALGOL 68(1968年)規定中,但是作為擴充被包括於早期的實現中,如ALGOL 68-R(1970年)和ALGOL 68C(1970年),並在此後進行了形式化[1]。開始就設計為模組化編程的第一個語言是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年)是有著最完全的模組系統的語言之一[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),比如用於Dart、Go或Java,有時用來替代「模組」。在其他實現中,它們是不同的概念;在Python中,包是模組的搜集,而在Java 9中,介入並實現了新的模組概念(具有增強訪問控制的包搜集)。
進一步的,術語「包」在軟體中有其他用途(例如.NET NuGet包)。組件(component)是類似的概念,但是典型的用於高層;組件是整個系統的一部份,而模組是個別程式的一部份。術語「模組」的尺度在不同語言之間差異巨大;在Python中它是小尺度的,而每個檔案是一個模組;在Java 9中它被規劃為是大尺度的,這裡的模組是包的搜集,而包是檔案的搜集。
其他用於模組的術語包括「單元」(unit),它用於Pascal方言中。
語言支援
正式支援模組概念的語言套件括:
- Ada
- Algol
- BlitzMax
- C#
- Clojure
- COBOL
- D
- Dart
- eC
- Erlang
- Elixir
- Elm
- F
- F#
- Fortran
- Go
- Haskell
- IBM/360組譯
- 控制語言(CL)
- IBM RPG
- Java[註 1]
- MATLAB
- ML
- Modula
- Modula-2
- Modula-3
- Morpho
- NEWP
- Oberon
- Oberon-2
- Objective-C
- OCaml
- Component Pascal
- Object Pascal
- Turbo Pascal
- UCSD Pascal
- Perl
- PL/I
- PureBasic
- Python
- Ruby[4]
- Rust
- JavaScript[5]
- Visual Basic .NET
- WebDNA
參見
注釋
- ^ 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.
參考文獻
- ^ 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).
- ^ David MacQueen. Modules for Standard ML, LFP '84 Proceedings of the 1984 ACM Symposium on LISP and functional programming: 198–207. August 1984.
- ^ 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.
- ^ 存档副本. [2020-04-21]. (原始內容存檔於2015-01-05).
- ^ ECMAScript® 2015 Language Specification, 15.2 Modules. [2020-04-21]. (原始內容存檔於2019-05-05).