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

2021年7月1日 15:50
imgur
一、簡介 學校:國立中山大學 課程:高等物件導向程式設計 (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高等物件導向程式設計 期中考 好讀版
三、老師評價
imgur
(江明朝) 我覺得江老師的學經歷蠻勵志的,大家可以去看他的專訪,因為他學士是管理科學,碩博士才是計算機科學,後來有去矽谷工作,最後才在中山教書。某種意義上,也算是中途有換過領域的學者,這和很多一路都是念相關科系的學者很不一樣。 教學風格蠻美式的,每堂課第一句話大概是『同學有沒有問題』,有時會問一些問題。雖然是進階課程,但前半段還是會講一些基礎的東西,整體內容上比較偏『基礎概念』。注意基礎不代表簡單,而代表運作原理。我覺得些基礎知識在『寫』程式上不見得有顯著的幫助,但在『設計』程式上幫助就蠻大的。因此老師會更著重在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)。類別是抽象化的型態,是足以代表實例的特徵,你可以稱之為模型,也可以說是理型,甚至說它是概念,它是不存在於現象世界的。而實例是類別具象化的真實物體,它是真實存在的,擁有多樣化的差異,但被人類歸類於同一個類別之中。因此我才會覺得,物件導向是一個模擬真實的方式。 五、相關文章 1. 物件導向程式設計|模擬真實世界的方式|江明朝
2. AOOP Homework source code
3. [筆記]109-2高等物件導向程式設計 期中考
4. [筆記]介面與實作、運算子多載、左值右值、參數傳遞、回傳多值|C++
5. [筆記]陣列與指標|C++
6. [筆記]類別、特殊函式、內嵌函式、函式物件|C++
7. [筆記]繼承模式與存取權限|C++
8. [筆記]多型與繼承的關係|C++
9. [筆記]static / const成員資料與函式|C++
10. [筆記]夥伴函式與類別、不夠朋友問題|C++
愛心
9
留言 17
文章資訊
87 篇文章340 人追蹤
共 17 則留言
國立中山大學 資訊工程學系
推一個 作業還算有趣
b1 作業裡面會埋一些小陷阱😎😎
國立中山大學 資訊工程學系
不要誤人子弟 = = 這課跟 OOP 幾乎沒有關係,到處都是指標亂飛 -by SCC
b3 可以多說一點嗎?不太懂為什麼這門課跟OOP無關?
國立中山大學 資訊工程學系
B4 你記得期中考考題? p+1, p+1-p? 這跟 OO 有什麼關係?
國立中山大學
熟悉的江佬最對味 幸好OOP跟OS都低空飛過
國立中山大學
江老的課不就是指標課嗎
b5 哦哦哦 其實上半學期都還沒正式進入OOP,下半學期才會學到類別、繼承、多型、STL。 不過也不意外,物件導向的基礎是程序導向,所以上半學期都是程序導向的概念。 不過老師很愛考指標是真的www
國立中山大學
hmmmm討厭指標= =
國立中山大學 資訊工程學系
B8 什麼叫還沒進入 OOP 啦XD 修一門課到期中還沒進入 OOP,這就好像你買一包餅乾半包都是空氣。 另外,物件導向不是只有「封裝繼承多型」,物件導向是一種思維,影能夠說是一種態度,為什麼要 OO,怎麼 OO,OO 的 Design pattern ... 最後說道 STL,STL 所面對/處理的問題是 ADT,不是 OO。 這兩個所關注的面向又有點不一樣,如果把 OO 再拆成 OOD 跟 OOP,還是有各自不同的地方。 反倒是 Bjarne 在 1991 重新寫的 What is "Object-Oriented Programming"? 可以多讀一下 [1] SCC [1]
國立中山大學 資訊工程學系
B8 也順便題一下你寫的作業(上面 GitHub) 你修完門課,你覺得很有收穫的話,要不要重寫你的作業 XD (如果你想練功的話) 在這些作業裡面,你可以關注一下 Coding style GNU tar std::regex (我知道這很慢,也有人在提議放到 C++23,詳:P1433R0) SCC
b10 謝謝你的補充,當然說OOP=封裝+繼承+多型,這樣太狹隘,不過這樣的說法很簡潔易懂。 你提到ADT,其實我總覺得ADT和OO有一部分很像,實體到模型的抽象過程,不過ADT的實現不一定要OO。 好,有空我在看XDDD
b11 作業咩...我就爛👍😊 實作的部分我還是菜蟲掉滿地的狀態🐛🐛🐛,還在努力中www 我就覺得SCC很眼熟,之前有看到你的github。
國立中山大學 資訊工程學系
b12 我不同意 oop= encapsulation+inheritance+polymorphism 欸 這三個是 oo 的三大觀念,但是oop要那個語言有支援這樣的語法、語意,寫出來的程式我認為才是oop SCC
b14 從你回應中,OO似乎是base class,而OOP似乎是derived class?因此OOP比OO有更多的定義,故那個等式的確不夠完備,但也不至於錯的離譜。
國立中山大學 資訊工程學系
B15 well, 1. 「等式不完備」->「描述不夠精準」 2. OO 有著比 OOP 更大的範圍,用 OOA 描述的話:「OOP is an OO; OO has an OOP」 SCC
b16 可以,認同你這樣的說法