Slide 1

Slide 1 text

【連続講座2 】デザインパターンを学 び、ソフトウェア設計に生かそう Builder ・Strategy ・Composite パーソルクロステクノロジー株式会社 エンジニアリング事業管掌 設計統括本部 第2 電子・制御設計本部 第1 設計部 4G  阿部耕二

Slide 2

Slide 2 text

目次 自己紹介 開発環境構築 設計、してますか? 良い設計とはどういう設計か? デザインパターンの学び方のススメ Builder Strategy Composite 参考資料 2

Slide 3

Slide 3 text

自己紹介 名前: 阿部 耕二(あべ こうじ) 所属: パーソルクロステクノロジー株式会社 エンジニアリング事業管掌 設計統括本部 第2 電子・制御設計本部 第1 設計部 4G 医療機器の組込みソフトウェア開発。C 言語。 趣味: 宇宙開発(リーマンサットプロジェクト広報メンバー) LAPRAS ポートフォリオ: https://lapras.com/public/k-abe Twitter: @juraruming 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 3

Slide 4

Slide 4 text

開発環境構築 サンプルコードのコンパイル、実行にjava (JDK )のインストールが 必要です。 下記のページなどを参照し、ご自分のPC のOS に合わせてインストー ルしてください。 【2024 年版】Java JDK のインストール方法(Windows & Mac 対応) 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 4

Slide 5

Slide 5 text

つぎのコマンド実行でバージョンが表示されていればOK です。 私はつぎのバージョンで確認しました。 $ javac -version javac 17.0.8 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 5

Slide 6

Slide 6 text

サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.java があるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラムの実行はつぎのコマンドで行う。 $ java Main 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 6

Slide 7

Slide 7 text

講座のGitHub リポジトリ https://github.com/grace2riku/design_pattern_lesson 今回の講座のディレクトリ https://github.com/grace2riku/design_pattern_lesson/tree/main/le sson_2 参考資料1  ソースコードのダウンロード先 Java 言語で学ぶデザインパターン入門 第3 版 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 7

Slide 8

Slide 8 text

設計、してますか? 設計してますか? 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 8

Slide 9

Slide 9 text

こんなことになってませんか? おばあちゃんのプログラミン グ教室(ばあプロ)As A Service @Pythonist19 より引 用 https://x.com/Pythonist19/sta tus/1845794841269055543 【連続講座2 】デザインパターンを学び、ソフトウェ 9

Slide 10

Slide 10 text

設計の重要性 要素技術にフォーカスしがち、注力しがち → 再利用しにくい、変更しにくいソフトウェアのできあがり 他社との違い・自社の強みを活かしていないソフトウェアが誕生 ビジネス競争力の低下 → 技術的負債に!!! 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 10

Slide 11

Slide 11 text

設計の難しさ お手本がない。 対象製品、装置で個別の事情がある。 製品の特性、開発期間、製品寿命、etc Web システムと組込みソフトウェア 自動車と医療機器では設計思想も違ってきそう。 自動車:変化が早い、開発期間短い、大量生産 医療機器:開発期間長い印象、少量生産 ソフトウェアは柔軟で、自由度が高すぎる。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 11

Slide 12

Slide 12 text

対象システム、装置に応じた設計手法を学び、身につける そしてチームメンバーと共通認識を持ちたい。 デザインパターン 設計の古典、教科書ともいえる。 プログラミング言語の中に取り込まれて、見えない。    → 学ぶことは意味があると考える。  → 開発時のコミュニケーションに活用する。  ここは「xxx 」パターンを適用してみようか? 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 12

Slide 13

Slide 13 text

良い設計とはどういう設計か? 良い設計のために個人的に大事だと思うキーワード 1. 凝集度 2. 結合度 3. 関心の分離 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 13

Slide 14

Slide 14 text

1. 凝集度 関心ごとの集まり 凝集度が高い方(関心ごとが一箇所に集まっている)が良い設計と 言われる 1 つの目的・責務になっていることが望ましい 例)料理を作る場面 キッチン周りには料理に必要な設備が配置される(水道、冷蔵庫、コ ンロ、食器棚、その他) 。 →必要なものが凝集している状態 キッチン周りに洗濯機はいらない。料理をつくるという関心ごとに洗 濯機は不要。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 14

Slide 15

Slide 15 text

2. 結合度 他のモジュールとの関連の度合い 結合度が低い方(他のモジュールとの関連が少ない方)が良い設計 と言われる あるファイルのグローバル変数が他の複数のファイルから参照され ている状況は結合度が低い。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 15

