2014年12月21日 星期日

初探 Python Decorator

最近剛巧聽到朋友介紹 Python 的 Decorator。
一開始以為是指 design pattern,後來才發現原來是Pyhton特有的一種語法糖,其實有點合成函數的味道。

舉例來說,有一個取得商品價錢的函式:
def get_price(product_id):
    ...
    return price

但是為了慶祝聖誕節,有的商品打八折,有的商品則是大打五折
而該打幾折的程式是由另一個函式判斷:
def christmas_discount(func):
    discount = get_discount()
    def get_christmas_price(product_id):
        return func(product_id) * discount
    return get_christmas_price

這時我們可以用這兩個程式合成一個新的程式:
get_price(21) // ==> 200
get_price = christmas_discount(get_price)
get_price(21) // ==> '160'

但是我們可以用 decorator語法糖「掛上」合成的函式:
@christmas_discount
def get_price(product_id):
    ...
    return price

get_price(21) // ==> '160'

Functional Programming vs OOP:

在OOP中也有所謂的裝飾者模式,具體的講解可以參考 良葛格的文章
這裡就可以看出:原本許多在OOP需要特別實作的設計模式,在Python或JavaScript等函數式語言中都能夠很直觀、輕鬆的被實作出來。
常見的Factory模式也是一樣的道理,在JS中能夠被輕易的實作。

2014年12月19日 星期五

Git 小筆記

跟 git 太不熟了,在這邊堆放一些常用筆記

Branch:

git branch //看local branch(星號代表現在所在的branch)
git branch <bar> // 新增 "bar" branch
git branch -D <foo> // 刪除 "foo" branch


Checkout:

git checkout <bar> // 切換到 local 的 "bar" branch
git checkout -b <NewBranch> // 新創一個 branch 並同時 checkout 它
註:如需從origin拉下一個branch,需在本地創一個branch,checkout 後再拉 "origin/branchname"。eg. "git pull origin test"


回溯:

git log // 取得過往的commit,其中以 hex code 為 id
git checkout <hex code> // checkout 過往 commit
git show // 顯示當前所在
git checkout <branchname> // 回到 local 最新commit,eg. "git checkout master"


Tag:

git tag -l // 列出所有 tags
git tag -a <tag name> <hex code> // 針對某一 commit 打 tag
git push origin --tags // 上傳所有本機 tags 到 遠端