iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
Software Development

六邊形戰士程式設計系列 第 20

D20 - 樹狀搜尋問題 監控版 Python篇

  • 分享至 

  • xImage
  •  

今天使用 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) 的精神與各種主流實現模式的差異


上一篇
D19 - 樹狀搜尋問題 Spring 版 Kotlin篇
下一篇
D21 - MMORPG事件處理問題 背景介紹篇
系列文
六邊形戰士程式設計30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言