:::

論文進度報告(2010/7/11)

image

先來講一下進度報告好了。一樣地用一張表講完目前進度:

類別 應完成 已完成 已完成百分比
Model 100 54 54%
View 73 0 0%
Controller 9 0 0%
總計 182 54 29.7%

這是程式寫作到第21天的進度,已經完成了1/4,而核心的Model部分也做完了一半,可喜可賀。

image

不過現實層面是預定的專案進度是做不到了,所以日期必須往後順延。程式寫作的時間從15天延長到45天,可能到8/24才能有展示可以看了。詳細的資料就請上KALS Wiki去看囉。


強大的Collection

最近又學到Collection跟Iterator的技巧,跟上次的進度報告中提及到的Generic Object(其實也沒講到多少) 搭配使用之後,便可以應用到一般Model中許多常用的類別。

Collection(集合)是一種陣列的強化版本,不僅可以做到原本陣列大部分可以做的事情,還可以控制集合成員(members)的變更,並且實作延遲實體化(lazy initialization)的技巧。搭配Iterator之後,Collection還可以放進foreach去跑。只能說是好用到一種令人感動的境界,而且其實許多類別都是一種Collection,當初我太小看Collection這種工具了。

除了參考原本書中介紹的Collection來撰寫,並讓他擁有Iterator的功能之外,我又將之進化成一些特色類別,並組成我自己的toolkit。以下隨便介紹,看不懂很正常,反正一般只要知道有八成的類別都可以拿來套用這些toolkit就對了

Generic Collection

image 

將Generic Object作為成員,並設定預設載入的資料表與成員類別,可以對集合的成員進行Update的動作。

Generic Attribute Collection

image 

繼承Generic Collection,並將Generic Attribute Object作為成員。叫做Attribute的原因是通常這種集合是附屬於某個主物件底下,作為額外的屬性。例如Annotation會有很多額外的feature(特徵),而這種屬性都會附帶有「type_id」,然後還有一些特性。

Generic Association Collection

image

繼承Generic Collection,並預先載入指定資料表中關連的資料表的資料,並且能夠修改指定資料表的關聯內容。


Benchmark Fever!

image

如果眼睛很尖的人,應該發現到開頭那張Unit Test的擷圖中多了一個項「Benchmark Time」。Benchmark是測試速度或是評分時常用的技術,CodeIgniter有著強大的Benchmark功能,可以記錄任何程式執行時所耗費的時間。因此我把它結合到CodeIgniter的Unit Testing當中,以便分析每一項測試所需要耗費的時間。當耗費時間過久時,該項測試可能就有些問題囉。

image

再搭配CodeIgniter的Application效能分析,就可以自動捕捉到多項細節資訊。包括URI字串、使用類別/方法、記憶體使用狀況、基準測試(benchmarks)、GET資料、POST資料、以及資料庫查詢的各種語法。特別是資料庫查詢的細節,光靠這個就能找到許多無效或錯誤的查詢,而修改許多錯誤。

由於之前寫到Annotation_scope_collection時,發現效能異常地慢,於是試著把Benchmark加入Unit Test,並從中找出最有問題的測試點來改善,最後才抓到不能一直依賴CI->load->library()來當做include_once讀取類別這個問題。改善之後我可以看到執行速度大幅縮短,然後我又試著加入Cache的機制,結果速度又縮短了0.x秒,實在讓人很開心。於是一不小心就會沉迷在改進程式以縮短執行速度這個挑戰極限的樂趣中。

現在幾乎每種測試都能在1秒之內跑完,其實不要慢得太誇張,差個0.x秒也就沒什麼大礙了。


本來想草草地寫,結果也寫了好一段時間。那這次就這樣啦,詳細進度可以追蹤我的噗浪,來繼續寫下一階段。