Slide 16

Slide 16 text

3. 関心の分離 関心ごとを分離し、境界を設ける 関心の分離が表現されている例としてOSI 参照モデル・TCP/IP に注 目する 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 画像引用元 OSI 参照モデルとは?TCP/IP との違いを図解で解説 “ “ 16

Slide 17

Slide 17 text

役割ごとに階層が分かれている 下の層がハードウェアに近い 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 17

Slide 18

Slide 18 text

【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 18

Slide 19

Slide 19 text

上の階層ほど抽象的。目的・知識・Why 。 下の階層ほど具体的。目的を達成する手段・How 。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 19

Slide 20

Slide 20 text

デザインパターンの学び方のススメ デザインパターンがどんな課題を解決できて、どのような構成なの かイメージを捉える 参考資料1 の章題はデザインパターンを短く端的に表現してい る。 参考資料3 では各デザインパターンを短く、わかりやすく解説し てくれている。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 20

Slide 21

Slide 21 text

クラス図とコードの写経をセットで行う コードだけ見ていても各クラスの全体の関係性がわかりずらい。 クラス図だけを見ていても抽象的で本当に動くのか疑問がわく。 設計図(抽象)  ⇔ コード(具体的)の世界を行ったり来たり することで整理できたり、気づきが得られることがあると思う。 今回のサンプルコードはJava 。デザインパターンの考え方・実装 は特定のプログラミング言語に限定されないと思うので自分が得 意な言語で実装してみると理解が深まると思う。 参考資料2 ではC# 、 C++ 、 Go 、 Java 、 PHP 、 Python 、 Ruby 、 Rust 、 Swift 、 TypeScript で実装例を提示してくれている。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 21

Slide 22

Slide 22 text

デザインパターンに登場するクラスの相互関係に注目する 複数のクラスが関係してパターンを構成している。各クラスの役 割、関係性に注目する。 デザインパターンがどのように振る舞うか? に加えて、デザインパタ ーンはどのように使われるか? の視点も大事だと思う。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 22

Slide 23

Slide 23 text

Builder 参考資料1  章題  【複雑なインスタンスを組み立てる】 複雑な構造をもったものを作り上げるとき、一気に完成させるのは 難しい。 全体を構成している各部分を作り、段階を踏んで組み上げていく。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 23

Slide 24

Slide 24 text

サンプルプログラム例 テーマ:参考資料1 の「文書」を作成するプログラム。 文書は以下のような構造をもつ。 タイトルを1 つ含む 文字列をいくつか含む 箇条書きの項目をいくつか含む 参考資料1 サンプルプログラムでテキスト・HTML の文書をつくるのに 加え、マークダウンで文書をつくるクラスを追加する。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 24

Slide 25

Slide 25 text

サンプルプログラムのクラス図 サンプルプログラムのディレク トリ https://github.com/grace2riku /design_pattern_lesson/tree/ main/lesson_2/Builder 【連続講座2 】デザインパターンを学び、ソフトウェ 25

Slide 26

Slide 26 text

サンプルプログラムの解説 Builder クラスは文章を構成するメソッドを定義する。 具体的な処理はサブクラスに書かれている。文章の種類の違いはサ ブクラスの中で表現されている。 Director クラスのconstruct メソッドで文章を作成する。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 26

Slide 27

Slide 27 text

Director クラスのconstruct メソッドは文章の種類に関わらず同じ処理 で文章を作成している。 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(); 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 27

Slide 28

Slide 28 text

Builder クラスの具象クラス(TextBuilder, HTMLBuilder, MarkdownBuilder )のメソッド(makeTitle, makeString, makeItems, close )はメソッド名が同じ。 各具象クラスでメソッドの処理は異なる。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 28

Slide 29

Slide 29 text

サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.java があるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラム実行時は引数で作成する文書を指定する(Main.java を参 照) 。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 29

Slide 30

Slide 30 text

テキストの場合 $ java Main text HTML の場合 $ java Main html マークダウンの場合 $ java Main md 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 30

Slide 31

Slide 31 text

サンプルプログラムの実行結果(テキストの場合) $ java Main text ============================== 『Greeting』 ■一般的なあいさつ  ・How are you?  ・Hello.  ・Hi. ■時間帯に応じたあいさつ  ・Good morning.  ・Good afternoon.  ・Good evening. ============================== 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 31

Slide 32

Slide 32 text

サンプルプログラムの実行結 果(HTML の場合) $ java Main html HTMLファイルGreeting.htmlが作成されました。 HTML ファイルが作成される。 【連続講座2 】デザインパターンを学び、ソフトウェ 32

