JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » .Net Framework » .net 家族语言: C#, VB.net F#等  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 利用范型和扩展方法重构代码
ray_linn

什么都不懂的小白

版主

發文: 540
積分: 10
於 2008-04-03 23:45 user profilesend a private message to usersend email to ray_linnreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在一些C#代码中常常可以看到
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//An Simple Example By Ray Linn
class CarCollection :ICollection
{
    IList list;
    
    public void Add(Car car)
    {
         list.Add(car);
    }
    .... function list for ICollection...
    
    public  void listPrice()
    {
       foreach(Car car in list)
           System.Console.WriteLin(car.Price);
    }
    ......more specifical function list...
}
 
class PetCollection :ICollection
{
    IList list;
 
    public void Add(Pet pet)
    {
         list.Add(pet);
    }
    .... function list for ICollection...
    
    public  void FeedPet()
    {
       foreach(Pet pet in list)
           System.Console.WriteLin(pet.Eating());
    }
    ......more specifical function list...
}


这样的代码在很多Open Source项目中是很经常看到的,比如Cecil,其共同特点是:某种特定类型的Collection+该Collection特殊的操作,在一个项目中可能充斥着数十个类似的Collection,类似的代码在Java中很难被重构,但是在C# 3.0中,却可以借助扩展方法与范型进行代码的精减。

首先创建范型的Collection,该例子可以用List<T>来代替,但作为例子,我们假设该List<T>是特殊的(可能有一些delegate)
Java代码

1
2
3
4
5
6
7
public CommonCollection<T>:ICollection<T>   
{   
   IList<T> list   
  
    .... function list for ICollection...   
}  
 


对于Car和Pet的特殊操作,我们通过扩展方法来实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  
 
public static class CarExt
{
    //Ext Function For CommonCollection<Car> by Ray Linn
    public static void listPrice(this CommonCollection<Car> collection)
    {
       foreach(Car car in collection)
           System.Console.WriteLin(car.Price);
    }
    ......more specifical function list...
}
 
public static class PetExt
{
      //Ext Function For CommonCollection<Pet> by Ray Linn
    public static void FeedPet(this CommonCollection<Pet> collection)
    {
       foreach(Pet pet in list)
           System.Console.WriteLin(pet.Eating());
    }
}


通过这样的方式,我们就实现了重构,两个Collection实现了求同存异。在我重构的Cecil之后,编译后的Assemly大小减小了一半.


ray_linn edited on 2008-04-05 09:16
reply to postreply to post
飞翔的候鸟
話題樹型展開
人氣 標題 作者 字數 發文時間
1466 利用范型和扩展方法重构代码 ray_linn 1863 2008-04-03 23:45
» JWorld@TW »  .Net Framework » .net 家族语言: C#, VB.net F#等

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8