CodeZine(コードジン)

特集ページ一覧

ラムダ式でステップアップ! C#のプログラムから汎用的なアルゴリズムを切り出すことで、LINQについての理解を深めよう

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/10/14 14:00

目次

3. アルゴリズムをメソッドとして分離

 前述のプログラムをよく眺め、中のアルゴリズムについて考えてみましょう。

 ProgramクラスのMainメソッドの中には、アルゴリズムが隠れています。例えば、次の2つです。

  • 書籍のリストの中から、「書籍のタイトルまたは出版社の名前に "リ" を含むもの」を抽出する
  • 書籍リストのそれぞれの書籍を表示する

 この2つのアルゴリズムをメソッドとして分離してみましょう。リファクタリングの始まりです。

Mainメソッドから2つのメソッドを分離したメイン プログラム

Program.cs
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var publisherList    = new List<Publisher> {
            new Publisher { Name = "技術評論社"          },
            new Publisher { Name = "翔泳社"              },
            new Publisher { Name = "オライリー・ジャパン"},
            new Publisher { Name = "SBクリエイティブ"    }
        };

        var bookList         = new List<Book> {
            new Book { Code           = "4774149489"                        ,
                       Title          = "C# ポケットリファレンス"           ,
                       PublisherIndex = 0                                   },
            new Book { Code           = "4798114618"                        ,
                       Title          = "C#の絵本"                          ,
                       PublisherIndex = 1                                   },
            new Book { Code           = "4798122203"                        ,
                       Title          = "独習C# 第3版"                      ,
                       PublisherIndex = 1                                   },
            new Book { Code           = "4873116503"                        ,
                       Title          = "プログラミングC# 第7版"            ,
                       PublisherIndex = 2                                   },
            new Book { Code           = "4797361344"                        ,
                       Title          = "猫でもわかるC#プログラミング 第2版",
                       PublisherIndex = 3                                   }
        };

        var filteredBookList = Filter(bookList, publisherList);
        Show(filteredBookList, publisherList);
    }

    // 書籍のリストの中から、
    // 「書籍のタイトルまたは出版社の名前に "リ" を含むもの」を抽出する。
    static IEnumerable<Book> Filter(IEnumerable<Book> bookList     ,
                                    IList<Publisher>  publisherList)
    {
        var searchWord = "リ";

        foreach (var book in bookList) {
            if (book.Title                             .Contains(searchWord) ||
                publisherList[book.PublisherIndex].Name.Contains(searchWord))
                yield return book;
        }
    }

    // 書籍リストのそれぞれの書籍を表示する。
    static void Show(IEnumerable<Book> bookList     ,
                     IList<Publisher>  publisherList)
    {
        foreach (var book in bookList)
            Console.WriteLine("コード: {0}, タイトル: {1}, 出版社: {2}",
                              book.Code, book.Title,
                              publisherList[book.PublisherIndex].Name);
    }
}

 実行結果は同じです。

実行結果
コード: 4774149489, タイトル: C# ポケットリファレンス, 出版社: 技術評論社
コード: 4873116503, タイトル: プログラミングC# 第7版, 出版社: オライリー・ジャパン
コード: 4797361344, タイトル: 猫でもわかるC#プログラミング 第2版, 出版社: SBクリエイティブ

 ここで、Mainメソッドに注目してみましょう。

 記述が明快になりました。

  1. 書籍のリストの中から、「書籍のタイトルまたは出版社の名前に "リ" を含むもの」を抽出し、
  2. それを表示する

という意図の部分だけがMainメソッドに記述されるようになり、foreachだとかifのような意図以外の部分の記述がなくなって、分かりやすくなりました。

 元の混沌としたMainメソッドから、書籍のリストに関して「抽出(Filter)」と「表示(Show)」という2つの部分を別メソッドとして分けたためです。

 これは重要なことです。

 メソッド2つを分離したということは、「抽出(Filter)」や「表示(Show)」という名前でそれぞれの関心事を切り分けたことになります。そして、その「抽出(Filter)」と「表示(Show)」という新たな語彙でMainメソッドが記述できるようになった、ということです。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 小島 富治雄(フジヲ)

    Microsoft MVP for C# (2005.07~)。 - 注目の MVP - Blog: プログラミング C# - 翔ソフトウェア (Sho's) - Web Site: 翔ソフトウェア (Sho's) - Twitter: Fujiwo...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5