顯示具有 物件導向 標籤的文章。 顯示所有文章
顯示具有 物件導向 標籤的文章。 顯示所有文章

2014/4/26

[筆記]物件導向-其二

物件導向裡面有三大特性

其實這三大特性,是相對於過往的純程序性語言而來…這樣被認定的優點,就是對過往的歷史所持的反對票;不過有時候是文人相輕,事實上程序性語言也不是什麼壞東西。只能說色色樣樣的程式語言只是工具,而不是目的,這是學習過程中要特別注意的…反正物件導向語言的重點就是在於物件彼此間的互動狀況。

(1)封裝性

很單純就是為了隱藏,只留下介面供存取;並且解決了全域變數的議題

這樣的東西在日常生活中也常常發生,例如:應該沒有幾個人明確的知道電梯的運作原理吧? 但是每個人進了電梯後,都知道依據狀況,按下不同按鈕,例如:「開門」、「關門」、「開門延長」,當然最重要的是「到達樓層」,而且當電梯到達了目的地,電梯門還會自動打開哩…

例如:在C#中,你可以特意將class中的各式屬性給予隱藏(都設成previate),只留下介面讓使用者使用;反過來說,其實電腦完美的將個別不同的物件分別綁住不同的變數與方法,將整理的麻煩工作直接交給電腦…

(2)繼承性

很多書都用什麼父親、兒子之類的舉例;或是鳥類 vs 公雞、企鵝啦….我覺得只會愈看愈火大。

其實不用想這麼多,就從實務的狀況來想就是,繼承性只是為了少寫程式碼而做出來的對策;舉例來說,你今天想要寫一個 RPG 遊戲,而其中最大的賣點是 轉職系統。可能有多種職業,像是勇者可以到處偷東西而不被關、魔法師可以使用高級黑魔法、格鬥家可以裝備拳擊手套、弓箭手可以裝備弓箭…等等。在沒有物件導向的年代,你就要這樣寫

class 勇者{   }

class 魔法師{   }

class 格鬥家{   }…

諸如此類的,可是你會發現除了職業間的差異外,其實有很多共通的特性啊,像是 HP、MP、物理攻擊力、智力、魔法攻擊力、魔法防御力、速度之類的屬性都是共通的;或是像 逃跑() 這類的方法應該也是共同的。重複的複製貼上動作真的很辛苦。所有人有想到,那我就將這些相同的特性給獨立出來,也許新建一個基本類別叫

class player(  }就解決一切…而再針別針別職業特殊性進行物件設定即可

所以說穿了,就是想要 Reuse 就是要做好環保的工作;實務上也有讓程式碼好維護的作用…

(3)多型

物件導向相對於過往的程序語言,這算是一個很特別的機制,就是讓你有用相同的呼叫端來做不同的事(舉例:求算面積時,計算長方形的面積、計算圓形面積的公式並不相同,前者不需要圓周率、後者需要圓周率的介入,但對於使用者而言,只要在程式執行時告訴電腦你要算的是什麼,然後需要你想要計算的值,事情就解決…後續就算再增加一些奇奇怪怪的2D面積計算需求,也只需要再新建新的class加以定義即可。你的呼叫端基本上無需進行任何改變。這對於程式的維護有很大的幫助;

可以想像在遊戲中,隨著遊戲時間的增加,多了更多職業可供轉職;但此時,你一定只需要在相同的介面下進行轉職即可…你不需要去擔心會因此在操作上有所不同

而在 C# 中要實做這個,常常會在基本類別使用 virtual 關鍵字,而在衍生類別中使用 override(改寫);並利用基本類別的陣列來存取子類別的參考 (因為實際上子類別因有繼承行為,所以所佔的記憶體空間一定大於基本類別,所以陣列實際上是有紀錄記憶體位址而已,而這一切都是要程式執行時才會發生,所以討論多型時常常會看到”動態”這2個字。

 

….

2014/4/25

[筆記]物件導向-其一

因為是自學程式,所以在學習的過程中,往往一個簡單的範例要想好幾次才想得通

所以覺得有必要將一些學習心得寫下來做個紀錄

在目前主流的程式語言中,可以聽得到物件導向這個名詞

其實「路過」的程式語言愈多,就會覺得很多名詞的發明好像只是為了追求一種流行做為一種標榜,好像什麼多層次搭配,說穿了就是因為身材不夠完美,所以利用視覺上的錯覺來讓外表更符合想要傳達的印象。反過來,只要你的腿夠長,身材夠完美,其實是不太需要類似的技巧,根據你需要的場合來進行決策即可

好比物件導向,我一開始學習的時候也覺得蠻恐怖的;當然,我相信事情如果要深究到完美,一定有很多事情需要注意。但並不是每個人都是資工背景。有時候我只是需要針對一個中型的計量問題進行處理,程式寫得笨一點速度比人家慢了好幾倍,在現在CPU不是很值錢的年代,似乎也不是什麼大問題?? 注意哦,我寫的是中小型的問題,如果是超大型而複雜的問題,光是演算法的學問就可以寫成好幾本論文….

我對於物件的認識如下

(1)為了簡化程式語寫的複雜度

(2)物件導向的要件

   定義一個類別 (class) → 描述物件裡面的變數 → 編寫建議程序 → 編寫方法

我覺得大致上就是如此

例如:你知道想要做一個類別叫做蜘蛛;一定是你的程式中,有需要用到各種類型的蜘蛛是吧?? 然後再針對你需要的物件特性,例如可能是顏色、大小、攻擊力、魔法攻擊力進行定義。然後再看看沒有什麼方法,好比物件攻擊()、魔法攻擊()

(3)使用物件

   物件都是需要宣告後才能使用;就像一般程式語言中,你要使用一個變數也要先告訴電腦,這個變數x是整數,那個變數y是浮點數哦。同樣的,物件也有類似特性;就把自己定義好的類別想像成一種資料型態,你只是在確定需求的狀況下,予以實體化。

   在Fate/stay night的故事中,主角使用的是一種叫做「投影」的魔法技巧。在劇情中只要魔力充足的狀況下,就可以將看過的武器予以無限制的仿製後再利用。我覺得這個和程式語言其實還蠻像的啊,只要你的記憶體與運算資源是充足的,而你又能完美的瞭解到每個仿製對象(類別)的使用方式,並且予以適當的安排,就可以充分達到你要的效果…

    進而達到無限劍製(Unlimited Blade Works)的境界

嗯…果然是個人心得啊