Slide 33

Slide 33 text

サンプルプログラムの実行結 果(マークダウンの場合) $ java Main md MarkdownファイルGreeting.mdが作成されました。 マークダウンファイルが作成 される。 【連続講座2 】デザインパターンを学び、ソフトウェ 33

Slide 34

Slide 34 text

Builder パターンの登場人物を 抽象的に書く Builder パターンのクラス図 【連続講座2 】デザインパターンを学び、ソフトウェ 34

Slide 35

Slide 35 text

Builder パターンのシーケンス 図 【連続講座2 】デザインパターンを学び、ソフトウェ 35

Slide 36

Slide 36 text

Builder パターンのまとめ 1. 誰が何を知っているか 2. 依存性の注入(Dependency Injection ≒ DI ) 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 36

Slide 37

Slide 37 text

1. 誰が何を知っているか Main はBuilder クラスのメソッドをしらない。 Director クラスのconstruct メソッドで文章を作れることは知ってい る。 Main としてはそれでOK 。 Director クラスはBuilder クラスのみをしっている。 Builder クラスのサブクラス(テキスト・HTML ・マークダウン)の 詳細はしらない。 Director クラスはBuider クラスのメソッドを使っている。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 37

Slide 38

Slide 38 text

Director クラスはサブクラスの詳細は知らないが、サブクラスを入れ 替えることができた。 知らないからこそ入れ替えができる → 部品として利用できる。 設計者は 誰が何を知っているのか 知っている必要があるのか を意識することが大事そう。 これを意識することで交換可能で優れた部品としてのクラスを設計で きそう。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 38

Slide 39

Slide 39 text

2. 依存性の注入(Dependency Injection ≒ DI ) Director クラスはBuilder クラスを知っている。Builder のサブクラス (テキストorHTMLor マークダウン)は知らない  → 依存していない。 Director クラスが文章作成するときは、サブクラスのインスタンス が必要となる。Director クラスを生成するときはサブクラスのイン スタンス(テキストorHTMLor マークダウン)を渡している(依存 性の注入) 。  → Director クラスはサブクラスのインスタンスに依存して動 く、と言える。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 39

Slide 40

Slide 40 text

依存性の注入のつかいところ 渡すインスタンスにより動作を変えられる。 例)データベースを使うシステムのテスト データベースアクセスのコードが何らかの理由で用意できていないと する。しかし、テストは進めたい。 データベースにアクセスする実装のモック(データベースにアクセス せず、期待値を返す)のインスタンスを渡す( 依存性を注入する) 。 本番コードのデータベースアクセスの実装ができたら渡すインスタン スを変えれば実行するコードを容易に切り替えることが可能。 依存性注入はテストをしやすく技術としても使われている印象。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 40

Slide 41

Slide 41 text

Strategy 参考資料1  章題  【アルゴリズムをごっそり切り替える】 Strategy: 戦略という意味 プログラミングの文脈においての戦略 ≒ アルゴリズム アルゴリズムを切り替え、同じ問題を別の方法で解くのを容易にす るパターン 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 41

Slide 42

Slide 42 text

サンプルプログラムのテーマ UMTP 組込みモデリング部会 組込みモデリングカタログ 部品編 -> 目標制御 をテーマとする。 モデルの概要 制御対象の測定値が目標値となるように制御する仕組み 目標制御の適用例 エアコンの温度制御 自動車の速度制御 その他、多種多様多岐に渡る 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 42

Slide 43

Slide 43 text

目標制御のモデル解説 参考資料4. 組込み分野のため のUML モデル解説書 部品編 C001 目標制御 16 ページ 目標制御モデルの全体構造 【連続講座2 】デザインパターンを学び、ソフトウェ 43

Slide 44

Slide 44 text

目標制御の制御方式の解説 参考資料4. 組込み分野のため のUML モデル解説書 部品編 C001 目標制御 21 ページ サンプルプログラムでは制 御方式の各制御をStrategy パターンで表現する 【連続講座2 】デザインパターンを学び、ソフトウェ 44

Slide 45

Slide 45 text

今回実装したのは図の赤枠の メソッド 開始する(start ) 、初期化 (init ) Strategy パターンでPID 制御 の部分がON ・OFF 制御、フ ァジー制御、機械学習制御 のバリエーションになる 【連続講座2 】デザインパターンを学び、ソフトウェ 45

Slide 46

Slide 46 text

