C#モデルと拡張方法によるコード再構築
いくつかのC#コードではよく見られます
このようなコードは多くのOpen Sourceプロジェクトでよく見られるもので、例えばCecilでは、ある特定のタイプのCollection+このCollectionの特殊な操作が、1つのプロジェクトに数十個の類似のCollectionがあふれている可能性があり、類似のコードはJavaでは再構築されにくいが、C#では拡張方法でモデルとコードの削減を行うことができるという共通の特徴がある.
まず、リストで代用できるモデルのCollectionを作成するが、例として、このリストが特殊であると仮定する(delegateがいくつかあるかもしれない)
Javaコード
CarとPetの特殊な操作に対して,我々は方法を拡張することによって実現した.
このようにして,我々は再構成を実現し,2つのCollectionは求同存異を実現した.私が再構築したCecilの後、コンパイル後のAssemlyサイズは半分に減少した.
//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#では拡張方法でモデルとコードの削減を行うことができるという共通の特徴がある.
まず、リスト
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サイズは半分に減少した.