與工研院合作的計畫中,由Silver(蘇友信)與我Brian(張凱霖)共同完成開發。在開發過程中,採用agile method方式來開發,這裡
跟大家分享開發中撰寫header 與 pseudo code的經驗。
Header
首先是header的部分,撰寫header的目的是簡單的描述該unit所負責的工作是什麼,unit指的可以是class或是method。例如:
我們從scenario與系統分析中可以找到classes與各個class的operations (method),所以我們會撰寫class
header與method header。Class header描述class的作用與目的是什麼;同樣地,method header描述該
method的目的,另外也描述傳入的參數與回傳值各自所代表的意義。透過header的描述,維護時能快速從header了解該unit所負責的工
作。
Pseudo code
Header只是對於unit簡單的描述,而pseudo code則是對unit 中source code的詳細描述。嚴格來說,agile
method方法論中並沒有明確提到需要pseudo code,而老師希望我們每份程式碼都必須要有pseudo code。Pseudo code
不妨把它想成是abstraction level較低的註解,但是又比source code的abstraction level高。除了描述
source code本身的意義之外,針對邏輯分支,演算法以及所使用到的資料結構也都必須用pseudo code詳細描述。不過並不是可以真正執
行的source code,而是幫助了解source code的工具。
撰寫pseudo code的時程
那麼在哪個階段該寫pseudo code呢? 我們是在class 與method interface定義完成後,尚未撰寫source code
之前就要先執行,這樣的目的是希望在實際coding前,先思考程式的做法與邏輯,並且決定將要使用的資料結構及演算法。當pseudo code撰寫
完成,程式的結構,邏輯與流程,已經深植在我們腦中,這時剩下的工作,只要根據pseudo code,逐步撰寫實際的source code即可,經
驗上來說,pseudo code完成後,表示主要的結構邏輯都已經事先定義完成,所以撰寫source code並不必花太多的時間。
作專案的過程中,寫header與pseudo在一開始的時候雖然會不適應,一旦習慣後便發現是有好處的,除了幫助我們修改程式時,可以快速回想當初思
考邏輯,當專案送交後,之後維護的人也可以 快從header與pseudo code了解程式的設計架構。總括來說,Header與
pseudo code有以下好處:
1.可以先思考程式的邏輯與結構
當我們找出需要哪些class與method後,便撰寫header描述他們的作用。
而在撰寫source code前,先完整的思考程式作法與結構,撰寫成pseudo code,如此一來,對於某個class或method在系統中
扮演的角色有全盤的了解,可以提高對程式的掌握度。程式邏輯與執行的流程,會透過設計pseudo code的過程,在腦海中建構起來,之後實際寫
source code時比較不會出現嚴重的錯誤。
2.程式即文件
Header 與Pseudo code並不是source code的附屬品,而可以看成是一份單獨的文件,但是卻又包含在同一份程式中,因此可以省
卻開啟其他文件來了解程式的麻煩,透過直接閱讀程式的header 與pseudo code來進一步了解程式,以減少不必要的文件。
3.保有programmer當初的思考邏輯
再開發過程中,有時候我們發現程式有問題,要修改程式,而程式可能寫了一段時間,我們可能也不太記得當初是怎麼思考的。但是透過pseudo
code,可以很快的回想到當初設計時的邏輯,而不用直接看繁雜的程式碼來了解程式。這點對於日後的維護上是相當有幫助且快速的。
Header 與Pseudo code的同步
需要注意的是,Header 與 Pseudo code並不是寫完之後就不再更動,而是當source code需要修改時,必須也要跟著修改,避免
造成與source code不一致的情況,而影響到日後的維護。
利用Header與Pseudo code維護程式的流程
Header與pseudo code是為了讓日後的維護方便,當程式有某個unit需要修改時,通常會有以下的流程:
1.根據class名稱與class header的描述,找出需要修改的class。
2.從欲修改的class中,根據method名稱與method header的描述,找出需要修改的 method。
3.再看更細節的pseudo code來了解程式,找出要修改的部分,並同時修改pseudo code 與source code,保持它們的一致
性。
撰寫Header 和Pseudo code與agile精神牴觸 ?
可能有人會認為,agile method就是強調要快速開發,再花時間寫pseudo code就無法達成快速開發的目的,與agile精神互相牴
觸。但其實軟體生命週期應該是長期的,不僅僅著重於實作階段的快速開發,後續如何維護,如何讓軟體繼續活下來更是要考量的課題。開 階段花點心力
與時間成本撰寫header與pseudo code,若能讓軟體的可維護性更提高,那何樂而不為呢?
Header 與 Pseudo code 實際使用經驗
在我們做工研院的專案時,時常面臨到的是需求的變更,雖然程式是自己開發的,但經過一段時間難免會淡忘當初的作法,而header與pseudo
code帶給我們在開發時最直接的好處,就是幫助我們快速了解程式,節省了追蹤程式的時間,假使沒有header與pseudo code,我們必須直
接從source code來了解程式,會花較多的時間,而我們根據上述所提到維護程式的流程,來找到要修改的unit,透過pseudo code了
解程式,再進行維護,就我們經驗上來看,大致上只需花上原本1/3的時間,讓我們省下許多時間與心力。
然而,這種方式在開發初期的時間會拉的比較長,因為要將思考後的程式邏輯結構,撰寫成pseudo code,而碰到的困難處在於,如何讓
pseudo code描述發揮它的效用,讓之後的維護者可以透過pseudo code清楚了解程式,又不至於像source code那麼繁瑣。因
此我們會採用英詞中句的方式來撰寫,但是對於某些程式語法也會予以保留,例如:if,for等程式語法。另外,在source code與
pseudo code的同步上面也是要比較注意的,有時候會發生不一致的情況,pseudo code跟source code是密切相關,例如:我
們要改某個資料結構,那麼pseudo code與source code兩邊都要跟著一起改,維護它們的一致性,這部分只能養成習慣,自己多加留
意。
而當臨時有錯誤或需求需要修改,並不會讓我們覺得很惶恐有壓力,因為header與pseudo code清楚定義了程式結構與邏輯,讓我們可以很快且
容易瞭解程式的語意,因此我們覺得header與pseudo code是有用的工具。