한국어 | English | 日本語
Webアプリケーションエンジニア (経験8.8年)
技術・開発
engineering
ウェブフロントエンドと バックエンド開発を扱います

1. 『デザインパターン』とは?

デザインパターン概要
デザインパターンは大学で簡単に習った記憶があります。大学院や入社準備の際、デザインパターンは常に試験に出るテーマでしたが、私は実際に使ってみた経験が少なかったため、なぜそれが重要なのかを実感する機会がありませんでした。ブートコードと理論よりもプロジェクトを多く行う昨今の時代では少し違うかもしれませんが、私がパターンがなぜ使われるのかを経験的に習得したのは入社してからでした。
様々なデザインパターンを学ぶ前に、なぜデザインパターンが必要なのか?そして、デザインパターンを理解するのに役立つクラスダイアグラムについて簡単に学習してみましょう。

デザインパターン

デザインパターンとは、簡潔に言えば**『オブジェクト指向パラダイムにおいて、より良いコードとは何かについての考察の結果』**です。この概念は、Gang of Fourという4人のプログラマーが書いたDesign Patternsという本を通じて世に出ました。これは、オブジェクト指向プログラミングに限らず、どの言語でも通用する開発方式を含んでいます。

様々なパターンを探る前に、すべてのパターンに共通する原則であり、パターンが生まれるきっかけとなった3つの原則を見てみましょう。

デザインパターン 3つのカテゴリ

デザインパターンは上記のように3つのカテゴリに分けられ、それぞれに非常に多くのパターンが存在します。Refactoring Guruページをぜひ参照してください。実際に各カテゴリにどのようなパターンが存在するのかを見ることができ、各パターンごとに、なぜ生まれたのか、どのような概念なのかが例のコードとともに、今後の学習に大いに役立つでしょう。

ジュニアにはあまりにも遠いデザインパターン

大規模なプロジェクトを経験したことがない場合、デザインパターンを知らないのは当然のことかもしれません。

コード一行の変更が、他の行に劇的な変更を引き起こすような大規模なプロジェクトを作ったことがない。

大学のチームプロジェクトで、ユーザーの電話から周辺AP情報を受け取り、Raspberry Piに該当顧客の位置を伝える在室表示器を作った時も、2つのサーバーを作ったにもかかわらずコードが複雑になることはなかったため、パターンを適用するかどうかを悩む必要はありませんでした。学生の方ならご存知かと思いますが、計画および構築に60%、開発に20%を費やした後、残りの20%は他の活動に費やされがちです。

また、チームプロジェクトのコードは二度と見ることはありません。要求変更を求める教授もおらず、他のプロジェクトに活用する機会もありません。

『デザインパターン』は面接準備の際、繰り返し触れるテーマですが、結局はコードとして直接プロジェクトを開発し、自分で経験しなければなりません。 本ブログでまとめるデザインパターンの記事は、理解に重点を置き、忘れないように復習しやすい形で短く掲載する予定です。各パターンは文章で明瞭に説明するよう努めますが、クラスダイアグラムへの理解があってこそ、より実装に即した理解ができるでしょう。

クラスダイアグラム - 矢印

クラスダイアグラムは、その名前が示す通り、Class間の関係を表で簡単に説明したもので、Classの概念が存在するオブジェクト指向プログラミング(OOP)におけるプロジェクト実装のための設計図と見なせます。クラスダイアグラムは、ClassとInterfaceの2つの関係を説明するImplements、Extends、Compositionのこの3つの核心的な矢印だけを見れば終わりです。コードはJavaライクな擬似コードに基づいて説明します。

implements (実装)

Implements

先のオブジェクト指向プログラミングの記事をよく読んでいれば、オブジェクト指向コードはClassよりもInterfaceを単位として構成されることを既にご存知でしょう。『どのような作業を行うか』はInterfaceで明示し、『どのように作業するか』は望む具象クラス(Concrete Class)を適材適所に注入して実際の作業を実行します。

Classを初めて学んだ後には、以下のように定義して使用します。

ConcreteClass clazz = new ConcreteClass();

