追蹤

宗宗大學

喜歡關注科學、哲學、社會、政治、教育,未來想當一位抱著理想的科學家,期許社會能夠進步。

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


 

一、簡介

 

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

 

二、評分

 

  • 程式作業: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)和釋放 (free),變數的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)。類別是抽象化的型態,是足以代表實例的特徵,你可以稱之為模型,也可以說是理型,甚至說它是概念,它是不存在於現象世界的。而實例是類別具象化的真實物體,它是真實存在的,擁有多樣化的差異,但被人類歸類於同一個類別之中。因此我才會覺得,物件導向是一個模擬真實的方式。

五、相關文章


本文章發表於:課程

加入85

宗宗大學

國立中山大學 生物科學系

追蹤 384 鼓勵作者

喜歡關注科學、哲學、社會、政治、教育,未來想當一位抱著理想的科學家,期許社會能夠進步。

鼓勵作者

目前持有 Blink Coin: Loading..

選擇禮物


愛心

(Coin 10)

幫高調

(Coin 20)

咖啡

(Coin 30)

掌聲鼓勵

(Coin 40)

崇拜眼神

(Coin 50)

驚呆了

(Coin 60)

神人4ni

(Coin 70)

花束

(Coin 100)

鑽石

(Coin 300)

紅寶石

(Coin 500)

藍寶石

(Coin 1000)

黃寶石

(Coin 3000)


送出鼓勵



發表匿名文章不會出現你的大頭圖與名稱,你可暢所欲言,但文章內容務必遵守「佈告欄使用規範」!


回應

送出回應


想回應這篇文章嗎?也想發表文章嗎?
馬上登入來發表文章、追蹤作者、收藏文章或回應文章吧!

註冊 登入