你好,我是陳浩,我名多爾多house.之前呢我寫過一篇文章叫做python修飾器的函數式編程。
那這種模式呢可以很輕松的把一些函數啊裝配到另外一些函數上。
讓你的代碼呢更加簡單,也可以讓一些小功能性的代碼復用性更高。
讓代碼中的函數呢可以像樂高玩具那樣自由的拼裝。
所以說一直以來呢我都對修飾器這種編程模式啊情有獨鐘。
那這節課呢我們就來聊一聊構元里面的修飾器編程模式。
那如果你看過我剛說的文章呢,就一定知道這是一種函數式編程的玩法,也就是用一個高級函數來包裝一下。
那多嘮叨一句,關于函數式編程呢,我之前還寫過一篇文章,叫做函數式編程。
參考資料:https://51gx.top/detail/265那這篇文章呢主要是想通過詳細介紹從過程式編程的思維方式,過渡到函數式編程的思維方式,從而帶動更多的人玩函數式編程。
所以說如果你想了解一下函數式編程啊,那么呢你可以點擊文稿里的鏈接啊,閱讀一下這篇文章。
其實啊構語言的修飾其編程模式,也是函數式編程的模式。
不過呢要提醒你注意的是,構元的糖不多,而且呢又是強烈性的靜態無虛擬機的語言。
所以說啊你沒有辦法做到像java和python那樣寫出優雅的修飾器的代碼。
當然也許是我財出學淺。
那如果你知道更多的寫法呢,請你一定要告訴我。
在文稿里呢有一個簡單的事例,我們動用了一個高階函數decorator.在調用的時候呢,先把hello函數傳進去,然后呢它會返回一個匿名函數。
那這個匿名函數中啊,除了運行了自己的代碼,它也調用了被傳入的hello函數。
那這個玩法呢和python很像,只不過有點遺憾。
Go呢并不支持像python那樣的decorator與法堂,所以說在調用上有點難看。
當然如果你想讓代碼更容易讀啊,可以用文章里展示的寫法。
文章里呢還有一個計算運行時間的例子。
那關于這段代碼呢,有幾點,我要說明一下。
第一,這里呢有兩個sum函數,sum一函數呢就是簡單的做個循環,而sum二函數呢動用了數據公式。
第二,在代碼中呢使用了構物元的反射機制來獲取函數名。
第三,修飾器函數呢是time to some funk.那接下來呢我再給你講一個處理HTTP請求的相關例子。
我們先看文章里這段簡單的HTTP server的代碼。
在這段代碼中呢使用到了修飾器模式。
With server header函數呢就是一個decorator,它會傳入一個HTP handle funk,然后呢返回一個改寫的版本兒。
但這個例子呢還是比較簡單的,用with server header呢就可以加入一個response header.所以說這樣的函數呢,我們可以寫出好多有寫HTP響應頭的,有寫認證cookie的,有檢查認證cookie的,有打日志的等等。
下面呢我們再說一說多個修飾器的pipeline,前面講的go修飾器啊,在使用上需要對函數一層一層的套起來,呃,看上去呢好像不是很好看。
那如果需要的修飾器比較多的話呢,代碼就會比較難看了。
不過呢我們可以重構一下,在重構的時候呢,我們需要先寫一個工具函數,用來便利并調用各個修飾器。
然后呢我們就可以像文章里這樣使用了,那這樣的代碼也更加容易讀了,一些pipeline的功能呢也出來了。
不過呢對于go的修飾器模式啊,還有一個小問題,就是好像無法做到泛型。
比如說剛剛那個計算時間的函數,它的代碼呢耦合了,需要被修飾函數的接口類型,無法做到非常的通用。
那如果這個問題解決不了,那么這個休日器模式還是有點不好用的。
Go語言它不像python和java, python呢是動態語言,而java有語言虛擬機,所以它們呢可以實現一些比較變態的事兒。
但是呢go語言是一個靜態的語言,這就意味著類型需要在編譯的時候就搞定,不然的話就無法編譯。
不過呢購物員支持的最大的泛型是interface,還有比較簡單的reflection機制。
在這上面做一做文章呢,應該還是可以搞定的。
我在文稿里啊分享了我用reflection機制寫的一個比較通用的修飾器。
這段代碼呢動用了reflect點make fun函數,它創造了一個新的函數。
那其中呢他給的fun點call呢,調用了被修飾的函數。
那關于構元的反射機制啊,你可以閱讀一下官方文章。
The loss of reflection.那這里呢我就不多說了。
那這個decorator呢需要兩個參數,一個是出參deco pointer啊,就是完成修飾后的函數。
另一個呢是入參function,就是需要修飾的函數。
那這樣寫是不是有點傻呢?的確是,不過呢這是我個人在購物員里面所能寫出來的最好的代碼了。
那如果你知道更多優雅的寫法,請你一定要告訴我好了,那具體的使用效果是怎么樣的呢?首先假設我們有兩個需要修飾的函數負五和bar.然后呢,我們可以像文章里這樣聲明,一個買負函數,然后呢用decorator修飾它。
你會發現使用decorator的時候呢,還需要先聲明一個函數簽名,感覺好傻一點都不犯醒,不是嗎?那如果你不想聲明函數簽名呢,還可以用另一種方式,就是通過賦值啊,讓麥把兒推斷出把兒的類型,可能看上去不是那么漂亮。
但是it works啊,聽到這兒咱們就可以知道了。
構員目前本身的特性啊,無法做成像java或者python那樣。
那對此呢我們只能期待購魚啊,多放一些糖了。
最后呢我再強調一下,如果你有更好的寫法,請你一定要告訴我好了。
這節課呢就到這里。
如果你覺得今天的內容對你所幫助啊,歡迎你幫我分享給更多人。