Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう(Facade・Obs...

k-abe
January 22, 2025

 【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう(Facade・Observer・State)

2025/1/23 社内勉強会の資料
Facade・Observer・Stateパターンをテーマにしている。

※URLリンクを多数、書いています。
URLリンクが有効な資料はこちらを参照ください。
https://www.docswell.com/s/juraruming/5XE9NG-2025-01-22-221337

k-abe

January 22, 2025
Tweet

More Decks by k-abe

Other Decks in Technology

Transcript

  1. 自己紹介 名前: 阿部 耕二(あべ こうじ) 所属: パーソルクロステクノロジー株式会社 エンジニアリング事業管掌 設計統括本部 第2 電子・制御設計本部 第1 設計部 4G 医療機器の組込みソフトウェア開発。C

    言語。 趣味: 宇宙開発(リーマンサットプロジェクト広報メンバー) LAPRAS ポートフォリオ: https://lapras.com/public/k-abe Twitter: @juraruming 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 3
  2. 開発環境構築 サンプルコードのコンパイル、実行にjava (JDK )のインストールが 必要です。 下記のページなどを参照し、ご自分のPC のOS に合わせてインストー ルしてください。 【2024

    年版】Java JDK のインストール方法(Windows & Mac 対応) 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 4
  3. 1. 凝集度 関心ごとの集まり 凝集度が高い方(関心ごとが一箇所に集まっている)が良い設計と 言われる 1 つの目的・責務になっていることが望ましい 例)料理を作る場面 キッチン周りには料理に必要な設備が配置される(水道、冷蔵庫、コ ンロ、食器棚、その他)

    。 →必要なものが凝集している状態 キッチン周りに洗濯機はいらない。料理をつくるという関心ごとに洗 濯機は不要。 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 14
  4. サンプルプログラムの実行結果 $ java Main welcome.html is created for [email protected] (Koji

    Abe) welcome.html の内容 <!DOCTYPE html><html><head><title>Koji Abe's web page</title></head> <h1>Koji Abe's web page</h1> <p>Welcome to Koji Abe's web page!</p> <p>Nice to meet you!</p> <p><a href="mailto:[email protected]">Koji Abe</a></p> </body></html> 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 27
  5. サンプルプログラムの例 テーマ: 数(0 〜49 のランダムな整数を20 個) をObserver に通知する。通 知を受けたObserver はそれぞれの方法で数を表示する。

    Observer 1. DigitObserver は数字で数を表示する Observer 2. GraphObserver はグラフ(*) で数を表示する 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 34
  6. サンプルプログラムの実行結果 DigitObserver とGraphObserver の表示の組が20 個あるが省略 $ java Main DigitObserver:9 GraphObserver:*********

    DigitObserver:13 GraphObserver:************* DigitObserver:30 GraphObserver:****************************** DigitObserver:23 GraphObserver:*********************** DigitObserver:34 GraphObserver:********************************** 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 37
  7. Observer パターンのまとめ 状態変化を通知するときに使うと便利なパターン 通知を出す側はObserver のことを知らない。 RandomNumberGenerator はObserver がDigitObserver か GraphObserver

    か知らない。 Observer は通知を出す側を知らない。DigitObserver ・ GraphObserver はRandomNumberGenerator が通知を出しているこ とを知らない。 →知らないということはクラスを交換できる→変更容易性を高める 設計ができる 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 39
  8. State サンプルプログラムの実行結果 ターミナルの表示。1 秒で1 時間経過するようになっている。 $ java Main 現在時刻は00:00 [昼間]から[夜間]へ状態が変化しました。

    現在時刻は01:00 現在時刻は02:00 現在時刻は03:00 現在時刻は04:00 現在時刻は05:00 現在時刻は06:00 java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=金庫使用,when=1737462816012,modifiers=Button1] on button0 現在時刻は07:00 java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=非常ベル,when=1737462817221,modifiers=Button1] on button1 現在時刻は08:00 java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=通常通話,when=1737462818118,modifiers=Button1] on button2 現在時刻は09:00 [夜間]から[昼間]へ状態が変化しました。 現在時刻は10:00 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 44
  9. State パターンを使わない場合(状態をクラスとしない場合)にあり そうな実装例 金庫使用時に呼ばれるメソッド() { if (昼間) { // 警備センターに利用の記録

    } else if (夜間) { // 警備センターに非常事態の通報 } } // 非常ベル、通常通話使用時のメソッドは省略 メソッドの中に状態のif 文がある→コードが複雑になる要因のひと つ 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 47
  10. State パターンを使わない場合(状態をクラスとしない場合)にあり そうな実装例 もし、 【メンテナンス中】の状態が追加されたらどうなる??? 金庫使用時に呼ばれるメソッド() { if (昼間) {

    // 警備センターに利用の記録 } else if (夜間) { // 警備センターに非常事態の通報 } else if (メンテナンス中) { // メンテナンス中の振る舞い } } // 非常ベル、通常通話使用時のメソッドも同様に状態を追加する 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 48
  11. サンプルプログラムの解説 State パターン(DayState, NightState) では前ページの実装と違い、 State パターンのクラスの中に必要な振る舞い doClock doUse doAlarm

    doPhone が書かれており、状態判断のif 文が登場しない。 State パターンは状態の追加に前述の実装例より容易に対応できる。 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 49
  12. サンプルプログラムの解説 DayState, NightState はSingleton パターンを適用し、インスタンスが1 個しか生成できないようにしている。 プログラムを複雑化させない良いアプローチだと思う。 ※Singleton パターンについて1 回目の講座資料も参考にしてくださ

    い。 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう (Adapter ・Factory Method ・Singleton) https://www.docswell.com/s/juraruming/5QRMXX-2024-10-25- 142836#p41 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 51
  13. 参考資料 1. Java 言語で学ぶデザインパターン入門 第3 版 2. 直撃!デザインパターン 3. ぼくにもわかるデザインパターン 第2 章

    GoF パターン大カタログ ~パターンがみるみる頭にしみこむ~ 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 53