高等物件導向程式設計
Advanced Object-Oriented Programming

元智大學 94-2 課程備忘錄 (3學分)

侯捷

請注意:此為備忘錄,不是呈現完整教材或學習討論的地方。

每周四 18:30~21:20
工程一館1401B

講義投影片( 2006/05/31 更新)


說明
由於臺灣習慣將 programming 譯為 "程式設計",使得這門課容易被疑惑:究竟是偏重中文課名的 "設計",還是英文課名的 "programming" 呢?答案是:我這門課將偏重於相對高階的 "設計"(design)而非相對低階的 "編程"(programming)。我將以 "design patterns" 貫穿本課程,主要講 GoF's 23 patters,並儘量抽取知名 libraries and/or frameworks 如 MFC, STL, Java Library, Boost, Loki 的源碼為解說對象。

教材
老師自編講義,同學自行列印。

更多資料
   1.《Design Patterns》by Gamma, Johnson, Helm, Vlissides. A.W., 1995.
        中譯本《高等物件導向設計》, 葉秉哲譯, 培生, 2001.
   2.《Refactoring to Patterns》, by Joshua Kerievsky. A.W., 2004.
         中譯本《重構 - 向範式前進》, 侯捷/陳裕城譯, 眳p, 2006.
   3.《Head First Design Patterns》by Elisabeth, Eric, Bert, Kathy. Oreilly, 2004.
        中譯本《深入淺出設計模式》, 蔡學鏞譯, 學貫, 2005.
   4.《???》, by 結城浩 (日)
        中譯本《Design Patterns 於Java語言上的實習應用》, 李于青譯, 博碩.
   5.《Thinking in Patterns》, by Bruce Eckel.  (www.BruceEckel.com) 網路開放, 尚未出版

成績評量:
每堂課(每星期)最後15分鐘評量。平時作業 5 個,佔總成績 50%。期末作業 1 個,佔總成績 50%,需上台簡報並接受口試,未及時繳交或未到場者 0 分(不接受補繳)。過去有多位同學因疏忽或不在乎而得到 0 分,甚且導致大四同學無法即時畢業。慎之哉慎之哉。

期末作業:
4~6人一組,期末口試時交出程式碼+書面報告(均以email方式提交,於口試前一天傳送),並推派代表上台以投影片進行簡報。文件+簡報佔很重的評分比例。要的不只是各位能夠把程式寫出來,還要能夠流暢地讓別人知道你的想法(以書面方式,以口頭方式...)。

周次 日期 時數 內容 備註
1 02/23 3 課程介紹,遊戲規則,書籍評介,
簡例:
Template Method
 
2 03/02 3 UML class diagrams
Classes in C++/Java
Generics in C++/Java
OOP terms : inheritance, composition, delegation, aggregation, polymorphism...
習題於出題之下一周上課日中午 12:00 之前遞交到 portal.

評分標準見下表

3 03/09 3 OO Principles
Iterator

 

習題1
Main.java
Book.java
BookShelf.java
要求寫出
Aggregate.java
Iterator.java
BookShelfIterator.java
4 03/16 3 Adapter 習題2
Main.java
FileIO.java
file.txt
要求寫出
FileProperties.java
(a Class Adapter) 和
FileProperties2.java
(an Object Adapter).
執行時獲得:
newfile.txt
5 03/23 3 Reference Counting
加分題:
分析 Java String class的使用特性和對應源碼,並畫UML
6 03/30 3 補充(複習):
new[], delete[], const memfunc...

Flyweight
Proxy (for String)

注意:雖然習題3未有以下測試,但請想想如何解決以下問題 (假設它出現在main最後):
char* p = &(s3[0]);
String s5(s3);
*p = 'X';
cout << s3 << endl;
cout << s4 << endl;
cout << s5 << endl;

習題3
整合講義中關於
ref. counting + proxy
技術,寫一個具備這兩種機能的String.

已知
ex3main.cpp (測試碼)
要求寫出
RCPStr.h

