若手エンジニア必見!簡単シンプルなデザインパターン初歩講座
目次
こんにちは。ぐっさんです。
先日、月一回のITエンジニアリング事業部の集まりで、若手エンジニア向けにデザインパターンの概要について、話をしました。
今回は、できるだけ「シンプルに」を目指して説明しています。
現状を確認
まずは、デザインパターンについて、現状を確認しました。
- 聞いたことある人
- 勉強したことある人
- 説明できる人
聞いたことある人や勉強したことがある人は、手があがりましたが、説明できる人となると極端に少なくなります。
なぜ説明が難しいのか
なぜ、デザインパターンの説明が難しいのか。
その理由は、「単語が分かりづらく、理解しづらい」「すべてのパターンを完璧に説明できないといけない」などがあると思います。
今回は、その現状を払しょくできるような説明ができればいいなと思いました。
デザインパターンとは?
ソフトウェア開発におけるデザインパターン(設計パターン)とは、過去のソフトウェア設計者が発見し編み出した設計ノウハウを蓄積し、名前をつけ、再利用しやすいように特定の規約に従ってカタログ化したものである。
オブジェクト指向が世にでて40年近く経ちます。
その中で、同じような設計の問題が発生しました。その問題を解決するためのノウハウをまとめたものがデザインパターンになります。
3つのデザインパターンを社員に見立てて紹介
デザインパターンについて、簡単に概要を説明したところで、3つのパターンを社員に見立てて紹介しました。
①Facadeパターン(図書委員松浦クラス)
図書の貸出方法には、ルールがあります。そのルールは、図書委員の松浦さんが知っています。
全員がルールを知る必要はなく、ルールについては、松浦さんにお任せするイメージです。
例えば、下記のプログラムのようなものです。
public class LibraryHelperMtsuura { public boolean rental( int bookID, int userID ) { // 本が存在するかチェック if (!Book.exists(bookID)) { System.out.println("対象の本は、ありません。"); return false; } // 本が貸出中かチェック if (Library.isRental(bookID)) { System.out.println("対象の本は、貸出中です。"); return false; } // 本を貸出中にする Library.changeStatus(bookID, userID); return true; } }
今回は、そこまで複雑ではないですが、複数のクラス、メソッドを順番どおり呼び出す必要があるものを、1つのメソッドにまとめます。
そうすることで、全員が手順を知らずとも、処理を実施することができます。
②Tempalateパターン(ブログ管理者横尾クラス)
ブログを投稿する際には、提出期限を確認し、下書きを書いて、ステータスをレビュー待ちに変更し、管理者が確認をして公開するといった
ステップがあります。横尾さんは、全員にそのステップを守らせる必要があります。
例えば、下記のプログラムのようなものです。
public abstract class BaseBlogYokoo { public boolean execute() { // 提出期限を確認する confirmDeadline(); // ブログの下書きを書く int blogID = writeBlog(); // ステータスをレビュー待ちにする changeReviewStatus(blogID); // 管理者がブログを確認する BlogAdmin.confirmBlog(blogID); // ブログを公開する BlogAdmin.openToPublic(blogID); } public abstract boolean confirmDeadline(); public abstract int writeBlog(); public abstract boolean changeReviewStatus(int blogID); }
上記のクラスをブログを書くクラスに継承させることで、ステップを強制的に守らせることができます。
③Flyweightパターン(勤務表提出樋口クラス)
同じ勤務表を上司や総務部に見せてと言われました。
樋口さんは、勤務表を見せるだけなので、何枚も印刷する必要は、ありません。紙の無駄です。
例えば、下記のプログラムのようなものです。
public class TimeSheetHiguchi() { private TimeSheet timeSheet = null; /** * 勤務表を見せる */ public TimeSheet showTimesheet() { if (timeSheet != null) { // すでにタイムシートを印刷していたら、そのタイムシートを返す。 return timeSheet; } // 印刷していなければ、印刷しそのタイムシートを持っておく。 timeSheet = print(); // 印刷したタイムシートを返す。 return timeSheet; } }
無駄にインスタンスを作成しないことにより、処理の軽量化や無駄なメモリ使用を防ぐことができます。
まとめ
デザインパターンは、業務で何気なく使っているものです。
ただ、それがデザインパターンと気づいていないだけだと思います。
今回の参加者は、よく聞かれる「デザインパターンは、知っていますか?」という質問に対して、自信を持って答えられるようになってくれたと思います。