物件導向編程

出自維基百科,自由嘅百科全書
跳去導覽 跳去搵嘢
Car 呢件物件喺個程式入面用嚟表示一架虛擬嘅「車」,會有若干隻特性同埋方法。

物件導向程式編寫英文object-oriented programmingOOP)係程式編寫範式一種。如果話一位軟件工程師用物件導向編程嚟程式,即係話佢以物件(object)嚟做個程式嘅基本單元:一件物件會包括一柞特定嘅數據,呢啲數據(特性;attribute)因為用途上有某啲共通點而俾設計者擺埋一齊嚟睇;除此之外,一件物件通常仲會掕住一啲專門處理同嗰件物件相關嘅工作嘅子程序,呢啲子程序就係嗰件物件嘅方法(method)[1][2]

舉個例說明,想像有隻電子遊戲程式,當中有兩件數據 fuel燃料嘅量)同埋 maxspeed(最大速率),兩件數據都係描述緊一架嘅特性(用途上有共通點),所以設計者就教個程式將兩件數據擺埋一齊做一件物件噉睇;而且件物件仲掕住咗柞方法,例如 refuel() 呢個子程序就係用嚟補充燃料(即係將 fuel 變返做佢嘅最大可能數值)嘅。部電腦內部會記住「呢幾個特性同方法屬同一件物件」,並且喺用家介面嗰度將佢哋擺埋一齊展示,等用家做起程式編寫上嚟易搞好多[3]

喺廿一世紀初,有好多重要嘅應用-包括人工智能[4]遊戲編程[5]呀噉-都成日會用到物件導向編程。因為物件導向編程嘅廣泛用途,有啲程式語言甚至仲係專門設計到支援物件導向編程嘅,包括咗廿一世紀初常用嘅 C++C♯JavaJavaScriptPythonMATLAB 呀噉-呢啲程式語言就係所謂嘅物件導向程式語言[註 1]

基本功能[編輯]

睇埋:程式語言同埋抽象化 (電腦科學)

物件導向編程有齊基本編程會用嘅功能,例如係變數數據結構同埋子程序呀噉。除咗呢啲基本功能之外,物件導向編程仲有以下呢啲功能[6][7]

類同物件[編輯]

內文:類別 (電腦科學)物件 (電腦科學)

物件導向編程嘅最基本功能係類別(class)同物件(object)。喺物件導向編程當中,個程式裏面啲物件多數都係有返啲範本嚟參照造出嘅,呢啲範本就係所謂嘅類別-一個類別會講明屬呢個類別嘅物件每一件會掕住咩變數(特性;attribute)同埋子程序(方法;method),而一件物件就係佢所屬嗰個類別嘅一個實例(instance),即係按個類別嘅模嚟造出嘅[8]。用以下嘅程式碼做例子[9][10]

C#
class Car // 創造一個叫 Car 嘅 class。
{
  string color = "red"; // 一個屬 Car 呢個 class 嘅物件會有 color(顏色)呢個特性,而呢個特性預設數值係 red(紅色)。
}

...

Car myObj = new Car(); // 創造一件叫 myObj 嘅物件,件物件屬 Car 呢個 class。
MATLAB
classdef BasicClass % 定義 BasicClass 呢個 class...
   properties % 呢個 class 有以下呢啲特性...
      Value {mustBeNumeric}
   end
   methods % 呢個 class 有以下呢啲方法...
      function r = roundOff(obj) % 每個 function 都係一個方法...
         r = round([obj.Value],2);
      end
      function r = multiplyBy(obj,n)
         r = [obj.Value] * n;
      end
   end
end

...

a = BasicClass; % 創造一件叫 a 嘅物件,件物件屬 BasicClass 呢個 class。
a.Value = pi/3; % a 嘅 Value 設做 pi/3(圓周率除 3)咁多。

用類別同物件嘅做法喺好多應用上都好幫到手令個程式更加容易打理:例如想像一位遊戲製作師喺度編寫佢隻新遊戲遊戲程式,佢想創造一個遊戲世界俾玩家喺裏面移動;佢想個虛擬世界設計成好似一個現實嘅城市噉,度緊個城市其中一條街要點設計,佢想條街有幾架泊咗喺度做背景,佢可以設定一個「車」嘅類別,個類別每個實例都有「色水」同「位置」等嘅變數,然後叫個程式將「建構一個車嘅實例」呢樣嘢做三次-就唔使吓吓都重新打過「建構一個車嘅實例」嘅碼。有研究者指,依種程式寫法能夠令個程式嘅運作更加貼近現實世界嘅思維,而且彼此相關嘅資料同行為,都會歸一喺一件物件之內,會比較易管理[11][12]

