Aspect-Oriented Programming


#1

抱歉少來也少更新這邊,自己任職的公司正忙,雖然開始轉 Golang 不過 Ruby 還是保有一定的佔比(效能需求),而其實 Golang 很多地方還是很難辦到的,類似的今天主題 AOP(Aspect-Oriented Programming),詳細的就不多說,類似

這邊有相關說明,而其實你可能已經有用過,那個東西叫做 rack 或是 rails 的 callback,我不確定這東西是否還有其他名稱,類似 chain / proxy … 之類的,所以這篇就先稱呼其為 AOP

太難不想理解? 那就玩看看唄,這是剛寫好的雛形,直接執行即可 : )

內容大概是 AOPtester 的所有 Procedures 我只寫一次,然後使用自己寫的 AOP 套件建立了三個 process chain,各自有自己的流程順序,每個流程(proc_ 開頭)使用一個 source 的 hash obj 來做過水,該 obj 還可以增加對執行 chain 時的少許控制,而每次執行結果都有些不同

簡單的來說(非自己使用案例 X"D),假設我寫了一個 bot,要爬 20 個網站,每個網站 fake 的方式不一樣,爬的方式也不一樣,但又部分一樣(散亂在流程的某些小節),如果全部寫在一起,你會需要建立一大票的例外判定,類似使用網站或是網址來做分類,如果全部寫分開,則重複的 code 和重用率很低,所以在程式 initialize 時期建立好所有 chain 就能乖乖跑,整票就可以超 happy

這邊不建議動態變更或分岔,即使概念可以,但怕複雜度過高而無法收斂,所以我也沒寫這部分的支援就是

anyway 這流程其實非常像 ActiveSupportcallback,但其不能調整順序,而 rack 是給 web 用的,也只有一條腸子通到底,而我的使用案例必須為多 process chain 組合而成就是,然而如果用這種方式開發,效能低下很正常,因為每個 process 都要過 register (範例內的 push),執行也要從 AOP 的 lib 來管理有的沒的

Golang 應該很難完成類似的目的,甚至要做對照表和一票轉型 … 必須說這是 Ruby 能做 metaprogramming 的最大好處唄,以上