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

615 Views

January 22, 25

スライド概要

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

profile-image

組込みソフトウェアエンジニア。 技術バックボーンは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 よろしくね。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

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

2.

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

3.

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

4.

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

5.

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

6.

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

7.

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

8.

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

9.

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

10.

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

11.

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

12.

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

13.

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

14.

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

15.

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

16.

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

17.

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

18.

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

19.

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

20.

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

21.

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

22.

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

23.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう Facade 参考資料1 章題 【シンプルな窓口】 Facade のクラスはクラインアントにシンプルな処理の窓口を提供す る。 Facade のクラスはシステム内部のクラスを正しく利用する(システ ム内部のクラスの依存関係を理解・把握し、正しい処理の順番で実 行する)。システム内部のごちゃごちゃをクライアントに見せな い。 23

24.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラム例 テーマ:参考資料1のWebページ(ユーザ名を表示するシンプルなも の)を作成するプログラム。 Web ページは以下の構造を持つ。 タイトル 段落 リンク メールアドレスのリンク 24

25.

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

26.

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

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

サンプルプログラムの実行結果

$ 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>

27

28.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう welcome.html をブラウザで表示したところ 28

29.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの解説 29

30.

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

31.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう パターンのまとめ システム内部の複雑さを単純にできる シンプルな窓口を提供する→外部との結合が疎になる→部品として 再利用できる Facade 31

32.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう Observer 参考資料1 章題 【状態の変化を通知する】 observer は、観察 (observe) する人、観察者という意味とのこと 観察対象の状態が変化したことを観察者に通知する。状態変化に応 じた処理を記述するときに便利 Publish-Subscribe パターン(出版 - 購読)と呼ばれることもあるら しい。 32

33.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう ROS2 のPublish-Subscriber通信 “ https://docs.ros.org/en/humble/Tutorials/Beginner-CLITools/Understanding-ROS2-Topics/Understanding-ROS2Topics.html 33

34.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの例 テーマ: 数(0〜49のランダムな整数を20個)をObserverに通知する。通 知を受けたObserverはそれぞれの方法で数を表示する。 Observer 1. DigitObserver は数字で数を表示する Observer 2. GraphObserver はグラフ (*) で数を表示する 34

35.

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

36.

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

37.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの実行結果 DigitObserver と GraphObserver の表示の組が 20 個あるが省略 $ java Main DigitObserver:9 GraphObserver:********* DigitObserver:13 GraphObserver:************* DigitObserver:30 GraphObserver:****************************** DigitObserver:23 GraphObserver:*********************** DigitObserver:34 GraphObserver:********************************** 37

38.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの解説 38

39.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう パターンのまとめ 状態変化を通知するときに使うと便利なパターン 通知を出す側はObserverのことを知らない。 RandomNumberGenerator は Observer が DigitObserver か GraphObserver か知らない。 Observer は通知を出す側を知らない。 DigitObserver ・ GraphObserver は RandomNumberGenerator が通知を出しているこ とを知らない。 →知らないということはクラスを交換できる→変更容易性を高める 設計ができる Observer 39

40.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう State 参考資料1 章題 【状態をクラスとして表現する】 クラスを切り替えると状態の変化を表せる→どんな良いことがある かは後述します 40

41.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう パターンのサンプルプログラム例 テーマ:参考資料1の金庫警備システム State 41

42.

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

43.

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

44.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの実行結果 ターミナルの表示。1秒で1時間経過するようになっている。 State $ 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 44

45.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう の表示。金庫・非常ベル・電話の使用で昼間・夜間の状態に応 じたメッセージが表示される。 GUI 45

46.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの解説の前にStateパターンを使わない場合(状 態をクラスとしない場合)、昼間・夜間で金庫・非常ベル・電話の 使用時の振る舞いをどう実装するか考えてみましょう。 46

47.

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

48.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう パターンを使わない場合(状態をクラスとしない場合)にあり そうな実装例 もし、【メンテナンス中】の状態が追加されたらどうなる??? State 金庫使用時に呼ばれるメソッド() { if (昼間) { // 警備センターに利用の記録 } else if (夜間) { // 警備センターに非常事態の通報 } else if (メンテナンス中) { // メンテナンス中の振る舞い } } // 非常ベル、通常通話使用時のメソッドも同様に状態を追加する 48

49.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの解説 State パターン (DayState, NightState) では前ページの実装と違い、 State パターンのクラスの中に必要な振る舞い doClock doUse doAlarm doPhone が書かれており、状態判断のif文が登場しない。 State パターンは状態の追加に前述の実装例より容易に対応できる。 49

50.

【連続講座3】デザインパターンを学び、ソフトウェ サンプルプログラムの解説 つぎの場合のシーケンス図 昼間に金庫を使用した場合 (DayState の doUse を呼び出 し) 時間経過で昼間から夜間に なった後に金庫を使用した 場合(NightStateのdoUseを 呼び出し) 50

51.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう サンプルプログラムの解説 DayState, NightState は Singleton パターンを適用し、インスタンスが 1 個しか生成できないようにしている。 プログラムを複雑化させない良いアプローチだと思う。 ※Singletonパターンについて1回目の講座資料も参考にしてくださ い。 【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう (Adapter ・ Factory Method ・ Singleton) https://www.docswell.com/s/juraruming/5QRMXX-2024-10-25142836#p41 51

52.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう パターンのまとめ 状態をクラスとして表現した。クラスの中に必要な処理を書いた。 結果、状態遷移判定のif文をなくすことができた 状態の追加に容易に対応できる変更しやすい構造にできた State 52

53.

【連続講座3】デザインパターンを学び、ソフトウェア設計に生かそう 参考資料 言語で学ぶデザインパターン入門 第3版 2. 直撃!デザインパターン 3. ぼくにもわかるデザインパターン 第 2 章 GoF パターン大カタログ ~パターンがみるみる頭にしみこむ~ 1. Java 53

54.

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