2014/11/29

Design Pattern 讀書心得

  Design Pattern 方面的書讀了兩本,可能是資質太差,總覺得沒有讀的透徹,比對實際工作上設計的系統才有較清晰的領悟.也利用時間將一些心得整理出來:

  • OO(Object Oriented)基礎  : 抽象,繼承,封裝,多型這些基本觀念都不清楚那就不用再談什麼 pattern 了。
  • 有了OO基礎不代表就能自動設計出有彈性,可再利用及可維護的系統。
  • Design Pattern 告訴我們如何組織類別及物件,用來解決特定的問題,因此可以減少實務操作,直接運用可行的 pattern。
  • 將變動的部份封裝,多用合成,少用繼承。
  • Factory pattern :分為factory method 及abstract factory ,其目的是用來將物件的建立封裝起來.factory method 用的是繼承,將物件的建立委給次類別進行。abstract factory 用的是物件合成,物件的建立實作在工廠介面的方法中.factory pattern 提倡鬆綁,以利降低程式和具體類別之間的相依程度。
  • Decorator pattern : 動態地將責任加於物件上,裝飾著提供不同於繼承的另一種選擇
  • Strategy pattern : 將不同演算法個別封裝,就可互相替換。
  • Command pattern:將發出需求的物件與接受(執行)需求的物件分割開來.其它用途:佇列請求/日誌請求。
  • Adapter pattern : object adapter及 class adapter分別使用合成及繼承.這兩種方式在彈性上有其差異。
  • Facade pattern : 提供複雜系統一個簡單的使用介面。
  • Template method pattern : 將演算法骨架定義在一個method中,而演算法會用到的一些method則定義在次類別中。Ex: Arrays.sort(), JFrame.paint().
  • Composite pattern : 將物件合成樹狀結構,用來呈現"部份及整體"的階層關係。客戶端可以一視同仁地對待個別的物件及物件合成的結果。
  • Iterator pattern : 此模式讓我們取得一個Collection中的每一個元素,而不需將collection中的實作透露出來。可以使用 java.util.Iterator, 也可自行實作。

2014/11/16

Python 與 Ruby 的心得

  因為工作的關係這陣子與Python和Ruby 有了相當程度的接觸與運用,和之前自己比較熟悉的Java自然會拿出來比較一番。這兩個 Script language 本質上當然和Java不同。但它們可以做的事大方向上是相同的,只是偏好上的不同。單就語法上來看,我比較喜歡Ruby。但就應用廣度來看Python就比較吃香,例如:OpenStack , Django和Blender及Maya等一些3D建模軟體的應用。相對來看Ruby在資源上真的比較不足。只是因為Sketchup 3D 建模軟體中的plugin 使用的語言是 Ruby,讓我有機會接觸到它,也因此去了解了它在Web Application 上的framework Ruby on Rails.在台灣Ruby真的相對來說使用Ruby的人及公司真的很少,在技術人力的尋找會比較困難.但單就技術上的學習來看其實它很容易學習,只要有其它語言的基礎,真的不是什麼難事.

  Python用了一陣子下來,個人覺得其語法的縮排雖然是為了精簡程式碼,省去括號的使用。但這也是常讓我困擾的地方,其它方面倒是沒什麼意見。因為OpenStack 的關係,現在企業開始有一些Python及OpenStack 的人力陸續開出來.

Ruby 語法上真的很吸引人,短短兩三天它就讓我著迷。若不是工作的關係真的不會想主動去學它,但學了就會愛上它,只可惜它的競爭對手太多了,近年來Scala及JavaScript 的火紅多少影響它的發展。特別是JavaScript ,在Node.js 技術出來之後讓Web 前後台開發的語言統一了,這真是Web 開發工程師的一大福音.

接下來列幾個自己覺得Ruby 語法對學過其它語言轉過來的人要特別注意的地方:

語法中程式區塊省去括號的使用:

if ....
    puts 'Hello'
    puts 1+2
end

class  Car
    def run
    end
end

case ...
   ...
when ...
   ...
end

for num in (1..3)
    puts num
end


字串與數字的串接 : 

irb(main):001:0> s1 = 'Hello'
=> "Hello"
irb(main):002:0> puts s1 + 100
TypeError: can't convert Fixnum into String

irb(main):003:0> puts s1 + 100.to_s
Hello100
=> nil

就以上的程式片斷來看,和其它語言不同的是數字與字串不能直接串接, 需要先將數字轉成字串.

陣列元素型態與相加:
    Ruby陣列中的元素可以是不同資料型態
    Ruby兩個陣列可以使用加號(+) 直接串接形成一個合併後的新陣列

類別/繼承/存取控制:
      class Child < Parent
           def print
                puts 'I am Child'
           end

           def dump
           end

           private : dump

      end
     
      Ruby 的類別沒有多重繼承, class 間的繼承使用一個小於(<) 符號,夠簡單也夠簡潔. method 預設是 public ,不需像Java那樣前面加個 public 來宣告. 但 private method 就得特別宣告

變數:
     Ruby 變數不需要宣告型別,但變數名稱第一個字元卻可以很容易區分其範圍(scope)

$ 全域變數 (global variable)
@ 實例變數 (instance variable)
[a-z] 或 _ 區域變數 (local variable)
[A-Z] 常數

註解(comment):
     單行註解使用 # 開頭
     多行註解使用 =begin 開始, =end 結束,這點倒是不太簡潔

Ruby 還有一堆方便簡潔的語法, 等有空再整理,也當做自己的備忘錄.