5分で分かるJavaデザインパターン
「いつも読みづらいソースコードを書いてしまう・・・」
「システムが複雑すぎて、調査に時間がかかる・・・」
もしかしたら、それはシステムの設計が悪いせいかもしれません。その状態では、プログラマーがどんなに頑張ってもなかなか分かりやすいソースコードにはならないものです。デザインパターンを学ぶことで、もっと美しい設計を実現していきましょう。
合わせて読みたい記事
デザインパターンって何?
デザインパターンとは、「オブジェクト指向において、よく使われる設計をパターン化したもの」です。
これを適用させると、プログラムが再利用しやすくかつ読みやすいものとなります。デザインパターンを正しく理解するためは、オブジェクト指向の知識を持っていることが大前提です。そこでまずは、オブジェクト指向とはどのようなものかおさらいをしておきましょう。
オブジェクト指向では、いくつかのオブジェクトを生成し各オブジェクトの役割分担を明確にします。「データベースへのアクセスをおこなう」「各コンポーネントのコントロールをする」などです。そして、それらのオブジェクトの組み合わせによって処理を実現します。
オブジェクト指向のメリット
オブジェクト指向のメリットとして「再利用性の高さ」や「信頼性の向上」があげられます。
たとえば、ユーザの情報をもったデータベースにアクセスする場合には、「ユーザDAO(データ・アクセス・オブジェクト)クラス」を作成し、そのクラスをさまざまな箇所で呼び出すことで処理を実現するのです。これによって「データベースへ接続する処理を、各クラスのなかでイチから実装する」ということがなくなります。一度書いたプログラムを「再利用している」というわけです。
また、ユーザDAOクラスは複数の箇所で呼び出されるため、何度も動作のテストが行われます。プログラムは、使われれば使われるほどバグを検出できる可能性が高くなり、品質が高くなっていくのです。これが「信頼性の向上」につながります。
しかし、このように再利用性の高いクラスを設計することは簡単ではありません。事実、過去には数多くのエンジニアたちが設計を失敗し、スパゲッティコードと呼ばれるぐちゃぐちゃに絡まったソースコードを生み出してきました。
そのような失敗をしないためにも、「上手な設計をしている人たちの考え方をまねて、自分たちも同じような設計ができるようになりたい」という発想が生まれます。その「良い設計を実現するためのパターンをまとめたもの」がデザインパターンなのです。
導入するとどんなメリットがあるの?
それでは、デザインパターンを導入するとどのようなメリットがあるのでしょうか?
具体的には、次の3つの「○○しやすくなる!」があります。
機能の追加・更新がしやすくなる!
デザインパターンを適用し良い設計になっていると、プログラムはとても再利用しやすいものとなります。そのため、機能の追加・更新がより簡単に実装できるのです。
バグの原因を特定しやすくなる!
各オブジェクトの役割が明確なことによる、副次的な効果です。たとえば、データベースへ接続する処理で失敗している場合、データベースに関連するオブジェクトだけを調べればよいため、範囲を簡単に絞り込むことができます。ソースコード全体を調査しなければいけないケースと比較すると、その差は明らかです。
エンジニア同士でコミュニケーションをとりやすくなる!
エンジニア同士がデザインパターンの知識を持っていると、設計に関する会話がよりスムーズになります。つまり、「この箇所は○○というパターンを使用している」、「ここは○○パターンにしてみたらどうだろう」というように、認識のすり合わせができるようになるのです。
代表的なパターン
デザインパターンがどのようなものか、なんとなく分かってきましたね。ここからは、いくつかの代表的なパターンをサンプルコードつきでご紹介していきましょう。
Singleton(シングルトン)パターン
あるクラスのインスタンスが、プログラム内に1つしかないことを保証したいケースがあります。それを実現するために、全てのメンバーに「インスタンスを生成するなよ!」と注意をうながし、厳密にレビューをするということはあまり現実的ではありません。そんなとき、効果があるのがSingletonパターンです。
public class Moon{
private static Moon moon = new Moon();
private Moon(){}
public static Moon getInstance(){
return moon;
}
}
Singletonパターンではまず、コンストラクタの識別子をprivate(プライベート)にします。private識別子のついたものは、外部クラスからの呼び出しが拒否されるため、新しいインスタンスを作り出すことができなくなるのです。これによって、Moonクラスのインスタンスは
private static Moon moon = new Moon();
によって生成されている1つだけに限定されます。
Moonクラスのインスタンスが欲しいときには、
Moon moon = Moon.getInstance();
として取得せざるをえないようなつくりになっているのです。
Facade(ファサード)パターン
アプリケーションを開発していると、「Aの処理とBの処理は必ずセットで実施しなければならない」というケースがあります。たとえば、「ユーザが退会する際には、併せてメールマガジンを送るのもストップする」といった感じです。
プログラマが全ての組み合わせを把握できていればよいのですが、万が一なにか1つを忘れてしまった場合、それは重大なバグにつながります。そのような事態を防ぐため、「一連の手順をセットで実行してくれるクラスやメソッド」を作って利用するのがFacadeパターンです。
// ※インポートやエラーハンドリングなどの記述は割愛
public class Facade {
public void secede(int user_id) {
// ユーザ退会
UserDao userDao = new UserDao();
userDao.secede(user_id);
// メールマガジンを送るのもストップ
MailMagazineDao mailMagazineDao = new MailMagazineDao();
mailMagazineDao.secede(user_id);
}
}
Facadeクラスのsecede(「退会する」の意)メソッド内部では、さきほど説明した「ユーザが退会する」、「メールマガジンを送るのもストップする」という処理をセットにして実施しています。このため、他のクラスはFacadeクラスの持つsecedeメソッドを呼び出すだけでよくなり、より実装がシンプルになるのです。
Flyweight(フライウェイト)パターン
インスタンスを作れば作るほど、プログラムの動作は重たくなります。これはつまり、「無駄なインスタンスを生成しなければ、プログラムの動作が軽くなる」ということの裏返し。Flyweightパターンは、そのような目的のために使用されるパターンです。
Flyweightとは英語で「フライ級」を意味し、ボクシングなどの体重階級の中でもっとも軽い部類のこと。つまり、それだけ動作を軽量化できるパターンなのです。
// ※インポートやエラーハンドリングなどの記述は割愛
public class Flyweight {
Map<String, SomeClass> map = new HashMap<String, SomeClass>();
public synchronized SomeClass getSomeClass(String name) {
SomeClass someClass = map.get(name);
if (someClass == null) {
someClass = new SomeClass(name);
map.put(name, someClass);
}
return someClass;
}
}
FlyweightクラスのgetSomeClassメソッドの中では、「mapの中にその名前のインスタンスがふくまれているかどうか」のチェックをしています。
ふくまれている場合はそのインスタンスを返し、わざわざ新しく作り直すことはありません。これによって無駄なインスタンスの生成を防ぎ、動作を軽くすることができるのです。
おわりに
先人の知恵がぎっしりつまったデザインパターン。そこには、プログラムをよりよい設計にするためのノウハウがあふれています。
特にここで出てきたパターンは、使われる頻度がとても高いものです。適用すればあなたの書いているプログラムをもっと良くできること間違いなし!
デザインパターンを使い、より優れた設計を実現していきましょう!
ITフリーランスをご検討中の方はギークスジョブへご相談ください
ギークスジョブはITフリーランス専門エージェントとして20年以上にわたり、ITフリーランスのご支援を行っています。
フリーランスを初めて検討される方はもちろん、現在フリーランスとしての今後に不安を感じている方、今よりもっと充実したフリーランス生活を楽しみたい方は、ぜひお気軽に相談ください。ITフリーランス専任のキャリアアドバイザーがマンツーマンでサポートいたします。
▽ 無料登録(エントリー)はこちら
https://geechs-job.com/entry
まだフリーランスになることに迷いがある方へは、独立のご相談から承ります。これまでのご経歴やキャリアの目標をお伺いしながら、お一人おひとりに寄り添ったキャリアプランのご提案をいたします。
▽ 独立相談会への無料エントリーはこちら
東京:https://geechs-job.com/event/details/1
大阪:https://geechs-job.com/event/details/2
福岡:https://geechs-job.com/event/details/3
名古屋:https://geechs-job.com/event/details/189
その他のおすすめ記事
評価されるITフリーランスがもっている共通の必須スキルとは|ITフリーランスをサポートするギークスジョブ
ITフリーランスの方のための『お役立ち情報』をご紹介しています。この情報のテーマは評価されるITフリーランスがもっている共通の必須スキルとはです。geechs job(ギークスジョブ)では、「フリーに生きる」ためのノウハウをご紹介し、ご希望のキャリアやライフプランを実現できるように、サポート致します!
ITフリーランスの案件探しならgeechs job
IT業界・企業情報の専門知識を持ったコーディネーターが、あなたに合う案件をご紹介。
ITエンジニアとしてのキャリアに弾みを付けませんか?
- ・独立して新しいキャリアを築きたい
- ・スキルを磨いて、更なる高みを目指したい
- ・今よりも高い報酬を
ITフリーランスエージェントのgeechs jobが、あなたの未来に向けて伴走します。