次にInterfaceとポリモーフィズムを学ぶと、Interfaceに具象クラス(Concrete Class)を代入することができます。

Interface clazz = new ConcreteClass();

実際には、柔軟性を高めるために、具象クラスを直接明示せず、望む具象クラスを動的にInterfaceに外部から注入する方式が用いられます。具象クラスを注入して作業を実行するという意味でDependency Injection、あるいはコード自身が『実装決定権』を持たないという理由でこれをInversion of Controlとも呼びます。これについてはSpringの記事で別途深く扱います。

private Interface clazz;
public void setClass(Interface clazz) {
    this.clazz = clazz;
}
setClass(new ConcreteClass();

extends (継承)

Extends

継承は、Classのいくつかの関数に対して追加機能を拡張したり、別のロジックの関数で置き換えたりする際に使用します。昔は継承をAnimalという『親クラス』にCat、Dogのような『子クラス』として習いましたが、このような上位-下位概念は先に学んだImplementsが適切であり、継承は単純な機能/定義の拡張にのみ使用します。つまり、間違って習っていたということです。

Catの中から縞模様のあるCatをStripeCatと定義する場合、Catの縞模様以外のすべての関数と変数は同じです。

composite (構成、合成)

Has-A

Classの機能/定義の拡張には、継承だけでなく、合成もあります。

なぜオブジェクト指向プログラミングでは継承(extends)よりも合成(composite)を使用するよう勧めるのでしょうか?もう一度復習すると、

上記の合成の例の図にinterface(implements)を追加したところ、Cat種をより良く表現できるようになりました。

Has-A and Implements

上位概念である『種』の下に『縞模様種』、『黒い種』などをすべて処理できる拡張性を持つようになりました。直前の継承(extends)の例と比較すると、子クラスであったSpriteCatClassが持っていたSprite情報が、Catクラスの外にあるSpriteClassに移動しました。なぜInversion of Controlと呼ばれるのかがわかる部分です。

Openness, when we use Has-A and Implements

Catが『縞模様種』だけでなく『オッドアイ』の目を持つと仮定してみましょう。これもinterface(implements)とcompositeを通じてEyesClassにOddEyesClassを明示することで、Catは『種』と『目』に拡張性を持つようになりました。

これにより、先に学んだオブジェクト指向プログラミングの第1原則「『クラス-継承』よりも『インターフェース-合成』を使用せよ」と第2原則「『具象クラス』よりも『インターフェース』で構成せよ」を改めて反芻することができました。

これからは、2つの原則と3つの矢印(実装、継承、構成)でデザインパターンを見ていきましょう。


  1. https://martinfowler.com/articles/injection.html
  2. http://www.nextree.co.kr/p11247/
  3. http://www.nextree.co.kr/p6753/
1. 『デザインパターン』とは?
Author
Aaron
Posted on
Licensed Under
CC BY-NC-SA 4.0
CC BY-NC-SA 4.0
同じカテゴリーの関連記事
最新記事
LLMフィルターが奪う会話の筋肉とコミュニケーション様式
会話における無礼さを濾過し、洗練された回答を生成するLLMツールが日常化した現代において、私たちは本当に思慮深い会話をしているのだろうか?リアルタイムのコミュニケーションにおける数多くの失敗を通じて磨かれるべき会話能力が、外部ツールに依存することで退化している現象と、それがもたらす社会的な不安や世代間の行動様式の変化について考察する。
シニア採用における年俸交渉の最適なタイミングと戦略
年俸交渉は単なる数字の交換ではなく、心理的な駆け引きとタイミングが重要です。本稿では、企業側にとって、候補者が計算的な態度を取りがちな最終合格後よりも、採用プロセスの初期段階から段階的に交渉を進めることが、なぜより効率的であり、率直な情報の共有に繋がるのかを考察します。
法治主義の限界と人間の多様性
全ての人間の行為を単一の法体系で規制できるという信念は、傲慢であるかもしれない。この記事は、中世の階層的な統制から脱却し、現代の無限の自由を手に入れた人類が直面する法治主義の逆説と、多様性という名のもとに深化する社会的強制力と他者への悪魔化現象を鋭く分析する。
토스트 예시 메세지