前回の続きです。
前回はオブジェクト指向を採用し、役割ごとにクラスを分割したことでメインルーチンから条件分岐を消すことを実現しました。 そこで今回は、どのようにクラスを分割したのかを見ていきたいと思います。
まず、オブジェクト指向を採用前後での大きな違いを「クラス図:オブジェクト指向で実装」で説明します。
クラス図:オブジェクト指向で実装
実施した手順は以下の3つです。
手順①
オブジェクト指向を採用したプログラムにはクリーニング会社A、B、Cを表すCleaningCompanyA、B、Cクラスが存在します。
これらにクリーニング処理を実装することで、クリーニング処理の中では他の会社を意識することはなくなります。
(つまり○○社の場合のような条件分岐は必要なくなる)
手順②
CleaningCompanyA、B、CはICleaningCompanyというインターフェースを実装させます。
なぜこのような事をしているかというとクリーニングを依頼するクラス(ここではProgramクラス)はどのクリーニング会社にクリーニングを依頼するかは知らない方が良いことが多いからです。
知ってしまうとクリーニング会社Aに依頼する場合は以下のようなコードを書く必要が出てきます。
public static void オブジェクト指向が中途半端な状態(CompanyConst.CompanyCodeEnum companyCode)
{
switch (companyCode)
{
case CompanyConst.CompanyCodeEnum.CompanyCodeA:
new CleaningCompanyA().Cleaning(GetLaundrys());
break;
case CompanyConst.CompanyCodeEnum.CompanyCodeB:
new CleaningCompanyB().Cleaning(GetLaundrys());
break;
case CompanyConst.CompanyCodeEnum.CompanyCodeC:
new CleaningCompanyC().Cleaning(GetLaundrys());
break;
default:
throw new Exception("存在しない会社です。");
}
}
つまりクリーニング作業を行ってくれるCleaningCompanyA、B、Cクラスを作成するだけではクリーニングを依頼するクラスから条件分岐を消すことができないのです。
これならこのようなクラスは不要とまではいいませんが、つくるメリットが半減してしまいます。
そのためICleaningCompanyを実装し、使う側にクリーニングを引き受ける振る舞い(Cleaning)メソッドを公開しておけば使う側ではどのクリーニング会社なのか?という事を意識する必要がなくなります。
手順③
次に使うクリーニング会社を決定する処理について記載します。
CleaningCompanyFactoryというクラスがその責務を担っています。 ここでは何をしているかというと、会社コード(CompanyCodeEnum)を引数にしてそれぞれのクリーニング会社インスタンスを呼び出し元に返却しています。
public class CleaningCompanyFactory
{
public static ICleaningCompany Create(CompanyConst.CompanyCodeEnum companyCode)
{
switch (companyCode)
{
case CompanyConst.CompanyCodeEnum.CompanyCodeA:
return new CleaningCompanyA();
case CompanyConst.CompanyCodeEnum.CompanyCodeB:
return new CleaningCompanyB();
case CompanyConst.CompanyCodeEnum.CompanyCodeC:
return new CleaningCompanyC();
default:
throw new ArgumentException("存在しない会社です");
}
}
}
これは【Factoryパターン】と呼ばれるデザインパターンの一つです。これらの手順を踏むことで以下のようなコードにたどり着きます。
public static void オブジェクト指向を使って実装する(CompanyConst.CompanyCodeEnum companyCode)
{
ICleaningCompany cleaningCompany = CleaningCompanyFactory.Create(companyCode);
cleaningCompany.Cleaning(GetLaundrys());
}
使う側からはICleaningCompanyというぼんやりとしたICleaningCompanyしか見えていないのですが、実際実行するとCleaningCompanyFactoryで生成されたインスタンスのクリーニング処理が実行されます。
【見た目は同じだけど実は中身は違う!】これがポリモーフィズムと言われるやつです。
ポリモーフィズムはオブジェクト指向を使用する時は避けては通れない仕組みなので、ぜひ押さえておいてください。
今回のブログはここまでです。