1.3K Views
December 16, 24
スライド概要
2024/12/16 社内勉強会の資料
Builder・Strategy・Compositeをテーマにしている。
組込みソフトウェアエンジニア。 技術バックボーンはC言語・ベアメタル。 CQ EVカートのオーナーで、ハード・ソフトウェアの改造を通じて自身のスキルアップを日々考え中・・・。 LAPRASポートフォリオ: https://lapras.com/public/k-abe GitHub: http://github.com/grace2riku Qiita: https://qiita.com/juraruming Zenn: https://zenn.dev/k_abe よろしくね。
【連続講座2】デザインパターンを学 び、ソフトウェア設計に生かそう ・Strategy・Composite パーソルクロステクノロジー株式会社 エンジニアリング事業管掌 設計統括本部 第2電子・制御設計本部 第1設計部 4G 阿部耕二 Builder
目次 自己紹介 開発環境構築 設計、してますか? 良い設計とはどういう設計か? デザインパターンの学び方のススメ Builder Strategy Composite 参考資料 2
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 自己紹介 名前: 阿部 耕二(あべ こうじ) 所属: パーソルクロステクノロジー株式会社 エンジニアリング事業管掌 設計統括本部 第2電子・制御設計本部 第1設計部 4G 医療機器の組込みソフトウェア開発。C言語。 趣味: 宇宙開発(リーマンサットプロジェクト広報メンバー) LAPRAS ポートフォリオ : https://lapras.com/public/k-abe Twitter: @juraruming 3
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 開発環境構築 サンプルコードのコンパイル、実行にjava(JDK)のインストールが 必要です。 下記のページなどを参照し、ご自分のPCのOSに合わせてインストー ルしてください。 【2024年版】Java JDKのインストール方法(Windows & Mac対応) 4
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう つぎのコマンド実行でバージョンが表示されていればOKです。 私はつぎのバージョンで確認しました。 $ javac -version javac 17.0.8 5
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.javaがあるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラムの実行はつぎのコマンドで行う。 $ java Main 6
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 講座のGitHubリポジトリ https://github.com/grace2riku/design_pattern_lesson 今回の講座のディレクトリ https://github.com/grace2riku/design_pattern_lesson/tree/main/le sson_2 参考資料1 ソースコードのダウンロード先 Java 言語で学ぶデザインパターン入門 第 3 版 7
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 設計、してますか? 設計してますか? 8
【連続講座2】デザインパターンを学び、ソフトウェ こんなことになってませんか? おばあちゃんのプログラミン グ教室(ばあプロ)As A Service @Pythonist19 より引 用 https://x.com/Pythonist19/sta tus/1845794841269055543 9
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 設計の重要性 要素技術にフォーカスしがち、注力しがち → 再利用しにくい、変更しにくいソフトウェアのできあがり 他社との違い・自社の強みを活かしていないソフトウェアが誕生 ビジネス競争力の低下 → 技術的負債に!!! 10
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 設計の難しさ お手本がない。 対象製品、装置で個別の事情がある。 製品の特性、開発期間、製品寿命、etc Web システムと組込みソフトウェア 自動車と医療機器では設計思想も違ってきそう。 自動車:変化が早い、開発期間短い、大量生産 医療機器:開発期間長い印象、少量生産 ソフトウェアは柔軟で、自由度が高すぎる。 11
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 対象システム、装置に応じた設計手法を学び、身につける そしてチームメンバーと共通認識を持ちたい。 デザインパターン 設計の古典、教科書ともいえる。 プログラミング言語の中に取り込まれて、見えない。 → 学ぶことは意味があると考える。 → 開発時のコミュニケーションに活用する。 ここは「xxx」パターンを適用してみようか? 12
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 良い設計とはどういう設計か? 良い設計のために個人的に大事だと思うキーワード 1. 凝集度 2. 結合度 3. 関心の分離 13
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 1. 凝集度 関心ごとの集まり 凝集度が高い方(関心ごとが一箇所に集まっている)が良い設計と 言われる 1 つの目的・責務になっていることが望ましい 例)料理を作る場面 キッチン周りには料理に必要な設備が配置される(水道、冷蔵庫、コ ンロ、食器棚、その他)。 →必要なものが凝集している状態 キッチン周りに洗濯機はいらない。料理をつくるという関心ごとに洗 濯機は不要。 14
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 2. 結合度 他のモジュールとの関連の度合い 結合度が低い方(他のモジュールとの関連が少ない方)が良い設計 と言われる あるファイルのグローバル変数が他の複数のファイルから参照され ている状況は結合度が低い。 15
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 関心の分離 関心ごとを分離し、境界を設ける 関心の分離が表現されている例としてOSI参照モデル・TCP/IPに注 目する “ 画像引用元 OSI 参照モデルとは? TCP/IP との違いを図解で解説 “ 3. 16
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 役割ごとに階層が分かれている 下の層がハードウェアに近い 17
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 18
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 上の階層ほど抽象的。目的・知識・Why。 下の階層ほど具体的。目的を達成する手段・How。 19
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう デザインパターンの学び方のススメ デザインパターンがどんな課題を解決できて、どのような構成なの かイメージを捉える 参考資料1の章題はデザインパターンを短く端的に表現してい る。 参考資料3では各デザインパターンを短く、わかりやすく解説し てくれている。 20
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう クラス図とコードの写経をセットで行う コードだけ見ていても各クラスの全体の関係性がわかりずらい。 クラス図だけを見ていても抽象的で本当に動くのか疑問がわく。 設計図(抽象) ⇔ コード(具体的)の世界を行ったり来たり することで整理できたり、気づきが得られることがあると思う。 今回のサンプルコードはJava。デザインパターンの考え方・実装 は特定のプログラミング言語に限定されないと思うので自分が得 意な言語で実装してみると理解が深まると思う。 参考資料2ではC#、 C++、 Go、 Java、 PHP、 Python、 Ruby、 Rust 、 Swift 、 TypeScript で実装例を提示してくれている。 21
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう デザインパターンに登場するクラスの相互関係に注目する 複数のクラスが関係してパターンを構成している。各クラスの役 割、関係性に注目する。 デザインパターンがどのように振る舞うか?に加えて、デザインパタ ーンはどのように使われるか?の視点も大事だと思う。 22
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう Builder 参考資料1 章題 【複雑なインスタンスを組み立てる】 複雑な構造をもったものを作り上げるとき、一気に完成させるのは 難しい。 全体を構成している各部分を作り、段階を踏んで組み上げていく。 23
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラム例 テーマ:参考資料1の「文書」を作成するプログラム。 文書は以下のような構造をもつ。 タイトルを1つ含む 文字列をいくつか含む 箇条書きの項目をいくつか含む 参考資料1 サンプルプログラムでテキスト・HTMLの文書をつくるのに 加え、マークダウンで文書をつくるクラスを追加する。 24
【連続講座2】デザインパターンを学び、ソフトウェ サンプルプログラムのクラス図 サンプルプログラムのディレク トリ https://github.com/grace2riku /design_pattern_lesson/tree/ main/lesson_2/Builder 25
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの解説 Builder クラスは文章を構成するメソッドを定義する。 具体的な処理はサブクラスに書かれている。文章の種類の違いはサ ブクラスの中で表現されている。 Director クラスの construct メソッドで文章を作成する。 26
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう クラスのconstructメソッドは文章の種類に関わらず同じ処理 で文章を作成している。 Director public void construct() { builder.makeTitle("Greeting"); builder.makeString("一般的なあいさつ"); builder.makeItems(new String[]{ "How are you?", "Hello.", "Hi.", }); builder.makeString("時間帯に応じたあいさつ"); builder.makeItems(new String[]{ "Good morning.", "Good afternoon.", "Good evening.", }); builder.close(); 27
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう クラスの具象クラス(TextBuilder, HTMLBuilder, )のメソッド(makeTitle, makeString, )はメソッド名が同じ。 各具象クラスでメソッドの処理は異なる。 Builder MarkdownBuilder makeItems, close 28
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.javaがあるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラム実行時は引数で作成する文書を指定する(Main.javaを参 照)。 29
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう テキストの場合 $ java Main text HTML の場合 $ java Main html マークダウンの場合 $ java Main md 30
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの実行結果(テキストの場合) $ java Main text ============================== 『Greeting』 ■一般的なあいさつ ・How are you? ・Hello. ・Hi. ■時間帯に応じたあいさつ ・Good morning. ・Good afternoon. ・Good evening. ============================== 31
【連続講座2】デザインパターンを学び、ソフトウェ サンプルプログラムの実行結 果(HTMLの場合) $ java Main html HTMLファイルGreeting.htmlが作成されました。 HTML ファイルが作成される。 32
【連続講座2】デザインパターンを学び、ソフトウェ サンプルプログラムの実行結 果(マークダウンの場合) $ java Main md MarkdownファイルGreeting.mdが作成されました。 マークダウンファイルが作成 される。 33
【連続講座2】デザインパターンを学び、ソフトウェ パターンの登場人物を 抽象的に書く Builder パターンのクラス図 Builder 34
【連続講座2】デザインパターンを学び、ソフトウェ Builder 図 パターンのシーケンス 35
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう パターンのまとめ 1. 誰が何を知っているか 2. 依存性の注入( Dependency Injection ≒ DI ) Builder 36
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 1. 誰が何を知っているか Main は Builder クラスのメソッドをしらない。 Director クラスの construct メソッドで文章を作れることは知ってい る。 Main としてはそれで OK 。 Director クラスは Builder クラスのみをしっている。 Builder クラスのサブクラス(テキスト・ HTML ・マークダウン)の 詳細はしらない。 Director クラスは Buider クラスのメソッドを使っている。 37
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう クラスはサブクラスの詳細は知らないが、サブクラスを入れ 替えることができた。 知らないからこそ入れ替えができる → 部品として利用できる。 設計者は 誰が何を知っているのか 知っている必要があるのか を意識することが大事そう。 これを意識することで交換可能で優れた部品としてのクラスを設計で きそう。 Director 38
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 2. 依存性の注入(Dependency Injection ≒ DI) Director クラスは Builder クラスを知っている。 Builder のサブクラス (テキストorHTMLorマークダウン)は知らない → 依存していない。 Director クラスが文章作成するときは、サブクラスのインスタンス が必要となる。Directorクラスを生成するときはサブクラスのイン スタンス(テキストorHTMLorマークダウン)を渡している(依存 性の注入)。 → Directorクラスはサブクラスのインスタンスに依存して動 く、と言える。 39
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 依存性の注入のつかいところ 渡すインスタンスにより動作を変えられる。 例)データベースを使うシステムのテスト データベースアクセスのコードが何らかの理由で用意できていないと する。しかし、テストは進めたい。 データベースにアクセスする実装のモック(データベースにアクセス せず、期待値を返す)のインスタンスを渡す(依存性を注入する)。 本番コードのデータベースアクセスの実装ができたら渡すインスタン スを変えれば実行するコードを容易に切り替えることが可能。 依存性注入はテストをしやすく技術としても使われている印象。 40
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう Strategy 参考資料1 章題 【アルゴリズムをごっそり切り替える】 Strategy: 戦略という意味 プログラミングの文脈においての戦略 ≒ アルゴリズム アルゴリズムを切り替え、同じ問題を別の方法で解くのを容易にす るパターン 41
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムのテーマ UMTP 組込みモデリング部会 組込みモデリングカタログ 部品編 -> 目標制御 をテーマとする。 モデルの概要 制御対象の測定値が目標値となるように制御する仕組み 目標制御の適用例 エアコンの温度制御 自動車の速度制御 その他、多種多様多岐に渡る 42
【連続講座2】デザインパターンを学び、ソフトウェ 目標制御のモデル解説 参考資料4. 組込み分野のため のUML モデル解説書 部品編 C001 目標制御 16 ページ 目標制御モデルの全体構造 43
【連続講座2】デザインパターンを学び、ソフトウェ 目標制御の制御方式の解説 参考資料4. 組込み分野のため のUML モデル解説書 部品編 C001 目標制御 21 ページ サンプルプログラムでは制 御方式の各制御をStrategy パターンで表現する 44
【連続講座2】デザインパターンを学び、ソフトウェ 今回実装したのは図の赤枠の メソッド 開始する(start)、初期化 (init) Strategy パターンで PID 制御 の部分がON・OFF制御、フ ァジー制御、機械学習制御 のバリエーションになる 45
【連続講座2】デザインパターンを学び、ソフトウェ 今回実装したのは図の赤枠の メソッド 実行する(execute)、操作 量を算出する (CalcOperationAmount) 46
【連続講座2】デザインパターンを学び、ソフトウェ 今回実装したのは図の赤枠の メソッド 終了する(exit) 47
【連続講座2】デザインパターンを学び、ソフトウェ サンプルプログラムのクラス図 サンプルプログラムのディレク トリ https://github.com/grace2riku /design_pattern_lesson/tree/ main/lesson_2/Strategy 48
【連続講座2】デザインパターンを学び、ソフトウェ “ 各制御方式の詳細 “ 参考資料 4. 組込み分野の ためのUML モデル解説書 部品編 C001 目標制御 34 ページより引用 49
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう パターンとビジネス活動の連携の例 実装コ 将来 制御方式 スト 性 Strategy適用例 ON ・ OFF 社内ハード屋さん確認用にすぐリリー 低 × 制御 スする PID 制御 中 × 1st リリース ファジィ制 高 △ 2nd リリース 御 ・販促。 AI ・機械学習と打ち出すと売 機械学習 中 ○ れる(かもしれない) 制御 ・上位機種 Strategy 50
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 注意 今回Javaで目標制御のサンプルプログラムを書いたが、あくまで Strategy パターンを学ぶためのサンプルプログラム ガベージコレクションがいつ実行されるかわからないJavaでリアル タイム性が求められる制御を普通はしない。 51
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.javaがあるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラムの実行は制御方式の引数を指定する(つぎはON・OFF制 御の場合)。 $ java Main onoff 52
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 制御方式の引数の組合せ 制御方式 引数 コマンド ON ・ OFF 制御 onoff java Main onoff PID 制御 pid java Main pid ファジィ制御 fuzzy java Main fuzzy 機械学習制御 ml java Main ml 53
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの実行結果 ON ・ OFF 制御の実行結果 $ java Main onoff OnOff制御を開始します... OnOffControlStrategy init OnOffControlStrategy CalcOperationAmount PID 制御の実行結果 $ java Main pid PID制御を開始します... PidControlStrategy init PidControlStrategy CalcOperationAmount 54
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう ファジー制御の実行結果 $ java Main fuzzy ファジー制御を開始します... FuzzyControlStrategy init FuzzyControlStrategy CalcOperationAmount 機械学習制御の実行結果 $ java Main ml 機械学習制御を開始します... MachineLearningControlStrategy init MachineLearningControlStrategy CalcOperationAmount 55
【連続講座2】デザインパターンを学び、ソフトウェ パターンの登場人物を 抽象的に書く Strategy 56
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう パターンのまとめ アルゴリズムの切り替えを容易にする 動的にアルゴリズムを切り替えてもよい Strategy ごとに開発メンバーをアサインし、パラレルで開発が進め られたりできそう ソフトウェア設計だけではなく、ビジネスの戦略としても使えそう Strategy 57
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう Composite 参考資料1 章題 【容器と中身の同一視】 再帰的な構造を表現するのに便利なパターン 58
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう パターンのサンプルプログラム例 ディレクトリとファイルの構造を表示する 容器(ディレクトリ)と中身(ディレクトリまたはファイル)を同 じように扱う ディレクトリの中にディレクトリを入れることができる。ディレク トリの中にはファイルを入れることもできる。 ファイル作成時はサイズを指定する ディレクトリはディレクトリ配下にあるファイルの合計サイズを表 示する ファイルはサイズを表示する Composite 59
【連続講座2】デザインパターンを学び、ソフトウェ パターンのサンプル プログラム例 つぎのファイルシステムをつく る(仮想のファイルシステム で実際にディレクトリ、ファ イルをつくる訳ではない)。 Composite 60
【連続講座2】デザインパターンを学び、ソフトウェ サンプルプログラムのクラス図 サンプルプログラムのディレク トリ https://github.com/grace2riku /design_pattern_lesson/tree/ main/lesson_2/Composite 61
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.javaがあるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラムの実行はつぎのコマンドで行う。 $ java Main 62
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの実行結果 その1 ディレクトリのファイル追加はつぎの表示となる。 Composite root $ java Main Making root entries... /root (30000) /root/bin (30000) /root/bin/vi (10000) /root/bin/latex (20000) /root/tmp (0) /root/usr (0) 63
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの実行結果 その2 ディレクトリのファイル追加はつぎの表示となる。 Composite usr Making user entries... /root (31500) /root/bin (30000) /root/bin/vi (10000) /root/bin/latex (20000) /root/tmp (0) /root/usr (1500) /root/usr/yuki (300) /root/usr/yuki/diary.html (100) /root/usr/yuki/Composite.java (200) /root/usr/hanako (300) /root/usr/hanako/memo.tex (300) /root/usr/tomura (900) /root/usr/tomura/game.doc (400) /root/usr/tomura/junk.mail (500) 64
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの実行結果 その3 usr ディレクトリへのファイル追加で root ディレクトリのサイズが増え ていることが確認できる。 (usrディレクトリはrootディレクトリ配下のディレクトリのため) Composite 65
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの解説 Entry.java 表示メソッドは子クラスで実装することにしている。 // prefixを前につけて一覧を表示する protected abstract void printList(String prefix); 66
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう Directory.java, File.java では System.out.println(prefix + "/" + this) のようにクラスのオブジェクトと文字列を加算している。これは toString() を実行すること同じになる。 // 文字列表現 @Override public String toString() { return getName() + " (" + getSize() + ")"; } 67
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの解説 Directory.java メソッドでディレクトリの中にディレクトリまたはファイルを入 れる。 追加するもの(引数のentry)はEntry型になっていることがポイン ト。 ディレクトリ・ファイルをEntryとして追加している。 add // ディレクトリエントリをディレクトリに追加する public Entry add(Entry entry) { directory.add(entry); return this; } 68
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう サイズ取得のメソッド。再帰的にgetSizeを呼び出す。結果的にディレ クトリに存在するファイルの合計サイズが取得できる。 @Override public int getSize() { int size = 0; for (Entry entry: directory) { size += entry.getSize(); } return size; } 69
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう プリントのメソッド。getSize()と同様に再帰的にprintListを呼び出 す。結果的にディレクトリ、ファイルをツリー状に表示する。 @Override protected void printList(String prefix) { System.out.println(prefix + "/" + this); for (Entry entry: directory) { entry.printList(prefix + "/" + name); } } 70
【連続講座2】デザインパターンを学び、ソフトウェ サンプルプログラムの解説 Main.java ディレクトリ作成 2. root ディレクトリにディレ クトリ追加 1. Directory rootdir = new Directory("root"); Directory bindir = new Directory("bin"); Directory tmpdir = new Directory("tmp"); Directory usrdir = new Directory("usr"); rootdir.add(bindir); rootdir.add(tmpdir); rootdir.add(usrdir); // 1 // 1 // 1 // 1 // 2 // 2 // 2 71
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう ディレクトリにファイル追加 4. 作成した構成を表示 3. bindir.add(new File("vi", 10000)); bindir.add(new File("latex", 20000)); rootdir.printList(); // 3 // 3 // 4 72
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう パターンの使いところ ファイルとディレクトリのような再帰的な構造を持つ物を扱いたい 時 Composite 73
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう “ ディレクトリ・ファイル以外のCompositeパターン適用例 参考資料1に記載のプログラムの動作テストの例 “ KeyboardTest ではキーボードからの入力テストを行う。 FileTest ではファイルからの入力テストを行う。 NetworkTest ではネットワークからの入力テストを行う。 KeyboardTest, FileTest, NetworkTest をまとめて扱い、 InputTest という入力テストにする 複数の出力テストをまとめたOutputTestも作れそう。 InputTest と OutputTest を合わせて InputOutputTest という入出 力テストもつくれそう。 74
【連続講座2】デザインパターンを学び、ソフトウェ 動作テストのオブジェクト図 75
【連続講座2】デザインパターンを学び、ソフトウェ 動作テストのクラス図 76
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう 参考資料 言語で学ぶデザインパターン入門 第3版 2. 直撃!デザインパターン 3. ぼくにもわかるデザインパターン 第 2 章 GoF パターン大カタログ ~パターンがみるみる頭にしみこむ~ 4. 組込み分野のための UML モデル解説書 部品編 C001 目標制御 1. Java 77
【連続講座2】デザインパターンを学び、ソフトウェア設計に生かそう ご清聴ありがとうございました 78