fnsne
說 5 years ago @Edit 5 years ago
[每日一噗]
這兩天因為去上odde的91的 DI&AOP課程。昨天回家就趕緊複習到2點,所以就沒有發噗了
latest #9
原來如此
91的課真的是每堂都很扎實。雖然這堂課明面上是寫只Support C# 但實際上上課的內容,只有第二天的中午過後的課程會比較偏向C#,其他的部分其實根本可以在很多語言上面使用。要是把AOP的部分移除掉的話,我覺得其實就可以直接support很多種語言了。
我覺得這堂課裡學到最多的地方,其實是decorator的精隨,還有該怎麼利用Decorator,來讓自己的code在新增一些比較不是核心的code時,能讓核心的code保持乾淨。
例如老師有提到,他去幫別人公司重構code時,在不同的function內,都會做相同的try catch,這邊最簡單的部分,可以抽出一個專門做try catch 的function,然後吃傳入的function,專門用來catch內部在跑的function。91說有些人不覺得這邊是重複的,所以不會想要去重構他。( P.S. 我其實有覺得這部分是重複的,但因為沒想到可以用decorator很優雅的處理掉,所以就只能讓他卡在那邊)。忽然又想到,這個好像在Uncle Bob 的Clean code上面有類似的例子。
再來提另一個例子,加上method的相關資訊。可以直接實作個有log物件注入的 decorator,這樣就可以wrap出簡單的上下文資訊 (以上的情況是for靜態語言,因為可以想辦法拿到function的metadata) 。
而動態語言 如javascripts,那就很爽了。因為可以把function傳到別的function內( javascript)去做wrap,而做掉一些其實非核心code的操作。
然後python,乾脆就讓decorator可以直接以 @ 的方式來wrap。想要多做哪些事情,就可以直接用decorator來增加。
golang是可以把function當作參數傳入的,所以做法應該是差不多。
或者是用compose相同interface的struct當作filed 的方式,來做到decorator。
雖然說,decorator的定義本就是這樣而已,但我覺得重點是能夠把decorator和DI兩者組成連續技來操作。不只是讓核心code變得更簡單,還可以把一些較不核心的相依物件,抽出來到外面給decorator使用。我覺得在單純了解各自DI和decorator是甚麼、怎麼用的情況下,還是不會去想到這兩者居然可以組合起來使用,讓code更高內聚,低耦合。
back to top