2017-08-31 79 views
0

特別是在事件的情況下,我想知道是否有很好的理由選擇一個在另一個之上?通過參數發送相關數據或通過getter訪問?

C#例如:

Class A 
public event System.Action<someparam> someevent; 

Class B 
void eventcalledmethod(someparam param){ 
    //do something with param 
} 

比。

Class A 
public event System.Action(); 
public static someparam Getter{get;} 

Class B 
void eventcalledmethod(){ 
    //do something with A.Getter 
} 

第二個示例用於Microsoft Windows C++ API中,用於處理窗口事件。

+0

你真的應該使用https://codereview.stackexchange.com/,因爲這不是真正的問題,因爲它不在這裏工作是我的嘗試。 – rogue39nin

+0

嘿,謝謝你的提示,不知道我在哪裏發佈這個 –

回答

0

回答我認爲這不是風格問題,因爲第一種方法爲第二種方法提供了不同的功能(忽略了在通常情況下不會在代碼庫中執行其他任何操作的愚蠢的事情)。

第一種方法的好處是能夠傳遞有關A的特定實例(或事件所需的任何其他信息)的信息。這是慣用的,遵循關於多態性和封裝的正常OOP實踐。就模式而言,它允許依賴注入等。

第二種方法將事件處理綁定到A的靜態屬性,這意味着A的每個實例都不能擁有它自己的值。這也不是慣用的,因爲大多數程序員希望事件包含處理事件所需的所有信息 - 將處理綁定到靜態屬性會增加不必要的耦合。

我知道這可能看起來像一個風格的論點,但我真的認爲第一個更簡單,因此應該在可能的情況下首選。

+0

謝謝@Bilkokuya的詳細解答。第二個例子沒有明確提供實例信息。我記得Unity的Input類能夠靜態提供每一個重要的信息。如果有一個讓我們說OnMouseClicked的事件,那麼就不需要事件傳遞鼠標按鈕,因爲可以訪問一些Input類的結構體來獲取這些信息。也許另一個問題使得這個更清晰:「如果我想知道某個特定的對象是否做了某事,是根據事件註冊的,還是註冊了通過它的類事件」? –

+0

@AlexanderSeeck感謝您的澄清。 對我而言,重要的是該事件包含有關該事件所需的所有信息以及誰發送的。無論是來自靜態實例還是來自每個對象本身 - 如果不將源對象傳遞到事件中,則需要爲每個對象的事件分配一個處理程序。 理想情況下,如果你註冊一個對象的事件,它仍然應該在事件中發送一個自己的引用。 除了擁有這些信息之外,實際發送事件的內容是完全風格化的,並且不會對您可以/無法實現的內容產生真正的影響。 – Bilkokuya