今回実装したのは図の赤枠の メソッド 実行する(execute ) 、操作 量を算出する (CalcOperationAmount ) 【連続講座2 】デザインパターンを学び、ソフトウェ 46

Slide 47

Slide 47 text

今回実装したのは図の赤枠の メソッド 終了する(exit ) 【連続講座2 】デザインパターンを学び、ソフトウェ 47

Slide 48

Slide 48 text

サンプルプログラムのクラス図 サンプルプログラムのディレク トリ https://github.com/grace2riku /design_pattern_lesson/tree/ main/lesson_2/Strategy 【連続講座2 】デザインパターンを学び、ソフトウェ 48

Slide 49

Slide 49 text

各制御方式の詳細 【連続講座2 】デザインパターンを学び、ソフトウェ 参考資料4. 組込み分野の ためのUML モデル解説書 部品編 C001 目標制御 34 ページより引用 “ “ 49

Slide 50

Slide 50 text

Strategy パターンとビジネス活動の連携の例 制御方式 実装コ スト 将来 性 Strategy 適用例 ON ・OFF 制御 低 × 社内ハード屋さん確認用にすぐリリー スする PID 制御 中 × 1st リリース ファジィ制 御 高 △ 2nd リリース 機械学習 制御 中 ○ ・販促。AI ・機械学習と打ち出すと売 れる(かもしれない) ・上位機種 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 50

Slide 51

Slide 51 text

注意 今回Java で目標制御のサンプルプログラムを書いたが、あくまで Strategy パターンを学ぶためのサンプルプログラム ガベージコレクションがいつ実行されるかわからないJava でリアル タイム性が求められる制御を普通はしない。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 51

Slide 52

Slide 52 text

サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.java があるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラムの実行は制御方式の引数を指定する(つぎはON ・OFF 制 御の場合) 。 $ java Main onoff 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 52

Slide 53

Slide 53 text

制御方式の引数の組合せ 制御方式 引数 コマンド ON ・OFF 制御 onoff java Main onoff PID 制御 pid java Main pid ファジィ制御 fuzzy java Main fuzzy 機械学習制御 ml java Main ml 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 53

Slide 54

Slide 54 text

サンプルプログラムの実行結果 ON ・OFF 制御の実行結果 $ java Main onoff OnOff制御を開始します... OnOffControlStrategy init OnOffControlStrategy CalcOperationAmount PID 制御の実行結果 $ java Main pid PID制御を開始します... PidControlStrategy init PidControlStrategy CalcOperationAmount 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 54

Slide 55

Slide 55 text

ファジー制御の実行結果 $ java Main fuzzy ファジー制御を開始します... FuzzyControlStrategy init FuzzyControlStrategy CalcOperationAmount 機械学習制御の実行結果 $ java Main ml 機械学習制御を開始します... MachineLearningControlStrategy init MachineLearningControlStrategy CalcOperationAmount 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 55

Slide 56

Slide 56 text

Strategy パターンの登場人物を 抽象的に書く 【連続講座2 】デザインパターンを学び、ソフトウェ 56

Slide 57

Slide 57 text

Strategy パターンのまとめ アルゴリズムの切り替えを容易にする 動的にアルゴリズムを切り替えてもよい Strategy ごとに開発メンバーをアサインし、パラレルで開発が進め られたりできそう ソフトウェア設計だけではなく、ビジネスの戦略としても使えそう 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 57

Slide 58

Slide 58 text

Composite 参考資料1  章題  【容器と中身の同一視】 再帰的な構造を表現するのに便利なパターン 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 58

Slide 59

Slide 59 text

Composite パターンのサンプルプログラム例 ディレクトリとファイルの構造を表示する 容器(ディレクトリ)と中身(ディレクトリまたはファイル)を同 じように扱う ディレクトリの中にディレクトリを入れることができる。ディレク トリの中にはファイルを入れることもできる。 ファイル作成時はサイズを指定する ディレクトリはディレクトリ配下にあるファイルの合計サイズを表 示する ファイルはサイズを表示する 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 59

Slide 60

Slide 60 text

Composite パターンのサンプル プログラム例 つぎのファイルシステムをつく る(仮想のファイルシステム で実際にディレクトリ、ファ イルをつくる訳ではない) 。 【連続講座2 】デザインパターンを学び、ソフトウェ 60

Slide 61

Slide 61 text

サンプルプログラムのクラス図 サンプルプログラムのディレク トリ https://github.com/grace2riku /design_pattern_lesson/tree/ main/lesson_2/Composite 【連続講座2 】デザインパターンを学び、ソフトウェ 61