7 04/06 3 習題3測試平台的設計.

Proxy (for std::vector<bool>)
Smart Pointer
RCObject+RCPTR

Composite

習題3 (續)
(1) 沿上周習題3,完成 proxy's address-of op.
已知
ex4main.cpp (測試碼)
要求寫出
RCPStr.h

習題4
給予:
Main.java
FileTreatmentException.java
要求寫出:
Entry.java
Directory.java
File.java

8 04/13 3 Decorator
Observer

回顧目前所學. Q/A

 
9 04/20   期中考,停課
10 04/27 3 Observer
Template Method
Strategy
習題5
給予:
Main.java

要求寫出:
NumberGenerator.java
RandomNumberGenerator.java
Observer.java
DigitObserver.java
GraphObserver.java
11 05/04 3 Command
"Undoable" APIs in Java

Command 示例:
Command.zip
By 結城浩,
取自 http://www.hyuki.com/dp/index.html

Undoable 示例:
UndoRedoTextArea.java
UndoDrawing.java
By John Zukowski,
取自 "Code Project"

所有平時作業於 05/03 23:59 前交齊,逾時該題 0 分。

期末作業
寫出一個繪圖程式,可繪直線、橢圓、矩形三種形狀。運用 Java Undoable APIs 實踐 "undo" 功能。並徹底分析 Undoable APIs.

提交:
1.程式(.java & .class)
2.文件,解釋程式並分析 Java's  Undoable APIs

12 05/11 3 老師被毒蜂螫手,身體不適就醫,請假一次。  
13 05/18 3 Factory Method/Object Factory
Singleton
Abstract Factory
 
14 05/25 3 State
Builder
Facade
Mediator
Bridge
 
15 06/01 3 Bridge (continued)
Memento
Prototype
Chain of Responsibility
Visitor
點名到者(以下為
選修名單上之序號):
4,5,7,11,12,13,14,15,17,18,
21,25,28,31,32,34,36,37,41,46,
47,49,51,56,57,58,59,60
16 06/08 3 期末作業報告與口試
#07~#12組
每組15~20分鐘
17 06/15 3 期末作業報告與口試
#01~#06組
每組15~20分鐘
18 06/22 3 期末考,停課  

作業評分標準:

準時 可正確執行 良好註釋 符合架構 有抄襲痕跡
20% 40% 20% 20% -60%

期末報告評分標準:

達到功能 註釋 文件 上台
表現

準時

抄襲痕跡
20% 20% 40% 20% -20% -60%

簡報+口試時按組別次序逆序進行,亦即最後一組第一個上場。

 

■期末感言

學期內老師已經三番兩次三令五申地告訴同學,我非常重視期末作業的文件程式碼註釋,文件和註釋所佔的成績份量遠多於程式本身。結果只有1,6,11三組的報告體現出文件的價值,幾乎沒有任何一組程式註釋達到「尚可」的水平,多只是局部而窄化的註釋,沒有大局、廣泛、深入而組織化的說明。這樣的programming習慣會令各位進入業界時招人輕視。你們的文件寫作能力令人十分擔憂。以各位期末交出的文件和註釋而言,我打賭各位花這麼多心力領悟的Java Undoable APIs及撰寫出來的程式半年之內忘光光。那麼今天的努力不是全白費了嗎?我曾勉勵各位,你們要認真看待學生生涯中的每個作業,將它視為將來可以拿出手證明自己實力的東西。希望各位認真面對我的勸勉。

期末報告的成績分配如下:
程式功能 20%
程式碼註釋 20%
說明文件 40%
上台表現 20%
另再加上延誤、早退、個人表現等彈性加減

原本總成績有15人不及格,老師不忍各位同學的付出化為虀粉,將 55 以上者調整為60,再將接近但不足55而平時作業均交齊者調整為60。對於不及格的同學,望你們再接再勵,不要氣餒,檢討自己做學問的方式以及態度。那麼,塞翁失馬焉知非福。

-- the end