ギークスジョブでは、新型コロナウイルス感染症の影響を鑑み、現在実施している【個別説明会】【各種イベント・セミナー】【顧客企業様との商談打ち合わせ】について、一部を除き、オンライン対応を推奨させていただきます。
ユーザーの皆様、顧客企業様、当社社員の安全確保と、安定したサービスを継続的に提供させていただきたく、ご不便をおかけいたしますが、ご容赦くださいますよう、お願い申し上げます。

5分で分かるJavaデザインパターン

2020/09/24 (木) TECH

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の中にその名前のインスタンスがふくまれているかどうか」のチェックをしています。
ふくまれている場合はそのインスタンスを返し、わざわざ新しく作り直すことはありません。これによって無駄なインスタンスの生成を防ぎ、動作を軽くすることができるのです。

おわりに

先人の知恵がぎっしりつまったデザインパターン。そこには、プログラムをよりよい設計にするためのノウハウがあふれています。
特にここで出てきたパターンは、使われる頻度がとても高いものです。適用すればあなたの書いているプログラムをもっと良くできること間違いなし!
デザインパターンを使い、より優れた設計を実現していきましょう!


関連記事
5分で分かるガベージコレクションの仕組み

シェア

スキルを収入上昇につなげよう

日本最大級のITフリーランス専門エージェント ギークスジョブ

無料登録はこちら
日本最大級のITフリーランス専門エージェント
平均年収

840万円以上

日本最大級のITフリーランス専門エージェント
年間契約数

※2019年4月から
2020年3月の実績

11,606件

いきなりフリーランスとして活動するのは不安...という方へ

業界・専門知識の豊富なコーディネーターが、関東、関西、福岡で無料セミナーを実施しています

こんなお悩みはありませんか?

  • 自分のスキルでフリーランスになれるか不安
  • 安定した収入を得られるのか不安
  • 税金や保険などの手続きがどうなるのか知りたい

まずは、ギークスジョブの無料イベントに参加してみませんか?
まだ本格的に活動する予定がない方も、情報収集の手段として活用されています。
不安や小さな不明点を解消する場として、是非ご利用くださいませ。

イベント一覧を見る
上に戻る
geechs job

このブラウザは未対応です

当サービスは以下のブラウザでご覧いただくことを推奨しております。
また、より安全で快適にご利用いただくために
最新のバージョンでご覧いただくことを推奨いたします。
推奨ブラウザ:Google Chrome、Mozilla Firefox、Microsoft Edge、safari

Google Chrome で閲覧する