2011-05-26 55 views
9
public class Human 
{ 
    public void Run(){} 
    public void Jump(){} 
    public void Eat(){} 

    //Generalized approach 
    public EventHandler<HumanActivityProgressChanged> ActivityProgressChanged; 
    public EventHandler<HumanActivityCompleted> ActivityCompleted; 

    //Per-method approach 
    public EventHandler<HumanActivityProgressChanged> Running; 
    public EventHandler<HumanActivityCompleted> Ran; 

    public EventHandler<HumanActivityProgressChanged> Jumping; 
    public EventHandler<HumanActivityCompleted> Jumped; 

    public EventHandler<HumanActivityProgressChanged> Eating; 
    public EventHandler<HumanActivityCompleted> Ate; 
} 

我有不同的方法來實現基於事件的異步模式。這些方法會觸發eventargs和Completed eventargs。它們都觸發相同的eventargs(如上面的代碼所示)。是否有太多事件發生?

爲每個異步方法提供事件有意義嗎?或者只是爲所有的異步方法提供一個廣義事件?有太多事件會發生嗎?

回答

6

兩者都有效。這真的取決於你的意圖。

您是否期望聽衆希望聽到所有事件並以類似的方式迴應?去廣泛的事件。

如果您希望各自對不同方面感興趣的不同聽衆加載,對這些事件執行截然不同的任務,請參閱第二個。

背後的API設計的想法是不是強加給客戶使用的某種方式(Rails開發者可能不同意),但你會在你設計的方式給予強有力的暗示..

3

,所有的事實事件具有相同的EventArgs表示您可以用單個事件替換這些事件,並將該活動作爲HumanActivityProgressChanged和HumanActivityCompleted類型的屬性傳遞。

有沒有法律告訴你這樣做。這一切都取決於你想要揭露什麼以及客戶期望/需要什麼。

+0

我認爲將共享相同簽名的事件重構爲一個糟糕的指南 - 畢竟,在Windows.Forms中,Form類與'Activated','AutoSizeChanged','AutoValidateChanged'具有相同的eventargs。 – 2011-05-26 09:03:21

+0

這不是一個設計指南。這是一個「你可能代替的指示」我不是一個規定。我完全意識到許多事件共享它們的EventArgs類型,而不應該合併它們。 – 2011-05-26 09:05:23

0

這是一個味道的問題,但我個人更喜歡第一種方法。首先,維護將變得更容易。 而且這樣編寫代碼更爲有效。

+0

除了......你在一個類('Human')上交易簡單的實現,因爲事件處理的複雜性在這些事件的* every * * single *消費者上。不是一個很好的折衷。 – Bevan 2011-05-31 21:11:37

+0

我同意你的觀點,但正如前面的評論所指出的,這很大程度上取決於有關的情況。在我看來,單一模式的方法很少是最好的解決方案。 – 2011-06-01 10:00:45

相關問題