2011-05-22 13 views
0

https://github.com/saucelabs/monocle單片機是否使用事件驅動編程的一個壞例子?

下面的代碼給出標準事件驅動編程的一個例子:

 
def get_cmd(conn): 
    conn.read_until("\n", callback=handle_cmd) 

def handle_cmd(conn, cmd): 
    if cmd.type == "get-address": 
     # keep track of the conn so we can write the response back! 
     def callback(result): 
      handle_user_query_result(conn, result) 
     db.query(cmd.username, callback) 
    else: 
     conn.write("unknown command") 

def handle_user_query_result(conn, user): 
    conn.write(user.address) 

雖然我不明白爲什麼需要封閉。 「跟蹤conn」與第一個函數「get_cmd」的工作方式相矛盾。另外,不要事件驅動框架通常讓你傳遞參數?

我猜這將是一個更合法的例子:

 
def get_cmd(conn): 
    conn.read_until("\n", callback=handle_cmd) 

def handle_cmd(conn, cmd): 
    if cmd.type == "get-address": 
     db.query(cmd.username, callback=handle_user_query_result, params=conn) 
    else: 
     conn.write("unknown command") 

def handle_user_query_result(result, params): 
    user = result 
    conn = params 
    conn.write(user.address) 

難道我錯了嗎?

回答

2

我想說這是一個糟糕的例子,因爲它沒有顯示基於回調的事件編程可能有多糟。閉包不是必需的,但它(大概)用於保持邏輯上的組織,使代碼更容易閱讀/推理。將回調書寫爲閉包很常見。這個例子的重點是說明如何避免回調可以使代碼更簡潔,可以更容易地讀/寫/推理。就我個人而言,我不是基於回調編程的粉絲,最近使用twistednode.js。去寫一個應用程序,然後你會欣賞單片的方法(或不,有些人更喜歡基於回調的方法)。