2009-01-29 84 views
10

Steve Yegge在其blog post中描述了屬性模式屬性模式有哪些優缺點?

對於使用靜態語言(如C#或Java)的人來說,這種方法的優缺點是什麼?您希望使用屬性模式的項目類型以及您希望何時避免它?

+0

只是一個瞥見的想法,但這可能解釋爲什麼你不能在Java或C#上實現jQuery? – dkretz 2009-01-29 05:51:10

回答

5

最近我一直在深入挖掘這種模式,我可以告訴你,在它上面找到信息是相當困難的。葉戈稱它爲原型或屬性,但這兩者都被過度使用,並且被稱爲另外兩種不同的模式。有些人提到像Yegge所建議的那樣的系統是「串聯式」(原文是「typed」),這是另一個研究途徑。

這是一個非常整潔的想法,在某些應用中有很多優點,而在其他應用中有很多缺點。你獲得的基本上是一個在運行時構建「類型」的非常靈活的方法,但是你會失去很多強類型檢查語言來完成它。實現它的最簡單的方法是Dictionary<string,string>。然後,您必須使用強制轉換將您的字符串值作爲實際值返回。保持這種設計易於管理的關鍵在於如果可以避免,不要直接引用代碼中的屬性。如果theProtoObject["owner"] = "protoman"這樣的東西將會導致你死掉,如果該插槽的「規範」名稱改變。它也可能導致像JavaScript這樣的問題(在對象模型中使用這種模式),如果拼錯鍵名稱,您將添加一個新的插槽。

您可能在生產系統中進行的一種非常有可能的升級方法是使用某種特定類型的值和某種「重鍵」來獲取鍵值,這樣您可以獲得一些額外的鍵入和您的模型的安全信息。

我見過一些使用它的應用程序。最近在我的行業中查找開源代碼時遇到了一個令人驚訝的例子:保險報價。 OpenQuote是一個非常靈活的項目,用於引用任何一般類型的保險。它是用Java編寫的,但如果你知道C#應該閱讀得很好。在它的心臟地帶,位於Type對象,其中包含這段代碼:

/** A dynamic collection of attributes describing type */ 
private List<Attribute> attribute = new ArrayList<Attribute>(); 

,什麼是Attribute?此:

* An attribute is defined as "One of numerous aspects, as of a subject". Generally, another 
* type will own a (composite) collection of Attributes which help describe it. 

所以基本上Attribute是一種含有一個唯一的字符串ID(在字段名稱)和一個字符串值,並且的類型的一些正則表達式組合以驗證枚舉鍵 - 值對的和處理的值。通過這種方式,它可以存儲多種類型的值,並將它們轉換回java值,同時提供一些安全性。

然後繼續在該核心之上構建許多特定於域的模型類型。因此,保險單對象可以被視爲具有靈活的,可擴展的好處列表,可以在運行時添加,刪除或修改。每個好處都可以擴展或減少它們的屬性。

所以這是一個使用模式的例子,以及一個體面的使用案例:保險單可以非常靈活,直到銷售時刻爲止,承保人可以隨心所欲,因此高度靈活的模型適用於它。

雖然Yegge概述的缺點幾乎是。性能可能很差,特別是在天真的實施中。類型檢查和安全性會受到打擊,而且你的對象更難以推理,因爲你不確定它們的屬性。

3

當您想要製作對象的原型或者有一個開發結構會強制您對API/Interfaces進行迭代部署時,屬性模式特別有用(或者對我來說)。

如果你從一個對象的某些屬性的想法開始,然後你做出來。之後你會發現(並且你已經預料到了這個發現......)你對這個主題領域的理解是不夠的,你會根據第一個對象的原型做出一個新的對象設計/行爲。等等。關於這個主題的維基頁面與靜態類型語言一起對這個主題有非常好的描述,但是如果你真的對原型開發很認真,我會建議你研究JavaScript或者Lua。原型的屬性在靜態類型語言中是不可變的,這個事實最終會讓你走上路。

編輯:哦,我看到你鏈接到一個關於這個問題的優秀帖子。葉戈斯使用/解釋這個話題當然會使我自己變矮小。請閱讀它幾次,並且使用像java這樣的語言的屬性模式的好處/含義應該很清楚。

Edit.2:鏈接到維基百科的文章:http://en.wikipedia.org/wiki/Prototype_pattern

+0

感謝您的好評!我沒有找到維基文章...鏈接? – Greg 2009-01-29 05:37:37

+0

維基百科條目可能是所指的 - http://en.wikipedia.org/wiki/Prototype-based_programming。 (在三分鐘內谷歌管理引用這個問題,呃,我不知道我是否可以在這裏用某種遞歸來打破谷歌...) – dkretz 2009-01-29 05:56:22

0

使用Java的人,因爲我讀了一篇文章,我說你不能用在任何項目屬性模式,因爲報價:

Java對屬性模式提供基本上零的支持。

由於相同的原因,C#也是如此。當我發表這個聲明時,我感到有點安慰,因爲我當時沒有找到任何讓他們合適的方法。

所以我不知道我理解你的問題。但是,要感謝這個鏈接,請單獨提出這個問題。現在我明白了一些我中途變得更好一些的東西。

相關問題