"Gang of Four"の略称。『オブジェクト指向における再利用のためのデザインパターン』を書いたErich Gamma、Richard Helm、Ralph Johnson、John Vlissidesの四人(ないし彼らの提唱するデザインパターン体系)をさす。"GoF"の呼称は文化大革命の「四人組」に由来。
デザインパターン
Adapter メソッドが違うなどして継承できない2つのクラスの仲介をする 既存のクラスは修正せず、仲介するAdapterを作ることで修正範囲を最小限にできる デザインパターン ~Adapter~ 内部処理用のBeanクラスと画面から値が入ってくるBeanクラス同士が 直接、継承などで結び付けられない時に使うのか! 新規の画面と入力値がやりとりできないから、とかで新しくBeanを作ったことがあるような…
Prototype インスタンスの生成をnew Class()でなく、インスタンスから別のインスタンスを生成する 雛形を作っておき、それをコピーして使う 例が思い浮かばなかったのでTECHSCOREの記事を使います 図形描画で「直線を描画するクラス」と直線を組み合わせて「図形を描画するクラス」がある 図形描画クラスで定義した三角、星などの図形を描画する処理を 雛形管理クラスでmap.put("star",星型の描画処理)のようにインスタンスを保存する → 星型をたくさん描画したい時はmap("star")だけでOK 図形ごとにクラスを作成するとクラス数が多すぎて保守性が下がるのでPrototy…
Factory Method スーパークラスを定義して、処理はサブクラスが行う スーパークラスがサブクラスに依存しないから改修はサブクラスだけで済む スーパークラスは「登録する」ことだけ定義されているので、サブクラスに依存しない Builderパターンとの違い Builder クラスのアウトラインは抽象クラス 処理を持ったサブクラスと組み合わせて複雑な処理を実現 Factory Method 抽象クラスには概念くらいアバウトな定義だけ(登録するなど) サブクラスは登録する処理だったら何でもOK 抽象クラスがサブクラスに依存しないので修正範囲を切り分けられる Abstract Factoryパタ…
Builder 抽象クラスを定義して処理は継承したクラスが行う 具象クラスのインスタンスによって処理の切り替えが簡単にできる 商品登録は「フォーム画面から登録」と「バーコードから登録」できる ピンクの商品登録クラスに具象クラスのインスタンスを渡せば登録方法が切り替えられる フォームから登録だと、「フォーム登録インスタンス」をピンクの商品登録に渡せばOK
デザインパターンとは 今さら聞けない!デザインパターンとは【初心者向け】 デザインパターンとは、JavaやRubyなどのオブジェクト指向の言語で使われる設計パターンのことです。過去のエンジニアが解決してきた方法(設計)が、デザインパターンとしてまとめられているのです。 読みやすく、ムダのないコード書いてみたい… 行き当たりばったりのコーディングとはお別れだ!! Gang of Four(GoF) GoFのデザインパターンまとめ あらゆるコードのパターンは23種類に落ち着く、らしい! 早速、1つ目のパターンを見てみる Abstract Factory 抽象クラスを作成し、実装は抽象クラスを継承し…
CodinGameのコンテスト、Green Circleに参加しました。 www.codingame.com お題はちょっとゲームバランス偏り気味なゲームAIです。 結果はGoldリーグで、全体1758人中92位でした。 (今回の記事はゲーム内容への言及薄めで、実装寄りのお話が多いです) 問題 システム開発に役立つスキルを取得して使いながら、5つのアプリをリリースしてね。 (デッキを強化して勝利点を5点取ってね) 4リリースまでは技術的負債(ペナルティカード)を受け取ることで条件の穴埋めが出来るけど、5リリース目は完全に条件を満たさないと駄目だよ。 詳しいルールはツカモさんが翻訳記事を書いてく…
輪読会メンバー Izumi Haruya github.com Sekine Yutaro github.com 第1章オブジェクト指向設計 世界は手続き的な一方で、オブジェクト的でもある オブジェクトとは、もの・実態 オブジェクト指向ソフトウェアの設計では、世界をオブジェクト間の自発的な相互作用の連続として捉え、発想の転換が求められる まず、オブジェクト指向的な世界に没入するのが大事 視点の置き方が原因になりがち 1.1設計の賞賛 楽しさと生産性を天秤にかける必要がない。 どちらかが上がると楽しいから共存できる アプリケーションは可変であるとは 後から要件が変わること 変更が容易なアプリは書…
先日チーム内でFactoryパターンについて話し合う機会があったのでその内容をまとめたいと思います。 個人的にFactoryパターンについてよくわかっていなかったので質問する形でいろいろメンバー間で話し合ってみました。 参考 今回のFactoryパターンについては以下のものを参考にしました。 以下通称デザインパターン本 GoFのデザインパターン本と呼ばれる原典 https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AB%E3%81%8A%E3…
はじめに スタンフォード大学の John Ousterhout 教授が執筆された “A Philosophy of Software Design”(以下 APoSD と略す) という書籍をご存じでしょうか? 書籍のタイトルを直訳すると、「ソフトウェア設計の哲学」となります。書籍の内容はまさに、ソフトウェア設計について扱っています。 本書籍をベースに、「A Philosophy of Software Design を30分でざっと理解する」というお題で社内ランチ勉強会が開催されました。本記事執筆者である岩瀬(@iwashi86)が発表者であり、勉強会資料は以下のとおりです。 スライド P.4…
エラーの設計・実装方法について社内に共有する機会があり、設計の流れや一例を書いてみました。TypeScriptとは言っていますが、なるべく言語非依存・ライブラリ未使用で、カスタムエラークラスを使用する前提で書きました。
こんにちは。虎の穴ラボのH.Kです。 5月の大型連休で社内の技術書購入を支援する制度を利用して購入した『良いコード/悪いコードで学ぶ設計入門―保守しやすい 成長し続けるコードの書き方』を読みました。 『良いコード/悪いコードで学ぶ設計入門』書影 とても良い本でしたので、本書の横断的な概要と、その中で良かったところや気になったところをご紹介していきます。
はじめに どうすればソフトウェアを変更容易にできるかというのは重要な課題である。ISO/IEC 9126(もしくは、改定されたISO/IEC 25010)というソフトウェア品質の評価に関する国際規格の中にも保守性 (maintainability) という変更に対するコストに関わる特性がある。 変更容易にするための1つの手法として、DI(Dependency Injection)というものがある。これはモジュール同士の結合を疎結合にして、変更の影響範囲を狭める手法である。この記事ではDIやサービスロケータなどについて整理しつつ理解を深めていきたい。 DIをしないHello World! 解決し…
あっという間に過ぎてしまった4月だった。 ブログも結構サボっていてしまったので、5月はもう少しアウトプットを増やしていきたいと思う。 インプット期間 部署移動と空白期間 3月で去年の10月頃から外れ、部署移動を行うことになった。(希望した) 急な部署移動変更希望でもあり、自分に割り当てられる仕事がすぐには出来ない、ということで勤務中の学習期間として時間に余裕ができた。 LaravelでGraphQLをどう扱うかを学習したり、GraphQLのスキーマ設計・スキーマ定義のベストプラクティスを探していたりしていた。 4月の第一週はその作業だけで終えてしまったわけだが、第二週は割り込み処理で別の仕事を…
情報処理試験、受験された方、お疲れ様でした。 試験が終了して少し時間が経過しましたが、合否発表にはまだ時間があります。 各区分の午前IIの出題分野を分析して本記事でまとめてみました。 この記事をみていただければ、 各区分の午前IIの傾向や全区分を通して見えてくる試験センターの関心の高い分野が見えてくると思います。 振り返りに活用ください。 各試験区分の午前II出題割合 1. ITストラテジスト(ST) 2. システムアーキテクト(SA) 3. ネットワークスペシャリスト 4. ITサービスマネージャ 5. 情報処理安全確保支援士 総合分析 おわりに ■ATTENTION■ 本記事で分析する主題…
はじめに GoFのデザインパターンの1つであるFactory Methodパターンを体験してみました。 Factory Methodパターンとは Factory Methodパターンについての説明は以下の記事がとても分かりやすかったです。 nprogram.hatenablog.com FactoryMethodの説明と構成要素は上記記事より引用させていただいています。 インスタンス化したいオブジェクト(製品)を実行時の条件によって決めたい場合に利用します。 Factory Methodパターンはオブジェクト(製品)を生成する側と利用する側に分けて定義する必要があります。 分けておくことで、将…
はじめに GoFのデザインパターンの1つであるSingletonパターンを体験してみました。 Singletonパターンとは Singletonパターンを用いると特定のクラスのインスタンスを1つだけ生成するということが可能になります。 1つのインスタンスだけを使いまわしたいときに使います。 用途としてはログ機能やキャッシュ機能などが挙げられます。 サンプルコード Singletonクラスはフィールドで初期化し、GetInstanceメソッド経由で取得します。 Singletonクラスを外部でnewされないようにコンストラクタのアクセス修飾子はprivateにします。 public class …
はじめに GoFのデザインパターンの1つであるTemplate Methodパターンを体験してみました。 Template Methodパターンとは Template Methodパターンとはスーパークラスで処理の枠組みを決めてそれを継承したサブクラスで具体的な処理を書いていくというパターンです。同じような流れの処理を複数書く時などに利用できます。 サンプルコード 以下にサンプルコードを記載します。 スーパークラス(Templateクラス)のPlayメソッドにて朝昼夜の処理の流れを決めます。 その後、Templateクラスを継承した平日クラス(Weekday)と休日クラス(Holiday)にて…
はじめに GoFのデザインパターンの1つであるStateパターンを体験してみました。 Stateパターンとは Stateパターンとは「状態」をクラスとして持ち、その変化を管理しやすくするためのデザインパターンです。 「状態」を表すStateインターフェースを継承して具体的な「状態」を持つクラスを作成、そしてその「状態」をContextクラスで管理する、というイメージです。なかなか説明が難しくて申し訳ないのですがWikipediaから引用したクラス図を以下に添付いたします。 ja.wikipedia.org サンプルコード 以下にサンプルコードを記載します。 Contextクラスで状態を管理して…
はじめに GoFのデザインパターンの1つであるAdapterパターンを体験してみました。 Adapterパターンとは Adapterパターンとは既に提供されているクラスを特定の部分へ使いまわす際に良い感じに使えるように変換させるデザインパターンです。 既に提供されているクラスを使いたいけど、一部用途が合わなくて使えない~~という時に使うイメージです。 サンプルコード 以下は元々あったライフスタイルクラスへAdapterパターンを適用し、夏休み用のライフスタイルを作成するサンプルコードです。 public class Program { static void Main(string[] arg…
はじめに GoFのデザインパターンの1つであるMementoパターンを体験してみました。 Mementoパターンとは Mementoパターンでは、インスタンスの特定の状態を記憶し、必要な時に取り出すことができるようにするデザインパターンです。 特定の状態をスナップショットとして保存しておき、必要な時に復元するというような感じですね。 登場人物は3つあります。以下の記事がとても分かりやすかったので引用させていただきます。 www.itsenka.com Originator(作成者) 自分の状態を保存した「Memento」を作成します。(createMemento) また、要求された「Memen…