「面向?象程序??」的各地常用名稱
|
---|
中?大陸
| 面向?象程序??
|
---|
臺灣
| 物件導向程式設計
|
---|
港澳
| 物件導向程式設計
|
---|
物件導向程式設計
(英語:
Object-oriented programming
,
??
:
OOP
)是種具有
物件
?念的
程式設計典範
,同?也是一?程式??的抽象方?。?可能包含
資料
、
特性
、
程式碼
與
方法
。?象則指的是
類別
(class)的?例。??
?象
作?
程序
的基本?元,?程序和
?据
封?
其中,以提高?件的重用性、?活性和?展性,物件裡的程序可以訪問及經常修改物件相關連的資料。在物件導向程式編程裡,電腦程式會被設計成彼此相關的物件
[1]
[2]
。
面向?象程序??可以看作一?在程序中包含各??立而又互相?用的?象的思想,????的思想?好相反:??的程序??主??程序看作一系列
函?
的集合,或者直接就是一系列???下?的指令。面向?象程序??中的每一??象都??能?接受?据、?理?据???据???其??象,因此??都可以被看作一?小型的“机器”,??象。目前已?被??的是,面向?象程序??推?了程序的?活性和可??性,?且在大型?目??中???用。此外,支持者??面向?象程序??要比以往的做法更加便于??,因??能??人?更??地?????程序,使得程序更加便于分析、??、理解。反?者在某些?域?此予以否?。
?我?提到面向?象的?候,?不?指一?程序??方法。?更多意?上是一?程序??方式。在?一方面,我?必?了解更多?于
面向?象系?分析
和
面向?象??
(Object Oriented Design,??OOD)方面的知?。許多流行的程式語言是物件導向的,?們的風格就是會透由物件來創出實例。
重要的物件導向程式語言包含
Common Lisp
、
Python
、
C++
、
Objective-C
、
Smalltalk
、
Delphi
、
Java
、
Swift
、
C#
、
Perl
、
Ruby
、
JavaScript
與
PHP
等。
特徵
[
??
]
物件導向程式編程的定義是使用「物件」來做設計,但?非所有的程式語言都直接支援「物件導向程式編程」相關技術與結構。?于OOP的准?定?及其本意存在着不少??。通常,OOP被理解?一??程序分解?封??据及相?操作的模?而?行的?程方式。有?于其??程方式,OOP中的?某?据?型相?的一系列操作都被有机地封?到??据?型?中,而非散放于其外,因而OOP中的?据?型不?有着??,?有着相?的行?。
面向?象的?建要素由三?部分?成,?例、?和元?据,元?据?存??建所需要的一切信息。??系上看,???例?一?多?系,?和元?据?一?一?系,?例?指向?,??指向元?据,???系最??成了所有面向?象的基?(
object
)。
OOP理?,及?之同名的OOP??相?合?造出了新的一??程架?;OOP思想被?泛??是非常有用的,以致一套新的
?程范型
被?造了出?。(其?的
?程范型
例如函?式?程或?程式?程?注于程序?行的?程,而???程?注于引?程序代??行的?言)。?面向模?系?的?言(如:SIMULA 67)的?究及?高可?性系?架?(如:高性能操作系?和CPU的架?)的?究最??致了OOP的?生。其中由
Deborah J. Armstrong
?行的??40年之久的?算机著作??中,?示出了一系列面向?象程序??的基本理?。物件導向程式特徵被條列如下
[3]
[4]
[5]
[6]
分享非物件導向程式前身語言
[
??
]
物件導向程式設計通常共享高階編程語言的低階功能。可用於建構一個程序的基本工具包括:
- 變數
:能儲存一些內建型態的資訊如
整數
與
字元
,也有些是
資料結構
像是
字串
、
串列
與
雜湊表
等包含內建或複合的變數如指標。
- 程序
:也稱?函式、方法或例程,是指輸入資料?生輸出結果,現代語言還包含結構化編程結構如
程式?圈
與
條件
。
類與?象
[
??
]
支持面向?象編程語言通常利用
繼承
其他類達到代碼重用和可擴展性的特性。而類有兩個主要的?念:
- 類
(Class):定義了一件事物的抽象特點。類的定義包含了數據的形式以及對數據的操作。
- ?象
(Object):是類的實例(Instance)。
其中
?
(Class)定?了一件事物的抽象特点。?的定?包含了?据的形式以及??据的操作。?例??,“犬”????包含犬的一切基?特征,?所有“犬”都共有的特征或行?,例如?的品?、毛皮?色和吠叫的能力。?可以?程序提供模版和??。一??的方法和?性被??“
成?
”。
我??看一段
?代?
:
?
犬
?始
公有成?:
吠():
私有成?:
毛色:
品?:
?束
在?串代?中,我??明了一??,???具有一些犬的基本特征。?于
公有成?
和
私有成?
,???下面的?承性的?容。
?象
(Object)是?的
?例
。物件有時會對應到現實世界中的事物,?例來說,一個圖形程式可能有圓形、矩形與?面等物件,一個線上購物系統可能有購物車、顧客與?品等類別。
[7]
。有時?象會表示更抽象的實體,比如一個被開?的?案或是一個提供美國慣用量測轉換的服務。每個?象就是一個特定類別的實例(例如,名稱是“李?”的物件可能是類別雇員的一個實例)。程序在面向?象編程當中被視?方法,變數被視?成員或屬性。例如,“犬”???列?犬的特点,?而使???定?了世界上所有的犬。而大????象?是一?具?的犬,?的?性也是具?的。犬有毛色,而大?的毛色是?色的。因此,大?就是犬???的一??例。一?具??象?性的?被?作?的“
??
”。(系???象分配?存空?,而不???分配?存空?。??好理解,?是抽象的,系?不可能?抽象的?西分配空?,而?象?是具?的。)
假?我?已?在上面定?了犬???,我?就可以用????定??象:
定?
大?
是
犬
大?.毛色 : ?
大?.吠()
我?无法?犬???去吠,但是我?可以??象“大?”去吠,正如狗可以吠,但?有具?的狗就无法吠。
?和?象就好比是“?型”和“1.23”,“?型”是一??据的?型,而“1.23”是一??正的“??”(??象)。所有的“??”都具有“?型”所描?的特征,如“??的大小”,系??分配?存?“??”存?具?的??。
動態配置與訊息傳遞機制
[
??
]
定義上
動態配置
是指方法會隨著實例動態的改變。而
訊息傳遞機制
(Message Passing)是指一個物件通過接受訊息、處理訊息、傳出訊息或使用其他類別的方法來實作一定功能。如:
大?
可以通?
吠
引起
人
的注意,?而?致一系列的事?生。
封裝性
[
??
]
具備
封裝性
(Encapsulation)的物件導向程式設計隱藏了某一方法的具體執行步驟,取而代之的是通過訊息傳遞機制傳送訊息給?。封裝是通過限制只有特定類別的物件可以存取這一特定類別的成員,而?們通常利用介面實作訊息的傳入傳出。??例子,接口能?保幼犬?一特征只能被?予犬?一?。通常來說,成員會依?們的存取權限被分?3種:
公有成員
、
私有成員
以及
保護成員
。有些語言更進一步:
Java
可以限制同一包內不同類別的存取;
C#
和
VB.NET
保留了?類別的成員聚集準備的關鍵字:internal(C#)和Friend(VB.NET);Eiffel語言則可以讓使用者指定?個類別可以存取所有成員。
因此,?例??,“犬”???有“吠()”的方法,?一方法定?了犬具??通?什?方法吠。但是,大?的朋友?不知道?到底是如何吠的。
??例?看:
/* 一?面向?程的程序????: */
定?
大?
大?.定音(442)
大?.吸?()
大?.吐?()
/* 而?狗的吠叫被封?到?中,任何人都可以??地使用: */
定?
大?
是
犬
大?.吠()
?承
[
??
]
?承性
(Inheritance)是指,在某?情?下,一???有“
子?
”。子?比原本的?(??
父?
)要更加具?化。例如,“
犬
”???可能?有?的
子?
“
中?田?犬
”和“
牧羊犬
”。在??情?下,“大?”可能就是中?田?犬的一?
?例
。子???承父?的
?性
和
行?
,?且也可包含??自己的。我?假?“犬”???有一?
方法
(行?)叫做“吠()”和一??性叫做“毛色”。?的子?(前例中的中?田?犬和牧羊犬)??承?些成?。?意味着程序?只需要?相同的代??一次。
在?代?中我?可以???:
?
中?田?犬
: ?承
犬
定?
大?
是
中?田?犬
大?.吠() /* 注?:注意?里?用的是狗???的吠叫方法。*/
回到前面的例子,“中?田?犬”???可以?承“毛色”???性,?指定其??色。而“牧羊犬”?可以?承“吠()”??方法,?指定?的音?。子?也可以加入新的成?,例如,“牧羊犬”???可以加入一?方法叫做“放牧()”。?若用“中?田?犬”???定?了一??例“大?”,那?大?就不?放牧,因???方法是?于牧羊犬的,而非中?田?犬。事?上,我?可以把?承理解?“是”或“?于”。大?“是”中?田?犬,中?田?犬“?于”犬?。因此,大??得到了中?田?犬的?性,又?承了犬的?性。
我??看?代?:
?
牧羊犬
: ?承
犬
?始
公有成?:
放牧()
?束
?
中?田?犬
: ?承
犬
定?
大?
是
中?田?犬
大?.放牧() /* 注?:??:放牧是牧羊犬的成?方法。 */
?一???多?父??承?,我??之?“
多重?承
”。如一只狗?是中?田?犬又是牧羊犬。多重?承?不?是被支持的,因????理解,又??被好好使用。
多型
[
??
]
多型
(Polymorphism)是指由?承而?生的相?的不同的?,其?象?同一消息?做出不同的??
[8]
。例如,狗和?都有“叫()”?一方法,但是?用狗的“叫()”,狗?吠叫;?用?的“叫()”,???啼叫。
我?????在?代?上:
?
犬
?始
公有成?:
叫()
?始
吠()
?束
?束
?
?
?始
公有成?:
叫()
?始
啼()
?束
?束
定?
大?
是
狗
定?
?帽
是
?
大?.叫()
?帽.叫()
??,?然同?是做出
叫
?一?行?,但大?和?帽具?做出的表?方式?大不相同。多?性的?念可以用在
?算符重?
上,可以根据需求?看相?界面。
抽象性
[
??
]
抽象
(Abstraction)是?化??的????的途?,?可以?具????到最恰?的?定?,?且可以在最恰?的?承??解???。?例?明,大?在大多??候都被?作一?狗,但是如果想要??做中?田?犬做的事,?完全可以?用中?田?犬的方法。如果狗????有
?物
的父?,那??完全可以?大???物。
?史
[
??
]
面向?象程序??的?形,早在1960年代的
Simula
?言中?可??,??的
程序??
?域正面?着一?危机:在?硬件?境逐???的情?下,?件如何得到良好的???面向?象程序??在某?程度上通?强?
可重?性
解?了?一??。20世?70年代的
Smalltalk?言
在面向?象方面堪??典??以至于30年后的今天依然??一?言??面向?象?言的基?。
?算机科?中?象和?例?念的最早萌芽可以追溯到
麻省理工?院
的
PDP-1
系?。?一系?大?是最早的基于容量架?(capability based architecture)的??系?。?外1963年Ivan Sutherland的
Sketchpad
?用中也?含了同?的思想。?象作??程??最早是于1960年代由
Simula 67
?言引入思?。Simula?一?言是
奧利-約翰·達爾
和
克利斯登·奈加特
在
?斯?
的
?威?算中心
?模??境而??的。(据?,他?是?了模?船只而??的???言,?且?不同船只??性的相互影?感?趣。他??不同的船只???不同的?,而每一??象,基于?的?,可以定??自己的?性和行?。)???法是分析式程序的最早?念??。在分析式程序中,我????世界的?象映射到抽象的?象,?叫做“模?”。Simula不?引入了“?”的?念,??用了?例?一思想???可能是?些?念的最早?用。
20世?70年代
施?
PARC?究所?明的
Smalltalk
?言?面向?象程序??的?念定??,在基??算中,?
?象
和
消息
的?泛?用。
Smalltalk
的?建者深受Simula 67的主要思想影?,但
Smalltalk
中的?象是完全??的????可以被?建、修改??毁,??Simula中的???象有所??。此外,
Smalltalk
?引入了
?承性
的思想,?因此一?超越了不可?建?例的程序??模型和不具??承性的Simula。此外,Simula 67的思想亦被?用在?多不同的?言,如
Lisp
、
Pascal
。
面向?象程序??在80年代成?了一?主?思想,?主要??功于
C++
??
C?言
的?充版。在
?形用?界面
(GUI)日??起的情?下,面向?象程序???好地适?了潮流。GUI和面向?象程序??的?密??在Mac OS X中可?一斑。Mac OS X是由
Objective-C
?言?成的,?一?言是一??
Smalltalk
的C?言?充版。面向?象程序??的思想也使
事件?理
式的程序??更加?泛被?用(?然?一?念?非?存在于面向?象程序??)。一??法是,GUI的引入?大地推?了面向?象程序??的?展。
?黎世?邦理工?院
的尼克?斯·??特和他的同事??抽象?据和模?化程序???行了?究。
Modula-2
??些都包括了?去,而
Oberon
?包括了一?特殊的面向?象方法??不同于
Smalltalk
?
C++
。
面向?象的特性也被加入了????流行的?言:
Ada
、
BASIC
、
Lisp
、
Fortran
、
Pascal
以及??。由于?些?言最初??有面向?象的??,故而???合常常??致兼容性和??性的??。?之相反的是,“?正的”面向?象?言却缺乏一些程序???以生存的特性。在?一大?境下,??新的?言成?了??之急。作?先行者,
Eiffel
成功地解?了?些??,?成?了???受?迎的?言。
在?去的?年中,
Java?言
成?了???用的?言,除了??
C
和
C++
?法上的近似性。Java的可移植性是?的成功中不可磨?的一步,因??一特性,已吸引了?大的程序?群的投入。
在最近的?算机?言?展中,一些?支持面向?象程序??,又支持
面向?程程序??
的?言?然浮出水面。??中的??者有
Python
、
Ruby
等等。
正如
面向?程程序??
使得
??化程序??
的技?得以提升,?代的面向?象程序??方法使得?
設計模式
的用途、
契約式設計
和
建模語言
(如
UML
)技?也得到了一定提升。
物件導向編程語言
[
??
]
支持部分或?大部分面向?象特性的?言?可??基于?象的或面向?象的?言。
Simula
(1967)被視?第一個具有物件導向特性的語言。早期,完全面向?象的?言主要包括
Smalltalk
等?言,目前??流行的?言中有
Java
、
C#
、
Eiffel
等。?着?件工?的?展,比?早的程序導向的?言在近些年的?展中也??吸收了?多物件導向的?念,比如
C
→
C++
,C→
Objective-C
,
BASIC
→
Visual Basic
→
Visual Basic .NET
,
Pascal
→
Object Pascal
,
Ada
→
Ada95
。「純粹」的物件導向語言, 因?所有的東西都是由物件所組成,例如:
Eiffel
,
Emerald
,
[9]
JADE
,
Obix
,
Ruby
,
Scala
,
Smalltalk
,
Self
.
?本中的OOP
[
??
]
近年來,面向?象的程序??越?越流行于
脚本?言
中。
Python
和
Ruby
是建立在OOP原理的脚本語言,
Perl
和
PHP
亦分別在Perl 5和PHP 4時加入物件導向特性。
參見
[
??
]
參考文獻
[
??
]
- ^
Kindler, E.; Krivy, I. Object-Oriented Simulation of systems with sophisticated control. International Journal of General Systems: 313?343. 2011.
- ^
Lewis, John; Loftus, William. Java Software Solutions Foundations of Programming Design 6th ed. Pearson Education Inc. 2008.
ISBN
0-321-53205-8
.
, section 1.6 "Object-Oriented Programming"
- ^
Deborah J. Armstrong.
The Quarks of Object-Oriented Development
. A survey of nearly 40 years of computing literature which identified a number of fundamental concepts found in the large majority of definitions of OOP, in descending order of popularity: Inheritance, Object, Class, Encapsulation, Method, Message Passing, Polymorphism, and Abstraction.
- ^
John C. Mitchell
,
Concepts in programming languages
, Cambridge University Press, 2003,
ISBN 0-521-78098-5
, p.278. Lists: Dynamic dispatch, abstraction, subtype polymorphism, and inheritance.
- ^
Michael Lee Scott,
Programming language pragmatics
, Edition 2, Morgan Kaufmann, 2006,
ISBN 0-12-633951-1
, p. 470. Lists encapsulation, inheritance, and dynamic dispatch.
- ^
Pierce, Benjamin.
Types and Programming Languages
. MIT Press. 2002.
ISBN
0-262-16209-1
.
, section 18.1 "What is Object-Oriented Programming?" Lists: Dynamic dispatch, encapsulation or multi-methods (multiple dispatch), subtype polymorphism, inheritance or delegation, open recursion ("this"/"self")
- ^
Booch, Grady.
Software Engineering with Ada
. Addison Wesley. 1986: 220
[
2016-03-06
]
.
ISBN
978-0805306088
. (原始?容
存?
于2021-05-14).
Perhaps the greatest strength of an object-oriented approach to development is that it offers a mechanism that captures a model of the real world.
- ^
?浩强
:《C++面向?象程序??》,??大?出版社,2006年1月第一版。
ISBN 978-7-302-12315-6
- ^
The Emerald Programming Language
. 2011-02-26
[
2016-03-06
]
. (原始?容
存?
于2021-04-21).
延伸閱讀
[
??
]
- Abadi, Martin
;
Luca Cardelli
. A Theory of Objects.
Springer Verlag
. 1998.
ISBN
0-387-94775-2
.
- Abelson, Harold
;
Gerald Jay Sussman
.
Structure and Interpretation of Computer Programs
.
MIT Press
. 1997
[
2016-03-06
]
.
ISBN
0-262-01153-0
. (原始?容
存?
于2017-12-26).
- Armstrong, Deborah J.
The Quarks of Object-Oriented Development
. Communications of the ACM. February 2006,
49
(2): 123?128
[
8 August
2006]
.
ISSN 0001-0782
.
doi:10.1145/1113034.1113040
. (原始?容
存?
于2020-01-22).
- Booch, Grady
. Object-Oriented Analysis and Design with Applications.
Addison-Wesley
. 1997.
ISBN
0-8053-5340-2
.
- Eeles, Peter;
Oliver Sims
.
Building Business Objects
.
John Wiley & Sons
. 1998.
ISBN
0-471-19176-0
.
- Gamma, Erich
;
Richard Helm
,
Ralph Johnson
,
John Vlissides
.
Design Patterns: Elements of Reusable Object Oriented Software
. Addison-Wesley. 1995.
ISBN
0-201-63361-2
.
- Harmon, Paul
; William Morrissey.
The Object Technology Casebook - Lessons from Award-Winning Business Applications
. John Wiley & Sons. 1996.
ISBN
0-471-14717-6
.
- Jacobson, Ivar
. Object-Oriented Software Engineering: A
Use Case
-Driven Approach. Addison-Wesley. 1992.
ISBN
0-201-54435-0
.
- Kay, Alan
.
The Early History of Smalltalk
.
[
2016-03-06
]
. (
原始?容
存?于2005-04-04).
- Meyer, Bertrand
.
Object-Oriented Software Construction
.
Prentice Hall
. 1997.
ISBN
0-13-629155-4
.
- Pecinovsky, Rudolf.
OOP - Learn Object Oriented Thinking & Programming
. Bruckner Publishing. 2013
[
2016-03-06
]
.
ISBN
978-80-904661-8-0
. (原始?容
存?
于2021-05-14).
- Rumbaugh, James
; Michael Blaha; William Premerlani; Frederick Eddy; William Lorensen.
Object-Oriented Modeling and Design
. Prentice Hall. 1991.
ISBN
0-13-629841-9
.
- Schach, Stephen. Object-Oriented and Classical Software Engineering, Seventh Edition.
McGraw-Hill
. 2006.
ISBN
0-07-319126-4
.
- Schreiner, Axel-Tobias. Object oriented programming with ANSI-C. Hanser. 1993.
ISBN
3-446-17426-5
.
.
- Taylor, David A.
Object-Oriented Information Systems - Planning and Implementation
. John Wiley & Sons. 1992.
ISBN
0-471-54364-0
.
- Weisfeld, Matt. The Object-Oriented Thought Process, Third Edition.
Addison-Wesley
. 2009.
ISBN
0-672-33016-4
.
- West, David.
Object Thinking (Developer Reference)
.
Microsoft Press
. 2004.
ISBN
0735619654
.
外部連結
[
??
]