C#モデルと拡張方法によるコード再構築


いくつかのC#コードではよく見られます

//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の特殊な操作が、1つのプロジェクトに数十個の類似のCollectionがあふれている可能性があり、類似のコードはJavaでは再構築されにくいが、C#では拡張方法でモデルとコードの削減を行うことができるという共通の特徴がある.
まず、リストで代用できるモデルのCollectionを作成するが、例として、このリストが特殊であると仮定する(delegateがいくつかあるかもしれない)
Javaコード
 

public CommonCollection<T>:ICollection<T>   
{   
   IList<T> list   
  
    .... function list for ICollection...   
}  

public CommonCollection<T>:ICollection<T>
{
   IList<T> list

    .... function list for ICollection...
}


CarとPetの特殊な操作に対して,我々は方法を拡張することによって実現した.

  

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());
    }
}

このようにして,我々は再構成を実現し,2つのCollectionは求同存異を実現した.私が再構築したCecilの後、コンパイル後のAssemlyサイズは半分に減少した.