3. アルゴリズムをメソッドとして分離
前述のプログラムをよく眺め、中のアルゴリズムについて考えてみましょう。
ProgramクラスのMainメソッドの中には、アルゴリズムが隠れています。例えば、次の2つです。
- 書籍のリストの中から、「書籍のタイトルまたは出版社の名前に "リ" を含むもの」を抽出する
- 書籍リストのそれぞれの書籍を表示する
この2つのアルゴリズムをメソッドとして分離してみましょう。リファクタリングの始まりです。
Mainメソッドから2つのメソッドを分離したメイン プログラム
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メソッドに注目してみましょう。
記述が明快になりました。
- 書籍のリストの中から、「書籍のタイトルまたは出版社の名前に "リ" を含むもの」を抽出し、
- それを表示する
という意図の部分だけがMainメソッドに記述されるようになり、foreachだとかifのような意図以外の部分の記述がなくなって、分かりやすくなりました。
元の混沌としたMainメソッドから、書籍のリストに関して「抽出(Filter)」と「表示(Show)」という2つの部分を別メソッドとして分けたためです。
これは重要なことです。
メソッド2つを分離したということは、「抽出(Filter)」や「表示(Show)」という名前でそれぞれの関心事を切り分けたことになります。そして、その「抽出(Filter)」と「表示(Show)」という新たな語彙でMainメソッドが記述できるようになった、ということです。