Slide 62

Slide 62 text

サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.java があるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラムの実行はつぎのコマンドで行う。 $ java Main 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 62

Slide 63

Slide 63 text

Composite サンプルプログラムの実行結果 その1 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) 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 63

Slide 64

Slide 64 text

Composite サンプルプログラムの実行結果 その2 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) 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 64

Slide 65

Slide 65 text

Composite サンプルプログラムの実行結果 その3 usr ディレクトリへのファイル追加でroot ディレクトリのサイズが増え ていることが確認できる。 (usr ディレクトリはroot ディレクトリ配下のディレクトリのため) 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 65

Slide 66

Slide 66 text

サンプルプログラムの解説 Entry.java 表示メソッドは子クラスで実装することにしている。 // prefixを前につけて一覧を表示する protected abstract void printList(String prefix); 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 66

Slide 67

Slide 67 text

Directory.java, File.java では System.out.println(prefix + "/" + this) のようにクラスのオブジェクトと文字列を加算している。これは toString() を実行すること同じになる。 // 文字列表現 @Override public String toString() { return getName() + " (" + getSize() + ")"; } 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 67

Slide 68

Slide 68 text

サンプルプログラムの解説 Directory.java add メソッドでディレクトリの中にディレクトリまたはファイルを入 れる。 追加するもの(引数のentry )はEntry 型になっていることがポイン ト。 ディレクトリ・ファイルをEntry として追加している。 // ディレクトリエントリをディレクトリに追加する public Entry add(Entry entry) { directory.add(entry); return this; } 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 68

Slide 69

Slide 69 text

サイズ取得のメソッド。再帰的にgetSize を呼び出す。結果的にディレ クトリに存在するファイルの合計サイズが取得できる。 @Override public int getSize() { int size = 0; for (Entry entry: directory) { size += entry.getSize(); } return size; } 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 69

Slide 70

Slide 70 text

プリントのメソッド。getSize() と同様に再帰的にprintList を呼び出 す。結果的にディレクトリ、ファイルをツリー状に表示する。 @Override protected void printList(String prefix) { System.out.println(prefix + "/" + this); for (Entry entry: directory) { entry.printList(prefix + "/" + name); } } 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 70

Slide 71

Slide 71 text

サンプルプログラムの解説 Main.java 1. ディレクトリ作成 2. root ディレクトリにディレ クトリ追加 Directory rootdir = new Directory("root"); // 1 Directory bindir = new Directory("bin"); // 1 Directory tmpdir = new Directory("tmp"); // 1 Directory usrdir = new Directory("usr"); // 1 rootdir.add(bindir); // 2 rootdir.add(tmpdir); // 2 rootdir.add(usrdir); // 2 【連続講座2 】デザインパターンを学び、ソフトウェ 71

Slide 72

Slide 72 text

3. ディレクトリにファイル追加 4. 作成した構成を表示 bindir.add(new File("vi", 10000)); // 3 bindir.add(new File("latex", 20000)); // 3 rootdir.printList(); // 4 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 72

Slide 73

Slide 73 text

Composite パターンの使いところ ファイルとディレクトリのような再帰的な構造を持つ物を扱いたい 時 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 73

Slide 74

Slide 74 text

ディレクトリ・ファイル以外のComposite パターン適用例 参考資料1 に記載のプログラムの動作テストの例 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう KeyboardTest ではキーボードからの入力テストを行う。 FileTest ではファイルからの入力テストを行う。 NetworkTest ではネットワークからの入力テストを行う。 KeyboardTest, FileTest, NetworkTest をまとめて扱い、 InputTest という入力テストにする 複数の出力テストをまとめたOutputTest も作れそう。 InputTest とOutputTest を合わせてInputOutputTest という入出 力テストもつくれそう。 “ “ 74

Slide 75

Slide 75 text

動作テストのオブジェクト図 【連続講座2 】デザインパターンを学び、ソフトウェ 75

Slide 76

Slide 76 text

動作テストのクラス図 【連続講座2 】デザインパターンを学び、ソフトウェ 76

Slide 77

Slide 77 text

参考資料 1. Java 言語で学ぶデザインパターン入門 第3 版 2. 直撃!デザインパターン 3. ぼくにもわかるデザインパターン 第2 章 GoF パターン大カタログ ~パターンがみるみる頭にしみこむ~ 4. 組込み分野のためのUML モデル解説書 部品編 C001 目標制御 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 77

Slide 78

Slide 78 text

ご清聴ありがとうございました 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 78