デザインパターンとは?活かし方を考える

    こんにちは、UMLのL1試験を8年ぐらい前に取得した中村です。
    当時周りでなんでも(彼女の作り方とか)モデリングするのが流行っていました。

    UMLとはモデリングの手法ですが、ソフトウェアにはオブジェクト指向を始め、様々な定義方法があります。

    今回はそのソフトウェア開発における定義の一つであるデザインパターンについて書いてみました。

    このデザインパターンを生かすと以下のようなメリットが実現できます。
    ・機能の追加・更新がしやすくなる!
    ・バグの原因を特定しやすくなる!
    ・エンジニア同士でコミュニケーションをとりやすくなる!

    スピードを求められるWeb業界でとっても活かせそうですね。

    ・デザインパターンとは?

    設計ノウハウをカタログ化したものです。
    過去のソフトウェア設計者が発見し編み出した設計ノウハウに名前をつけ、再利用しやすいように規約に従ってまとめたものの総称になります。

    1995年にGoF(デザインパータンを考え出した4人組)が、「生成」「構造」「振る舞い」で区分し、全部で23種類のデザインパターンを提唱しました。
    今ではそれ以外にも様々なパターンが存在します。

    ・デザインパターンの目的

    品質向上を目的としています。
    プログラムをする際、「再利用性」、「信頼性」の高いシステムを作ることが非常に重要です。
    しかし、それは簡単ではありません。
    経験の浅いエンジニアが作った場合、「再利用性の低い」プログラムで、「信頼性の低い」システムが生み出されるのです。
    結果として「スパケティコード」が出来上がるのです。
    それを防ぐために考えられたのが、「デザインパターン」です。
    上述した通り、過去の優秀なエンジニアの設計ノウハウを真似することで、「再利用性の高い」プログラムを作り、「信頼性の高い」システムを生み出すことが容易になります。

    ・例えばIterator(イテレーター)パターン

    定義ばかり言っていてもよく分からないので具体例であげてみます。
    デザインパターンの一つにIteratorパターンというのがあります。
    これ、繰り返す、反復するなどの意味を持ちます。
    例えば
    for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
    }

    のように、ループ変数iは、「0」で初期化され、「1」「2」…と配列の要素数分まで順に増えて行きます。
    これは非常によくある処理ですが、上記の処理で使用されているループ変数「i」の役割をパターン化したものが、Iteratorパターンです。
    上記ループのたびに、毎回iの要素を1つ取出して出力させるというのを繰り返しています。

    なんとなくわかったような気がします。
    他にも色々パターンがありますが、以下のようなサイトが参考になりそうです。
    http://www.techscore.com/tech/DesignPattern/index.html/

    ・じゃあ実際にどう活かすの?

    定義は分かりました、例えばも分かりました。
    じゃあ実際にどう活かせるのでしょうか?
    自分なりに考えてみました。

    1.ソースレビュー時の共通言語にする

    例えばソースレビュー同じ処理を何箇所で書いていた時に、まとめた方がいいと気づいたとします。
    その場合何と言えばいいでしょうか?
    「ここの繰り返し処理を1箇所でまとめる感じで変更できそうだね。
    具体的にはxxのように変えて、、、」
    と意思疎通に苦労します。
    でもデザインパターンがあれば、
    「ここはIteratorパターンで!」
    というだけで、バッチリ意志が伝わります。
    ちょっと極端かもしれませんが、言葉を定義されていると意思疎通がスムーズになることは間違いないです。

    2.プログラミングの学習、育成速度の向上

    これらのデザインパターンはプログラム経験がある人は言葉を知らずとも使っています。
    けど、それは経験で身につけたので、新人エンジニアの学習には活かせます。
    結果、学習速度も上がり、エンジニアとして一人前になることが早くできます。

    3.プログラミング言語が変わっても使えるので、新言語の学習もスムーズ

    デザインパターンで身につけた考えはプログラムの基礎的な考え方なので、言語が変わっていっても汎用的に生かせるものです。
    デザインパターンではないですが、冒頭で言ったUMLなども8年前に学習しましたが現在でも使っており、デザインパターンも同様だと思います。

    より良い品質を常に目指していきたいです!

    以上です!