記事検索

検索ワードを入力してください。
Sky Tech Blog
オブジェクト指向を​使用して、​メインルーチンから​条件分岐を​消す方​法​(前編)

オブジェクト指向を​使用して、​メインルーチンから​条件分岐を​消す方​法​(前編)

オブジェクト指向を用いてメインルーチンから条件分岐を消す方法を紹介します。クリーニング会社の例を使い、オブジェクト指向の利点を説明。条件分岐が消え、コードが簡潔になることを示します。次回は役割毎にクラスを分けたプロセスを解説予定です。

オブジェクト指向を使用して、メインルーチンから条件分岐を消す方法を紹介します。説明のために簡単なプログラムを作成しています。
プログラムの内容は以下の通りです。

  • クリーニング会社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:オブジェクト指向で実装

このように役割毎にクラスを分けることでメインルーチンから条件分岐を無くす事も可能です。オブジェクト指向で作ることで得られるメリットこれだけではありません。他のメリットについては、また別途記載させて頂きます。

次回は「オブジェクト指向を使用して、メインルーチンから条件分岐を消す方法(後編)」です。
そこで役割毎にクラスを分けたプロセスについて書いていきたいと思います。

それでは今回はこのあたりで失礼します。


XFacebookLINE
Sky株式会社のソフトウェア開発や製品、採用に関するお問い合わせについては、下記のリンクをご確認ください。
お問い合わせ
ホーム