物件同類別可以比喻成整餅;攞嚟造物件嘅類別就好似一個餅模可以造出好多同款唔同味嘅餅噉,個程式可以將嗰四件物體當成喺「顏色」呢個變數上唔同、但屬同一個類別嘅物件。

封裝性[編輯]

內文:封裝 (物件導向編程)

封裝(encapsulation)係物件導向編程當中嘅一個概念,負責將(通常係將屬同一件物件嘅)數據同埋操縱呢啲數據嘅子程序「包埋一齊」,等呢啲數據同子程序難以俾外界干擾同濫用。想像一個類別唔容許外界嘅碼直接使用一件物件內部嘅數據,淨係俾佢哋透過啲方法嚟使用啲數據,用返上面虛擬車嘅例子即係例如唔俾任何外界嘅碼直接更改 fuel 嘅數值,而淨係俾佢哋用 refuel() 呢個方法嚟改變 fuel 嘅數值,噉呢個類別就算係做咗封裝[13]

例如係好似以下呢段 C# 碼噉,就表示緊一個封裝好嘅類別:

public class Tricycle // 一個叫 Tricycle(三輪車)嘅 class...
{
    protected void Pedal() { } // Pedal() 呢個方法淨係可以由屬同一個 class、或者由呢個 class 延伸出嚟嘅 subclass 嘅碼使用。
    private int wheels = 3; // wheels 呢個特性係私有(private)嘅,淨係可以由屬同一個 class 或者 struct 嘅碼使用。
    ...
}

封裝相關嘅功能喺物件導向編程上有好多優點:封裝可以防止個程式嘅第啲部份修改個類別嘅數據,而喺做代碼重構(refactoring)嗰陣可以令出錯嘅機會減低(因為保證咗個類別以外永遠都唔會有碼嘗試直接改變個類別嘅內容);而且如果個程式係預咗俾一啲外行嘅用家使用嘅話,將啲特性變成 private 又可以將啲數值收埋唔顯示喺用家介面嗰度,某程度上令到個程式易用(用家唔使睇住咁多唔同嘅變數)啲[14]

繼承[編輯]

繼承嘅圖解;子類別會自動噉得到超類別嘅特性。
內文:繼承 (電腦科學)超類別 (電腦科學)子類別 (電腦科學)、 同 多重繼承

繼承(inheritance)係物件導向編程上嘅一個概念。喺物件導向編程當中,繼承係指物件嘅類別之間可以有嘅一種關係。抽象啲噉講,如果話物件類別 A 由類別 B 嗰度「繼承」啲嘢,意思係指類別 B(超類別;superclass / parent)有嘅特性,類別 A(子類別;subclass)冚唪唥都有,不過類別 A 可以有類別 B 冇嘅特性。噉做用意通常係因為類別 A 所表示嘅事物概念上係類別 B 所表示嘅事物嘅一種,而用繼承嘅做法可以令到寫程式嗰陣慳返好多時間精神[15]

舉個例說明,想像家陣有個遊戲程式,個程式要展示一個虛擬世界,個世界入面有 Animal動物)呢個類別,呢個類別具有一柞特性(data1data2),亦有柞特定嘅方法,例如係包含教個程式隻虛擬動物要點樣郁動嘅子程序(move());而又有若干件物件屬 Dog)呢個子類別,呢個類別由 Animal 呢個超類別嗰度繼承咗 move() 呢個方法(即係話無論係虛擬狗定第啲虛擬動物,個程式都會用同一個子程序嚟計算隻動物要點樣郁動),同時 Dog 又有 bark())呢個佢獨有嘅方法,呢個方法係淨係屬 Dog 嘅物件先至會用到嘅。用繼承嘅做法會方便,因為個設計者唔使種種動物都同佢哋設一個類別同埋重新打過嗮啲好似 move() 噉種種動物都要用嘅碼[15][16]

例如係好似以下呢段簡化嘅 C# 碼噉:

