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