成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談.NET獨有精巧泛型設計模式

開發 后端
在.NET發展史中,2.0是具有里程碑意義的一個版本。從這個版本,.NET青出于藍(Java),而勝于藍。在.NET 2.0帶來的諸多新特性中,我認為泛型是最重要,沒有之一。

雖然泛型出現已有多年,連Java都早已借鑒引入了泛型(雖然是語法糖),可是用泛型的編程思維方式并沒有得到相應的普及。一方面是由于過去大量的Framework仍然是在非泛型時代寫成的,另一方面泛型的設計模式沒有得到發展,改變的時候該到了。

來舉一個例子說明這兩點。我們如果寫過網絡數據抓取的代碼,應該熟悉這樣的代碼:

  1. var request = WebRequest.Create("http://www.cnblogs.com/"as HttpWebRequest; 

或者這么寫,也是一樣:

  1. var request = HttpWebRequest.Create("http://www.cnblogs.com/"as HttpWebRequest; 

大家可想過,為什么每次都要as一下?

類似的情況還有,比如做圖像處理的弟兄會熟悉:

  1. var bm = Image.FromFile("e:\\me.jpg"as Bitmap; 

  1. var bm = Bitmap.FromFile("e:\\me.jpg"as Bitmap; 

我想過,但沒想明白。上面兩種寫法,都是調用父類的工廠方法,實際返回了一個子類的實例。顯然,即使不了解OCP,憑直覺也應該想到,父類的實現中不應該被子類所決定。寫WebRequest和Image的前輩可能也覺得直接返回子類實例不妥,所以陰險地把方法簽名的返回類型改成了父類。

雖然這種行徑值得嚴重鄙視。但.NET程序員大都是人云亦云,照葫蘆畫瓢的好學生,所以這個問題多年了也沒有修改。

理想的設計應該是這樣:父類的每個子類,都有獨立的工廠方法,返回其自身的實例。這樣做法,在泛型出現前非常笨拙,得不償失,但有了泛型,就可以精巧地實現。

以模擬Image類為例,Image和BitMap實現如下:

  1. class Image<T> where T:Image<T>, new()  
  2. {  
  3.     public string Path { getset; }  
  4.  
  5.     public static T FromFile(string path)  
  6.     {  
  7.         return new T() { Path = path };  
  8.     }  
  9. }  
  10.  
  11. class Bitmap:Image<Bitmap>  
  12. {  

Image自身的工廠方法,就沒有存在的必要了。

可以簡單地測試一下:

  1. var path = @"e:\me.jpg";  
  2. var bm = Bitmap.FromFile(path); ;  
  3.  
  4. Console.WriteLine(bm.Path);  
  5. Console.WriteLine(bm.GetType().Name); 

輸出結果如下:

  1. Path: e:\me.jpg  
  2. Type: Bitmap 

為了讓大家更熟悉一下,再舉一個實現數據結構中的二叉樹作例子。

傳統的樹節點類,無論無論C/C++/Java都是類似這樣:

  1. class TreeNode  
  2. {  
  3.     public TreeNode LeftChild { getset; }  
  4.     public TreeNode RightChild { getset; }  
  5.     public TreeNode Parent { getset; }  
  6.     public int Value { getset; }  

大家知道,二叉樹又分好幾種,AVL樹、B樹、紅黑樹等等。實現特殊的二叉樹數據結構,勢必要繼承TreeNode。由于樹節點的類型中,有類型為基類的成員,所以在子類操作這些成員時,往往也要強制轉換類型,這比Image和WebRequest的例子,只在實例創建時轉換類型還麻煩。

這就該泛型模式一顯身手的好機會了,請看其父類型的實現:

  1. /// <typeparam name="T">Type of the node.</typeparam>  
  2. /// <typeparam name="K">Type of the node value.</typeparam>  
  3. class TreeNode<T,K> where T:TreeNode<T,K> where K: IComparable<K>  
  4. {  
  5.     public T LeftChild { getset; }  
  6.     public T RightChild { getset; }  
  7.     public T Parent { getset; }  
  8.     public K Value { getset; }  

之后,實現任何一種特殊二叉樹結構,比如RBTreeNode代表紅黑樹節點,可以這樣:

  1. class RBTreeNode : TreeNode<RBTreeNode,Int32>  
  2. {  
  3.     /// <summary>  
  4.     /// 樹節點顏色,是否為紅。  
  5.     /// </summary>  
  6.     public bool IsRed { getset; }  
  7.  
  8.     public override string ToString()  
  9.     {  
  10.         return this.Value + "," + (this.IsRed ? "R" : "B");  
  11.     }  

這個是AVL樹:

  1. class AvlTreeNode : TreeNode<AvlTreeNode,Int32>  
  2. {  
  3.     /// <summary>  
  4.     /// 節點的平衡度  
  5.     /// </summary>  
  6.     public int Balance { getset; }  
  7.  
  8.     public override string ToString()  
  9.     {  
  10.         return "Balance: " + Balance + ", Value: " + this.Value;  
  11.     }  

不但完全符合OCP原則,而且再也不需要as來強制轉換節點類型了。

這肯定不是我的首創,其實.NET Framework中已經不少這樣的設計,比如IComparable<T>接口。也有不少優秀的框架采用了類似的設計,比如大石頭同學的ORM框架NewLife.XCode。

看上去也很簡單吧,但是很多人思維還停留在面向對象語言剛誕生的階段,還不習慣用這種設計模式。我認為這種寫法足夠典型和通用,足以得上一種設計模式,而且是.NET特殊優勢,獨特魅力。

說到設計模式,其實GOF提出的23種設計模式多年了,已經過時,出現了許多新模式(比如并發編程方面,參考Wiki Design Pattern)。舊有的模式中,有的已經包含在.NET語言特性中,有的模式實現方式已經改頭換面。尤其在泛型出現后,許多模式的實現可以變得簡潔許多,優雅許多。

不要一遍遍炒過去的冷飯,設計模式應該與時俱進,永遠是充滿新鮮活力的話題。

原文來自:http://www.cnblogs.com/XmNotes/archive/2012/04/23/2466938.html

【編輯推薦】

  1. 為什么我不再做.NET開發
  2. 詳細解讀ASP.NET的異步
  3. ASP.NET的路由系統:URL與物理文件的分離
  4. ASP.NET MVC3 從零開始一步步構建Web
  5. Node.js vs Opa: Web框架殺手
責任編輯:彭凡 來源: 51CTO
相關推薦

2009-09-14 14:01:21

LINQ泛型數據集

2011-07-20 14:04:42

.NET策略模式

2009-06-24 10:25:25

C#泛型

2009-08-24 14:43:35

C# 泛型

2010-01-06 10:43:49

.NET Framew

2009-07-30 14:00:21

ASP.NET 2.0

2009-05-22 09:48:07

表達式樹泛型委托.NET

2023-11-02 21:11:11

JavaScript設計模式

2009-08-25 14:03:17

2012-06-25 09:28:42

.NET可逆框架

2009-08-10 10:19:47

ASP.NET組件設計

2020-06-08 08:04:49

設計模式結構型接口

2009-07-08 09:32:25

Java設計模式

2009-09-02 16:23:27

C# Singleto

2009-08-19 15:08:30

C#泛型

2022-04-15 09:55:59

Go 泛型Go 程序函數

2015-09-06 11:07:52

C++設計模式單例模式

2012-04-05 11:35:07

.NET

2025-02-17 00:00:55

NET開發依賴注入

2010-01-20 18:22:37

VB.NET泛型類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费在线观看一区二区 | 男女视频在线观看网站 | 播放一级毛片 | 久久视频一区 | 国产免费xxx | 久久不卡| 美女久久久 | 国产美女视频黄 | 亚洲成人自拍 | 国产精品福利视频 | 亚洲国产成人精品久久 | 日日夜夜天天 | 亚洲性人人天天夜夜摸 | 午夜小视频在线播放 | 偷拍自拍网 | 欧美日韩高清免费 | 日本一区二区视频 | 国产精品久久久久国产a级 欧美日韩国产免费 | 91精品国产综合久久婷婷香蕉 | 天天干狠狠干 | 欧美精品网站 | 久久免费视频观看 | 久久久久久亚洲国产精品 | 狠狠色综合久久婷婷 | 伦理一区二区 | 亚洲欧洲成人在线 | 性一交一乱一伦视频免费观看 | 精品国产一区二区三区久久久四川 | 国产精品成人一区二区三区 | 国产一区二区在线免费观看 | 中文字字幕一区二区三区四区五区 | 中文字幕一级毛片 | 亚洲精品一区中文字幕乱码 | 91精品国产综合久久久久久丝袜 | pacopacomama在线 | 精品1区2区 | 国产精品影视 | 7777奇米影视 | 操人网 | 午夜一区| 国产精品视频999 |