2012年2月15日 星期三

[Programming] 物件導向(1)


不妨仔細想想,為什麼要用OOP?使用OOP有什麼好處?沒有它難道就會死人嗎?

C語言以前是以程序導向的方式做資料的交換和運算,並沒有什麼模組化、結構化的概念在裡面(其實還是有struct可以用,但是功能不強)。日子久了,同一隻程式不斷被維護、修改,或是又再增加新的需求,只會讓程式變得越來越難懂,越來越難維護,時間久了程式就沒辦法再持續維護下去了,程式就壞掉了。
這種程式呈現出來的樣子,就很像把三百五十種水果一起放到果汁機裡面打成汁再喝下去,你沒辦法知道讓你拉肚子 (bug) 的原因是哪一種水果,或是哪些水果的組合。

而OOP,能夠較容易將現實生活中的一切把它mapping成程式物件,進而描述物件和物件之間的關係,使程式容易和現實業務背景相結合,如此一來,就程式撰寫、閱讀上比較能夠容易被理解。所以,物件不光只是一個可以裝有客製化變數類型的"容器"而已,還有很多更近一步的關係可以建立及使用,以達到提高可維護性和「one rule, one place」的目的。
簡單來說:物件導向程式設計,能夠讓程式較容易被理解,也容易將其模組化

當然,一切都是以「能夠設計出適合的物件關係為前提」。



物件導向程式設計(Object-oriented programming, OOP)已經存在好長一段時間了,十多年前開始接觸VB的時候應該就有這種程式設計概念了,讓寫程式不光是用複雜(或不怎麼複雜)的程式指令來控制變數、計算和輸入輸出,更能讓現實生活中的實體概念直接對應到程式物件裡來,使程式更容易維護和撰寫。

要寫一個物件導向的程式其實沒有很難。就像在現實生活中,看得見的或看不見的實體,都可以把它想像成是一個個的物件,物件中有屬性,然後由外力來控制物件。寫該類程式也是如此。最基本的做法就是把要用程式表達出來的東西寫成類別(class),然後在需要使用到它的時候再宣告成一個(或多個)物件(object)。
一個超級老掉牙的例子:一個學生的類別,要記錄該生的姓名、性別和成績。
這個例子我完全不知道性別和成績之間的關係,但是管它的,反正需求就是這樣開....

class Student{
 private String name;
 private boolean sex;
 private int grade;

 //Constructor
 public Student(String name, boolean sex, int grade){
  this.name = name;
  this.sex = sex;
  this.grade = grade;
 }

 public String getName(){ return name; }
 public int getGrade(){ return grade; }
 public void SexTransform(){ sex = !sex; }
}

這樣寫,Student就非常簡單、草率、無用地完成了(請不要問我一個學生幹嘛要SexTransform()方法,我只能說這很宅)。
然而,如果OO概念只能達到這種程度的功能,那它不會流傳數十年,至今仍被人大量使用(應該吧?)。


つづく......

ref:
[1] 搞笑談軟工

沒有留言: