SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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メソッドが記述できるようになった、ということです。

次のページ
4. 汎用的なアルゴリズムの分離

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

小島 富治雄(フジヲ)

Microsoft MVP for C# (2005.07~)。 - 注目の MVP - Blog: プログラミング C# - 翔ソフトウェア (Sho's) - Web Site: 翔ソフトウェア (Sho's) - Twitter: Fujiwo 著書: - Windows8〔業務アプリ〕開発読本 (共著)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8138 2014/10/14 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング