今天使用 python 來實作 AOP,並且在最後比較三種語言在 AOP 實作上的差異。首先在 D16 - 樹狀搜尋問題 非同步版 Python 篇 的基礎上,我們在 get_node 函式加上一個 @monitor
裝飾器
@monitor
async def get_node(id: str) -> Union[Node, NodeNotFoundError]:
nodes = {
"a": Node("a", "a", ["a1", "a2", "a33"]),
"a1": Node("a1", "a1", ["a11"]),
"a11": Node("a11", "a11", []),
"a2": Node("a2", "a2", []),
"a3": Node("a3", "a3", []),
}
if id in nodes:
return nodes[id]
else:
return NodeNotFoundError(id)
注意 python 的 decorator 可以放在任何一個函式上面,不需要事先包裝成 class
然後實作 @monitor
decorator ,把握一個重點 function in, function out
def monitor(func): # func 是輸入的 function
if inspect.iscoroutinefunction(func):
async def async_monitored_func(*args, **kwargs):
result = await func(*args)
if isinstance(result, NodeNotFoundError):
print(f"get id {result.id} failed, skip this node")
return result
return async_monitored_func # async_monitored_func 是回傳的 function
else:
return func # func 也是回傳的 function
TypeScript | Kotlin | Python | |
---|---|---|---|
工具 | 原生裝飾器 | Spring AOP AspectJ |
原生裝飾器 |
切入點 | class method property accessor parameter |
method |
function |
範圍選擇切入點 | X | O | X |
總結來說,雖然各個語言實作AOP的方式、可以應用的範圍都不太一樣,但同樣都可以達成解開主要邏輯與次要邏輯高度耦合的目的。最後推薦延伸閱讀此文章 來談談 AOP (Aspect-Oriented Programming) 的精神與各種主流實現模式的差異