2010-12-21 91 views
7

我最近一直在研究事件聽衆,我想我終於把他們弄倒了。基本上,它們是在另一個對象的方法上調用的函數。我的問題是,爲什麼在調用函數時創建事件監聽器會工作得很好?爲什麼在函數調用中使用事件偵聽器?

例如,我想調用player.display_health(),並且當它被觸發時,方法player.get_health()應該被觸發並存儲,以便display_health()可以訪問它。爲什麼我應該只使用一個事件監聽器來調用該函數?即使display_health()在另一個對象中,這對我來說仍然不是問題。

如果你有另一個更適合用法的例子,請讓我知道。也許特定的語言不會從中受益? (Javascript,PHP,ASP?)

回答

8

您可能無法始終控制執行調用的代碼。或者即使你是,你也不想在該代碼中引入依賴關係。在這種情況下,最好讓代碼觸發一個事件並允許您控制的代碼或應該有依賴關係的代碼監聽事件並相應採取行動。

例如,也許你正在創建一個將被其他人使用的庫。他們沒有源代碼或以某種方式不能/不應該能夠修改它(或不應該)。您的文檔指出在特定情況下會引發特定事件。然後他們可以對這些事件做出反應。

或者您的企業中可能有一些域庫。你可以控制它們並且可以修改它們,但是在架構上它們通常被認爲是正在工作,因爲它們目前是編碼的,不應該改變。 (不想引起一輪QA重新驗證更新的代碼,代碼屬於另一個部門,他們不希望您改變它等)。而且您處於您想要的位置代碼能夠在不同的環境/環境中完成不同的事情。如果該代碼在相關情況下引發和事件發生,則可以將代碼掛接到其中(和/或相應地換出),而不必混淆該代碼。

只是幾個簡單的例子,我相信其他人有更多。

+0

我控制的域庫背後的想法給了我一個很好的理解,因爲我使用的大多數東西都可以完全控制。所以,因爲我確實有控制權,所以我需要提出相反的問題,是否有理由不通過函數調用使用事件偵聽器? – Organiccat 2010-12-21 21:00:01

+0

@Organiccat:和以前一樣,我確定還有其他原因。但是,我最大的原因是依賴倒置原則。對事件做出響應的代碼可能具有(或者甚至是)依賴項,這些依賴項在邏輯上不屬於引發事件的代碼。 – David 2010-12-21 21:01:42

4

我的問題是,爲什麼創建一個事件監聽器,當調用該函數將工作得很好?

如果您不知道您想要調用的功能該怎麼辦?

舉一個經典的例子,用戶可以點擊一個按鈕。誰寫的圖書館有不知道什麼功能,你想要點擊按鈕時調用。如果每個按鈕在被點擊時只能調用相同的功能,這也是相當令人望而卻步的。

因此,您可以將事件處理程序附加到該事件。然後當事件被觸發時,Button可以做它所需要的,而不必在編譯時知道它應該調用的函數。

+0

我在這裏看不到任何解釋。有些語言(比如JS)有內置的事件,但是我沒有任何理由自己創建事件,如果我創建的不是庫。我可以在按鈕上使用`onclick`事件並調用我想要的許多函數這裏有什麼問題?我在這裏是因爲我發現了一些關於NodeJS事件的信息,並不明白爲什麼我應該知道它們。 – Telion 2018-02-13 18:25:39

1

簡而言之,您可以編寫沒有事件偵聽器的代碼,但使用事件偵聽器幫助其他人使用與庫相同的代碼。

相關問題