class Dog : Animal { // 創造一個 class 叫 Dog,呢個 class 嘅 superclass 係 Animal。
    // Dog 要做嘅嘢...
    public Dog()
    {
        Console.WriteLine("Dog");
    }
}

有啲程式語言(比較出名嘅有 C++Python)仲會支援多重繼承(multiple inheritance)嘅功能,即係俾一個子類別有多過一個超類別,而嗰啲超類別之間冇直接嘅繼承關係[17]

語言[編輯]

因為 OOP 咁好使好用,有好多廿一世紀初常見嘅程式語言都支援 OOP,包括咗

... 等等。

睇埋[編輯]

註釋[編輯]

  1. 就算唔用物件導向程式語言,都係可以寫到物件導向嘅程式嘅,只係無咁方便噉解。

文獻[編輯]

  • Armstrong, Deborah J. (February 2006). "The Quarks of Object-Oriented Development". Communications of the ACM. 49 (2): 123–128. doi:10.1145/1113034.1113040.
  • Pecinovsky, Rudolf (2013). OOP – Learn Object Oriented Thinking & Programming. Bruckner Publishing. ISBN 978-80-904661-8-0.
  • Schach, Stephen (2006). Object-Oriented and Classical Software Engineering, 7th Edition. McGraw-Hill. ISBN 978-0-07-319126-3.
  • Weisfeld, Matt (2009). The Object-Oriented Thought Process, 3rd Edition. Addison-Wesley. ISBN 978-0-672-33016-2.
  • West, David (2004). Object Thinking (Developer Reference). Microsoft Press. ISBN 978-0735619654.

[編輯]

  1. Kindler, E.; Krivy, I. (2011). "Object-Oriented Simulation of systems with sophisticated control". International Journal of General Systems: 313-343.
  2. Oppel, Andy (2005). SQL Demystified. McGraw Hill. p. 7.
  3. Lewis, John; Loftus, William (2008). Java Software Solutions Foundations of Programming Design 6th ed. Pearson Education Inc. Section 1.6 "Object-Oriented Programming".
  4. Wechsler, H., & Rine, D. (1988, January). Object oriented programming (OOP) and its relevance to designing intelligent software systems. In Proceedings 1988 International Conference on Computer Languages (pp. 242-243). IEEE Computer Society.
  5. Chen, W. K., & Cheng, Y. C. (2007). Teaching object-oriented programming laboratory with computer game programming. IEEE Transactions on Education, 50(3), 197-203.
  6. John C. Mitchell (2003). Concepts in programming languages, Cambridge University Press. p. 278. Lists: Dynamic dispatch, abstraction, subtype polymorphism, and inheritance.
  7. Michael Lee Scott (2006). Programming language pragmatics, Edition 2, Morgan Kaufmann. p. 470.
  8. Booch, Grady (1986). Software Engineering with Ada. Addison Wesley. p. 220.
  9. Kindler, E.; Krivy, I. (2011). "Object-Oriented Simulation of systems with sophisticated control". International Journal of General Systems: 313–343.
  10. Lewis, John; Loftus, William (2008). Java Software Solutions Foundations of Programming Design (6th ed). Pearson Education Inc. ISBN 978-0-321-53205-3., section 1.6 "Object-Oriented Programming".
  11. Quick Tip: Intro to Object-Oriented Programming for Game Development.
  12. Jacobson, Ivar (1992). Object-Oriented Software Engineering: A Use Case-Driven Approach. Addison-Wesley.
  13. Rogers, Wm. Paul (18 May 2001). "Encapsulation is not information hiding". JavaWorld.
  14. Scott, Michael Lee (2006). Programming language pragmatics (2 ed.). Morgan Kaufmann. p. 481. "Encapsulation mechanisms enable the programmer to group data and the subroutines that operate on them together in one place, and to hide irrelevant details from the users of an abstraction."
  15. 15.0 15.1 Johnson, Ralph (August 26, 1991). "Designing Reusable Classes" (PDF). www.cse.msu.edu.
  16. Jacobsen, Ivar; Magnus Christerson; Patrik Jonsson; Gunnar Overgaard (1992). Object Oriented Software Engineering. Addison-Wesley ACM Press. pp. 43–69.
  17. Cargill, T. A. (Winter 1991). "Controversy: The Case Against Multiple Inheritance in C++". Computing Systems. 4 (1): 69–82.

[編輯]