2011-09-23 34 views
2

當我說消息傳遞類時,我的意思是嚴格使用類來發送並由消費者(或處理程序)使用。消息類應該是不可變的嗎?

我經常看到服務總線上的教程(例如NServiceBus),它們在創建新消息時只是簡單地使笨重使用自動屬性。在我的眼中,一旦發送消息,沒有理由改變。如果任何更改應該發生在消息中包含的信息,那麼創建一個新消息並再次發送它似乎是公平的。

它們應該是不可變的嗎?

+5

自動屬性和*觀察*不變性不需要相互排斥。 '{get;私人設置; }如果這個類不包含任何方法,並且嚴格來說是一個DTO,那麼這個類在構建後是非常不可變的。 –

+2

@AnthonyPegram:確實如此,但只有支持屬性屬性的只讀字段才允許編譯器強制執行,並且對未來的開發人員來說這就是意圖。 –

+1

@Reed - 同樣如此,但它涉及更多的樣板代碼,比您想要爲簡單的DTO編寫代碼要多。如果我擔心意圖不明顯,我可能會留下一些小小的評論。 (即使使用顯式只讀字段,我也可以這樣做,因爲其他開發人員*仍然可能不會提供)。 –

回答

3

使這些類不可變是有很多優點的。

消息傳遞系統傾向於在傳遞過程中可以很容易地實現並行或異步。無論何時您引入線程,不變性都可以提供巨大的安全級別,並防止出現很多常見錯誤。

在我的眼裏,一旦消息被髮送時,沒有理由改變

如果這是你的使用場景,那麼我肯定會傾向於使用那些不可變的數據類型的工作。我個人認爲,只有在有正當理由具有可變性時,纔會製作可變類型。否則,由於其帶來的靈活性以及它在改進稍後使用類型的系統(即:引入併發性)時提供的安全性,我總是更喜歡不變性。

3

是的,他們應該。正如你所解釋的,在創建完成後,沒有任何理由可以改變它。
另外消息通常用於抽象和/或多線程。通過不使它們變得不可變,就可以帶走不變性帶來的好處(例如線程安全性)。