2010年11月27日 星期六

Design pattern學習心得筆記(未完待續)

軟工上了一學期的課,每人輪流報了23個Design Pattern,但還是模糊不清,當然最終還是覺得靠自己最實在,以下是看了良葛格的Design Pattern後,所整理的最最重點,雖然他寫得不錯,但總覺得內文有些是翻譯過來的,非常不順...但還是感謝他!!

良葛格的Design Pattern連結

看了前三個Factory系列,抓到了一個Factory的重點,那就是Logic Hiding,怎麼說呢,其實聽到大部份人回應Design Pattern都會說,UML圖有看沒有懂,那是因為太強求我該如何用它才會這樣,其實我的想法是有fu就好了~~

Design Pattern具有三個大方向,分別是Creational Patterns, Structural Patterns 與 Behavioral Patterns 三種。

 

下面是關於第一種 Creational Patterns,也就是專門用來創造的,說白一點,就是在java裡的xxx x = new xxx()的new xxx() ==> 總之就是建立物件時候用的啦@@。

====================

  • Factory呢,我認為只要它出現,就會有敘述,factory.getXXXX(),或是xx.xxx(factory);。然後abstract factory是指在class這個觀點,而factory method只是一個class中,其中一個未實作的method罷了。其實主要的目的是將"確定要用的型別"定義在factory裡面,而這些型別一律採用interface的繼承方式(無論哪種語言啦,都是指最上層那個代表概念的介面就是了);所以當把型別繼承interface並且實作完成以後,就到factory內修改成(加入)這個型別...結束。
  • Builder有點麻煩,我自己也沒看得懂,反正就是和abstract factory差不多,不過他會與其它必須的"型別相依",如果有強者看見我的拙著,會的請用更簡單的話教教眾生吧,感謝...。
  • prototype就直接想成我們平常不是都用new xxx()嗎,但是這個new 的成本太大了(配置記憶體、加入當時環境並運算...反正就new一次要花很多時候在cpu上),這時候呢,我們就把原有已經new好的相同型別的,直接clone一個出來(也就是xxx的記憶體直接1對1複製,不用再算有的沒的),夠簡單吧。
  • singleton說明白點就是只準給你一個物件(實體),你再怎麼new xxx(),它回傳的指標都是一模一樣,酷吧,這個簡單到我偷笑了。

 

很快的就進入第二種 Structural Mode...

====================

  • Adapter就是把你要的項目包起來,以更通用的介面、或是更快捷更少量的實作達到更簡單使用的目的,所以UML圖裡面,才會使用一個target的介面,然後一個實作這個target介面的adapter包住你要用的項目adaptee。
  • bridge模式的重點在於將程式邏輯,和表現部份(ex: I/O)抽離,因為表示部份可能因為不同的版本而改變,但程式邏輯並不和這相關,當版本改變時又得重寫那不就哭哭了嗎,所以先做一個表現層次,接著在邏輯層次呼叫這些通用的表現介面,假設表示類別需要做修正,只需新增實作的表現介面即可。
  • composite的意思就是一個容器能儲存很多單一的個體,但是這個容器與個體的型別都必須實作一介面的方法,容器可用此方法作用於容器內的這群個體,而個體也能用此方法對自己作用,因此composite的關鍵在容器儲存的型別是介面型別,但事實上是儲存個體的型別實體,看起來很像是複合的。
  • decorator意指一的個能當作一個層次,然後新的功能就繼承上一代,說實在的這與傳統的想法沒有不同,就是一件事情一個層別負責,但它較具特色的部份是利用上一層級產出的資料加工,另一個重點是一般繼承不會將上一個介面放入自己的成員中。decoretor與composite很容易搞混,差別在於composite能讓物件具有獨立性或複合性,而decorator能在維持原有介面下依然能延展新的能力。
  • Facade提供更高層級的介面,它將複雜的實作藏起來,只提供更簡易的內容,簡單的說,就是再架一層更簡單的介面,然後此介面中再實作較多細節的內容。
  • Flyweight很簡單,只是將可以共同的物件,能不重覆,就不重覆的方式,我是覺得它比較不在乎速度,比較在乎容量~~畢竟做出一個新物件,就算拿去比較最快也得要O(1),但它的容量卻省很多~~
  • Proxy就是代理的意思,若是a物件的代理,則若要用到a時,請找proxya,proxya一定能傳達訊息給a,但是之中會做點事情,這個事情端看使用者如何定義,因此重點是proxy想代理的功能才是重點。

 

