物件導向程式設計|模擬真實世界的方式|江明朝

 

一、簡介

  • 學校:國立中山大學
  • 課程:高等物件導向程式設計 (Advanced Object-Oriented Programming, AOOP)
  • 教授:江明朝
  • 系所:資訊工程所
  • 學分:3學分
  • 學期:109-2
  • 宗宗的學期總成績:A- (83)


二、評分

  • 程式作業:70%
  • 期中考試:20%
  • 期末考試:10% 
AOOP有五項作業、期中考、期末考,每項作業都會有要求、評分、interface file、test file、output,通常是在不更動interface的情況下,根據output實作出相對應的implementation。期中比較難XD,平均20分,最高50分。期末是其中的延伸,再多加一些後半學期的內容。考試都是十題,一題10分,簡答題,答案長度通常不超過題幹。因此,老師表示,各位同學作業要好好寫啊!老師不會在作業上刁難你們,實際上只要準時交,有吻合預期uotput,都可以拿到90~100分。

作業1是用C和C++實作Dynamic stack,目的是為了展示不只有物件導向語言 (C++)能實作OOP,程序導向的語言 (C)也能實作OOP,只不過會比較麻煩。作業2要運用C++ commond line,輸入tar file path給C++,並在C++中處理tar file格式並輸出tar file內容。作業3實作複數類別,目的要練習operator overloading、friend function。作業4實作一個簡易的詞法分析器 (lexer),老師會給JAVA版本的code,要自己轉換成C++,是作業中最難的。作業5.1實作自定義操作子 (user-defined manipulators),作業5.2實作模板類別的階層 (class template hierarchy),這涉及到general / specialized template class。

更多作業內容,請參考AOOP Homework source code,但切勿抄襲,請自己寫~

更多考試內容,請參考[筆記]109-2高等物件導向程式設計 期中考

三、老師評價

江明朝

我覺得江老師的學經歷蠻勵志的,大家可以去看他的專訪,因為他學士是管理科學,碩博士才是計算機科學,後來有去矽谷工作,最後才在中山教書。某種意義上,也算是中途有換過領域的學者,這和很多一路都是念相關科系的學者很不一樣。

教學風格蠻美式的,每堂課第一句話大概是『同學有沒有問題』,有時會問一些問題。雖然是進階課程,但前半段還是會講一些基礎的東西,整體內容上比較偏『基礎概念』。注意基礎不代表簡單,而代表運作原理。我覺得些基礎知識在『寫』程式上不見得有顯著的幫助,但在『設計』程式上幫助就蠻大的。因此老師會更著重在why?而非what?

四、課程分析

前半學期

C++ Basics、Flow of Control、Function Basics、Parameters and Overloading、Arrays、Structures and Classes、Constructors and Other Tools、Operator Overloading, Friends, and References、Strings

雖然是OOP課程,但程序導向的概念也會教,像是if...else...、for loop、while loop、function這些重要觀念。C-array和pointer的關係也是重點中的重點,即使C++有自己專屬的array和vector等容器可以取代C-array,但這些容器的建構也是在C-array之上。pointer在C/C++的重要程度就不用多說了,如果能理解與使用pointer,你大概可以宣稱你學過C語言。

(一)指標 (pointer)

跟pointer有關的概念像是:pass by address、pass by reference、reference、iterator、dynamic variable。pass by address / reference可以讓參數傳遞更有效率。reference是C++有但C沒有的,reference可以讓使用者更方便,因為& (get address)和* (dereference)編譯器會自動幫你做。

iterator會出現在C++ Standard Template Library (STL)中的標準容器中,由於C++為了追求效率,不同的容器會有不同的iterator,因此iterator也有不同的種類。iterator可以讓使用者存取容器中的元素,而pointer也可以辦得到,不過iterator比pointer有更多的功能。

dynamic variable涉及到記憶體配置 (new)和釋放 (delete),變數的life time可以由使用者自己控制,但也要注意記憶體遺失或重複釋放的問題。因此C++類別中的建構子 (constructor)和解構子 (destructor)可以自動幫使用者管理資源。這種資源管理稱RAII,全稱資源取得即初始化 (Resource Acquisition Is Initialization),這是物件導向非常重要的概念之一。

更多指標介紹,請參考[筆記]陣列與指標|C++

(二)函式 (function)

function也是一個重點,像是:參數傳遞、signature、scope、overloading、operator。

傳遞參數有分pass by value、pass by address、pass by reference,C/C++預設為value,指標是使用address,參考是使用reference。

C++透過函式的簽章 (signature)去分辨不同的函式,簽章的組成有函數名、參數型態、參數排列,並不含有返回型態 (return type)。然而在同一個scope中,同樣的函數名但不同signature就會有多載 (overloading)的議題存在。

多載可以使同名的函式,承載不同型態的參數列。最經典的範例是operator overloading,operator本質上也是一種函式,只不過使用上更直覺。

更多函式介紹,請參考[筆記]介面與實作、運算子多載、左值右值、參數傳遞、回傳多值|C++

後半學期

Pointers and Dynamic Arrays、Separate Compilation and Namespaces、Streams and File I/O、Recursion、Inheritance、Polymorphism and Virtual Functions、Templates、STL、C++11

(三)物件導向

物件導向三個種要原則:封裝 (encapsulation)、繼承 (inheritance)、多型 (polymorphism)。由類別 (Class)實作封裝,基礎 (base)/衍生 (derived)實作繼承,虛擬函式實作多型。

Encapsulation 封裝:Type = Data + Operation。限制使用權限(public, protected, private),有利於debug,讓錯誤限制在某一個區塊。Inheritance 繼承:重複使用(reuse)程式碼。Polymorphism 多型:同名的函式與一樣的參數(同樣的signature),但有不同版本的函數,使用virtual,可以解決C中Switch問題。

更多類別介紹,請參考[筆記]類別、特殊函式、內嵌函式、函式物件|C++

更多繼承介紹,請參考[筆記]繼承模式與存取權限|C++

更多多型介紹,請參考[筆記]多型與繼承的關係|C++

更多靜態與常數介紹,請參考[筆記]static / const成員資料與函式|C++

更多夥伴介紹,請參考[筆記]夥伴函式與類別、不夠朋友問題|C++

(四)模板 (template)

template基本上可以視為另一個獨立的程式語言,並且是圖靈完備的,是另一個更大的坑。TMP (template metaprogramming)是未來的趨勢,因為大家會希望能在complie time完成就不要在run time做,因為一支程式可能只complie一次,但run可能重複run數次。

更多TMP例子,請參考期中考第7題

(五)小結

物件導向很像是人類的認知模式,人類擅長抽象化,抽象化不是指把事情弄複雜XD,抽象化反而是把事情簡化,抽象化其實就是去除多餘的細節,留下重要的東西。例如:世界上有很多種杯子,如:馬克杯、玻璃杯、塑膠杯、保溫杯、冰霸杯......等,但我們不可能為了認識杯子,而去記這麼多的細節,我們最後看完這麽多杯子,只會記得這些都是杯子。未來再看到類似杯子的東西,我們就可以認出這是杯子,而不是綠豆糕或稿紙。

而物件導向也是一樣的,會有類別 (class)與實例 (instance)。類別是抽象化的型態,是足以代表實例的特徵,你可以稱之為模型,也可以說是理型,甚至說它是概念,它是不存在於現象世界的。而實例是類別具象化的真實物體,它是真實存在的,擁有多樣化的差異,但被人類歸類於同一個類別之中。因此我才會覺得,物件導向是一個模擬真實的方式。

五、相關文章

留言