オブジェクト指向を使用して、メインルーチンから条件分岐を消す方法を紹介します。説明のために簡単なプログラムを作成しています。
プログラムの内容は以下の通りです。
- クリーニング会社A、クリーニング会社B、クリーニング会社Cという会社が存在し、3社のいずれかにクリーニングをお願いする。
- クリーニングをお願いすると、以下のメッセージをコンソールに表示します。
【会社名】洗濯機で洗濯物を洗う。
【会社名】乾燥機で乾かす。
これをオブジェクト指向を使った場合と、使っていない場合でメインルーチンの実装内容を比較してみたいと思います。
オブジェクト指向を使っていない場合
static void Main(string[] args)
{
クリーニングを依頼する(CompanyConst.CompanyCodeEnum.CompanyCodeB);
}
public static void クリーニングを依頼する(CompanyConst.CompanyCodeEnum companyCode)
{
switch (companyCode)
{
case CompanyConst.CompanyCodeEnum.CompanyCodeA:
Cleaning_CompanyA(GetLaundrys());
break;
case CompanyConst.CompanyCodeEnum.CompanyCodeB:
Cleaning_CompanyB(GetLaundrys());
break;
case CompanyConst.CompanyCodeEnum.CompanyCodeC:
Cleaning_CompanyC(GetLaundrys());
break;
default:
throw new Exception("存在しない会社です。");
}
}
private static void Cleaning_CompanyA(List laundrys)
{
Console.WriteLine($"【CleaningCompanyA】洗濯機で洗濯物を洗う。");
Console.WriteLine($"【CleaningCompanyA】乾燥機で乾かす。");
}
private static void Cleaning_CompanyB(List laundrys)
{
Console.WriteLine($"【CleaningCompanyB】洗濯機で洗濯物を洗う。");
Console.WriteLine($"【CleaningCompanyB】乾燥機で乾かす。");
}
private static void Cleaning_CompanyC(List laundrys)
{
Console.WriteLine($"【CleaningCompanyC】洗濯機で洗濯物を洗う。");
Console.WriteLine($"【CleaningCompanyC】乾燥機で乾かす。");
}
private static List GetLaundrys()
{
return new List()
{
new Laundry(Laundry.ClothingTypeEnum.Pants),
new Laundry(Laundry.ClothingTypeEnum.Shirt),
new Laundry(Laundry.ClothingTypeEnum.Socks),
};
}
オブジェクト指向を使った場合
static void Main(string[] args)
{
クリーニングを依頼する(CompanyConst.CompanyCodeEnum.CompanyCodeB);
}
public static void クリーニングを依頼する(CompanyConst.CompanyCodeEnum companyCode)
{
ICleaningCompany cleaningCompany = CleaningCompanyFactory.Create(companyCode);
cleaningCompany.Cleaning(GetLaundrys());
}
private static List GetLaundrys()
{
return new List()
{
new Laundry(Laundry.ClothingTypeEnum.Pants),
new Laundry(Laundry.ClothingTypeEnum.Shirt),
new Laundry(Laundry.ClothingTypeEnum.Socks),
};
}
比較
2つを比較すると、クリーニングを依頼するメソッドからIF文が消えている事が分かります。それだけではなく、行数も少なくなっているのが分かります。
これは前者の実装が全ての処理をメインルーチンが受け持っているのに対して、後者の実装は役割毎にクラスを分散している事が要因となります。
(以下の「図1:オブジェクト指向で実装」を参照してください)
図1:オブジェクト指向で実装
このように役割毎にクラスを分けることでメインルーチンから条件分岐を無くす事も可能です。オブジェクト指向で作ることで得られるメリットこれだけではありません。他のメリットについては、また別途記載させて頂きます。
次回は「オブジェクト指向を使用して、メインルーチンから条件分岐を消す方法(後編)」です。
そこで役割毎にクラスを分けたプロセスについて書いていきたいと思います。
それでは今回はこのあたりで失礼します。