很快的就進入第三種 Behavior Mode...

====================

  • Chain of Responsibility就是將一連串的判斷行為拆成像鏈子的一串class,每個class都處理不同情況要反應的事,所以不用因為加一個或減一個,而動到很多結構。
  • Command的意義在於物件的加入和執行抽離,可以動態加入動作,再選擇執行的內容,不需要改很大。
  • Strategy的用意是在獨立不同的演算流程(演算法),來源是一樣的,它的流程是不同的,但演算流程之間是相似的,它與Command很像,但我自已的感覺是Command是依對象的不同,回應不同的請求,但是Strategy則是同樣的請求,但最後的處理與回應相似,只有中間的流程是不同的。
  • Template很像是限定好介面,然後等得之後實作它的內容,但它強調部份方法是實作時再進行,而一些已經預定的流程會先實作好,這樣就是在製作一個樣板的動作,好讓之後的人有個模型可以跟隨。
  • Observer在於建立物件集合發生變化時的反應,簡單的說可以視為訂閱者,能監看物件集合的內容,有何種變化該進行怎樣的通知等等。
  • Mediator能視為居中協調的角色,所有獨立物件之間不應該知道有其它人的產生,每人只需對Mediator負責即可,然後Mediator再視情況改變每一個人的狀態即可。
  • State是將原來相依性很強的結構邏輯拆開,讓State的子類別實體去決定該將旗號交給誰,而不是一個單一的個體控制全部,但怎麼變都是讓狀態設定為其中State一個子類別的實體罷了。

2010年11月23日 星期二

LCS 最長共同子序列(未完待續)

Longest Common Subsequence

  • 原來以為這是一個演算法,但它其實是個LCS的問題,目的在找出兩個以上的字串中,最長的共同字串。
  • 子字串與子序列的差別:子字串必須是字串中的連結部份,子序列則不是必需。

問題的定義

  • 有兩個長度為m的字串S,與長度為n的字串T,我們必須找到S與T中的最長子共同子字串,一般稱之為k共同子字串問題。給定一個字串集合S = {S1, ..., Sk},其中|Si| = ni且Sigma ni = N。2 ≤ k ≤ K,最長字串最少要有k長度。


解法有兩種,分別為suffix tree與dynamic programming,其中

  • suffix tree的量級分析為 O(n + m)
  • dynamic programming的量級分析為 O( nm )

2010年11月22日 星期一

cocoa入門(一)

應用程式、視窗與View的關係
================================================
  • NSWindow座落於NSApplication與View之間。
  • NSApplication可以管理多個視窗並追蹤它們的目前狀況。
  • 總之NSWindow管理一堆在它底下的View。
  • cocoa是以左下角為它的視窗定位座標原點,而carbon是在左上角。
製作GUI程式的心得
================================================
  • 在用interface builder讀取class時,別管錯誤訊息。
  • 類別內的成員連外介面的,會叫IBOutlet;介面連進來對應的方法會叫IBAction。
  • 用內建的document做第一個入門視窗程式很簡單,它的文件名稱為"Cocoa Application Tutorial",直接在文件的Search上搜尋就會有了。
  • 原來內建的Icon設計程式是在/Developer/Application/Utilities/Icon Composer就有了。

2010年11月21日 星期日

automator心得

網路automator的心得很多,但我看了其實也沒很了解

以下我用自己的話來說明automator的初步用法

=====================

先講工作流程、應用程式與服務三項吧!!

  • 工作流程
簡單的說,就是一個像word中的doc檔,只是存著下次開啟用的

  • 應用程式
可以把上述的工作流程儲存成一個應用程式,好處是你要用就開
不需要再經由automator執行

  • 服務
當編輯完後存檔,就會自已跑進~/Library/Service的目錄中,它
其實是座落於背景的服務(但還沒執行),例如:









這裡我選"任何應用程式"的"文字",接著我又選了文字套件中的
朗讀文字,目的是將輸入的文字唸一次,接著再存檔成speaker。
這裡的意思代表我能在之後的任一個應用程式中,使用到這一項服務。

假設在safari中,我選取一段文字,接著選擇左上角的safari ->
服務 -> speaker(存檔時的名稱),這樣就能將選取的文字唸出來了
。另一種方式是將文字選起來,再按右鍵選服務項目也可以。




新的開始@@

快畢業了,也該開始給社會一些貢獻!!

一星期來寫一篇吧@@