Share
Embed
【連続講座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
Transcript
54 slides
-
自己紹介 名前: 阿部 耕二(あべ こうじ) 所属: パーソルクロステクノロジー株式会社 エンジニアリング事業管掌 設計統括本部 第2 電子・制御設計本部 第1 設計部 4G 医療機器の組込みソフトウェア開発。C
言語。 趣味: 宇宙開発(リーマンサットプロジェクト広報メンバー) LAPRAS ポートフォリオ: https://lapras.com/public/k-abe Twitter: @juraruming 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 3 -
開発環境構築 サンプルコードのコンパイル、実行にjava (JDK )のインストールが 必要です。 下記のページなどを参照し、ご自分のPC のOS に合わせてインストー ルしてください。 【2024
年版】Java JDK のインストール方法(Windows & Mac 対応) 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 4 -
サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.java があるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラムの実行はつぎのコマンドで行う。 $ java
Main 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 6 -
1. 凝集度 関心ごとの集まり 凝集度が高い方(関心ごとが一箇所に集まっている)が良い設計と 言われる 1 つの目的・責務になっていることが望ましい 例)料理を作る場面 キッチン周りには料理に必要な設備が配置される(水道、冷蔵庫、コ ンロ、食器棚、その他)
。 →必要なものが凝集している状態 キッチン周りに洗濯機はいらない。料理をつくるという関心ごとに洗 濯機は不要。 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 14 -
3. 関心の分離 関心ごとを分離し、境界を設ける 関心の分離が表現されている例としてOSI 参照モデル・TCP/IP に注 目する 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 画像引用元
OSI 参照モデルとは?TCP/IP との違いを図解で解説 “ “ 16 -
クラス図とコードの写経をセットで行う コードだけ見ていても各クラスの全体の関係性がわかりずらい。 クラス図だけを見ていても抽象的で本当に動くのか疑問がわく。 設計図(抽象) ⇔ コード(具体的)の世界を行ったり来たり することで整理できたり、気づきが得られることがあると思う。 今回のサンプルコードはJava 。デザインパターンの考え方・実装 は特定のプログラミング言語に限定されないと思うので自分が得 意な言語で実装してみると理解が深まると思う。
参考資料2 ではC# 、 C++ 、 Go 、 Java 、 PHP 、 Python 、 Ruby 、 Rust 、 Swift 、 TypeScript で実装例を提示してくれている。 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 21 -
Facade 参考資料1 章題 【シンプルな窓口】 Facade のクラスはクラインアントにシンプルな処理の窓口を提供す る。 Facade のクラスはシステム内部のクラスを正しく利用する(システ ム内部のクラスの依存関係を理解・把握し、正しい処理の順番で実
行する) 。システム内部のごちゃごちゃをクライアントに見せな い。 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 23 -
サンプルプログラム例 テーマ:参考資料1 のWeb ページ(ユーザ名を表示するシンプルなも の)を作成するプログラム。 Web ページは以下の構造を持つ。 タイトル 段落 リンク
メールアドレスのリンク 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 24 -
サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.java があるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラムの実行はつぎのコマンドで行う。 $ java
Main 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 26 -
サンプルプログラムの実行結果 $ 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 -
Observer 参考資料1 章題 【状態の変化を通知する】 observer は、観察(observe) する人、観察者という意味とのこと 観察対象の状態が変化したことを観察者に通知する。状態変化に応 じた処理を記述するときに便利 Publish-Subscribe
パターン(出版- 購読)と呼ばれることもあるら しい。 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 32 -
サンプルプログラムの例 テーマ: 数(0 〜49 のランダムな整数を20 個) をObserver に通知する。通 知を受けたObserver はそれぞれの方法で数を表示する。
Observer 1. DigitObserver は数字で数を表示する Observer 2. GraphObserver はグラフ(*) で数を表示する 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 34 -
サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.java があるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラムの実行はつぎのコマンドで行う。 $ java
Main 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 36 -
サンプルプログラムの実行結果 DigitObserver とGraphObserver の表示の組が20 個あるが省略 $ java Main DigitObserver:9 GraphObserver:*********
DigitObserver:13 GraphObserver:************* DigitObserver:30 GraphObserver:****************************** DigitObserver:23 GraphObserver:*********************** DigitObserver:34 GraphObserver:********************************** 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 37 -
Observer パターンのまとめ 状態変化を通知するときに使うと便利なパターン 通知を出す側はObserver のことを知らない。 RandomNumberGenerator はObserver がDigitObserver か GraphObserver
か知らない。 Observer は通知を出す側を知らない。DigitObserver ・ GraphObserver はRandomNumberGenerator が通知を出しているこ とを知らない。 →知らないということはクラスを交換できる→変更容易性を高める 設計ができる 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 39 -
サンプルプログラムのビルド方法 サンプルプログラムのディレクトリ(Main.java があるディレクトリ) に移動しつぎのコマンドでビルドする。 $ javac Main.java プログラムの実行はつぎのコマンドで行う。 $ java
Main 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 43 -
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 -
State パターンを使わない場合(状態をクラスとしない場合)にあり そうな実装例 金庫使用時に呼ばれるメソッド() { if (昼間) { // 警備センターに利用の記録
} else if (夜間) { // 警備センターに非常事態の通報 } } // 非常ベル、通常通話使用時のメソッドは省略 メソッドの中に状態のif 文がある→コードが複雑になる要因のひと つ 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 47 -
State パターンを使わない場合(状態をクラスとしない場合)にあり そうな実装例 もし、 【メンテナンス中】の状態が追加されたらどうなる??? 金庫使用時に呼ばれるメソッド() { if (昼間) {
// 警備センターに利用の記録 } else if (夜間) { // 警備センターに非常事態の通報 } else if (メンテナンス中) { // メンテナンス中の振る舞い } } // 非常ベル、通常通話使用時のメソッドも同様に状態を追加する 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 48 -
サンプルプログラムの解説 State パターン(DayState, NightState) では前ページの実装と違い、 State パターンのクラスの中に必要な振る舞い doClock doUse doAlarm
doPhone が書かれており、状態判断のif 文が登場しない。 State パターンは状態の追加に前述の実装例より容易に対応できる。 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 49 -
サンプルプログラムの解説 つぎの場合のシーケンス図 昼間に金庫を使用した場合 (DayState のdoUse を呼び出 し) 時間経過で昼間から夜間に なった後に金庫を使用した 場合(NightState
のdoUse を 呼び出し) 【連続講座3 】デザインパターンを学び、ソフトウェ 50 -
サンプルプログラムの解説 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 -
参考資料 1. Java 言語で学ぶデザインパターン入門 第3 版 2. 直撃!デザインパターン 3. ぼくにもわかるデザインパターン 第2 章
GoF パターン大カタログ ~パターンがみるみる頭にしみこむ~ 【連続講座3 】デザインパターンを学び、ソフトウェア設計に生かそう 53