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

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

k-abe
December 15, 2024

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

2024/12/16 社内勉強会の資料
Builder・Strategy・Compositeをテーマにしている。

※URLリンクが有効な資料は下記を参照してください。
https://www.docswell.com/s/juraruming/5227LN-2024-12-16-122142

k-abe

December 15, 2024
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 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 3
  2. 開発環境構築 サンプルコードのコンパイル、実行にjava (JDK )のインストールが 必要です。 下記のページなどを参照し、ご自分のPC のOS に合わせてインストー ルしてください。 【2024

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

    。 →必要なものが凝集している状態 キッチン周りに洗濯機はいらない。料理をつくるという関心ごとに洗 濯機は不要。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 14
  4. 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
  5. テキストの場合 $ java Main text HTML の場合 $ java Main

    html マークダウンの場合 $ java Main md 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 30
  6. サンプルプログラムの実行結果(テキストの場合) $ java Main text ============================== 『Greeting』 ▪一般的なあいさつ  ・How are

    you?  ・Hello.  ・Hi. ▪時間帯に応じたあいさつ  ・Good morning.  ・Good afternoon.  ・Good evening. ============================== 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 31
  7. Builder パターンのまとめ 1. 誰が何を知っているか 2. 依存性の注入(Dependency Injection ≒ DI )

    【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 36
  8. 1. 誰が何を知っているか Main はBuilder クラスのメソッドをしらない。 Director クラスのconstruct メソッドで文章を作れることは知ってい る。 Main

    としてはそれでOK 。 Director クラスはBuilder クラスのみをしっている。 Builder クラスのサブクラス(テキスト・HTML ・マークダウン)の 詳細はしらない。 Director クラスはBuider クラスのメソッドを使っている。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 37
  9. 2. 依存性の注入(Dependency Injection ≒ DI ) Director クラスはBuilder クラスを知っている。Builder のサブクラス

    (テキストorHTMLor マークダウン)は知らない  → 依存していない。 Director クラスが文章作成するときは、サブクラスのインスタンス が必要となる。Director クラスを生成するときはサブクラスのイン スタンス(テキストorHTMLor マークダウン)を渡している(依存 性の注入) 。  → Director クラスはサブクラスのインスタンスに依存して動 く、と言える。 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 39
  10. サンプルプログラムのテーマ UMTP 組込みモデリング部会 組込みモデリングカタログ 部品編 -> 目標制御 をテーマとする。 モデルの概要 制御対象の測定値が目標値となるように制御する仕組み

    目標制御の適用例 エアコンの温度制御 自動車の速度制御 その他、多種多様多岐に渡る 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 42
  11. 目標制御のモデル解説 参考資料4. 組込み分野のため のUML モデル解説書 部品編 C001 目標制御 16 ページ

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

    サンプルプログラムでは制 御方式の各制御をStrategy パターンで表現する 【連続講座2 】デザインパターンを学び、ソフトウェ 44
  13. 今回実装したのは図の赤枠の メソッド 開始する(start ) 、初期化 (init ) Strategy パターンでPID 制御

    の部分がON ・OFF 制御、フ ァジー制御、機械学習制御 のバリエーションになる 【連続講座2 】デザインパターンを学び、ソフトウェ 45
  14. Strategy パターンとビジネス活動の連携の例 制御方式 実装コ スト 将来 性 Strategy 適用例 ON

    ・OFF 制御 低 × 社内ハード屋さん確認用にすぐリリー スする PID 制御 中 × 1st リリース ファジィ制 御 高 △ 2nd リリース 機械学習 制御 中 ◦ ・販促。AI ・機械学習と打ち出すと売 れる(かもしれない) ・上位機種 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 50
  15. 制御方式の引数の組合せ 制御方式 引数 コマンド ON ・OFF 制御 onoff java Main

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

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

    機械学習制御の実行結果 $ java Main ml 機械学習制御を開始します... MachineLearningControlStrategy init MachineLearningControlStrategy CalcOperationAmount 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 55
  18. 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
  19. 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
  20. Directory.java, File.java では System.out.println(prefix + "/" + this) のようにクラスのオブジェクトと文字列を加算している。これは toString()

    を実行すること同じになる。 // 文字列表現 @Override public String toString() { return getName() + " (" + getSize() + ")"; } 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 67
  21. サンプルプログラムの解説 Directory.java add メソッドでディレクトリの中にディレクトリまたはファイルを入 れる。 追加するもの(引数のentry )はEntry 型になっていることがポイン ト。 ディレクトリ・ファイルをEntry

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

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

    System.out.println(prefix + "/" + this); for (Entry entry: directory) { entry.printList(prefix + "/" + name); } } 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 70
  24. サンプルプログラムの解説 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
  25. 3. ディレクトリにファイル追加 4. 作成した構成を表示 bindir.add(new File("vi", 10000)); // 3 bindir.add(new

    File("latex", 20000)); // 3 rootdir.printList(); // 4 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 72
  26. ディレクトリ・ファイル以外のComposite パターン適用例 参考資料1 に記載のプログラムの動作テストの例 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう KeyboardTest ではキーボードからの入力テストを行う。 FileTest ではファイルからの入力テストを行う。

    NetworkTest ではネットワークからの入力テストを行う。 KeyboardTest, FileTest, NetworkTest をまとめて扱い、 InputTest という入力テストにする 複数の出力テストをまとめたOutputTest も作れそう。 InputTest とOutputTest を合わせてInputOutputTest という入出 力テストもつくれそう。 “ “ 74
  27. 参考資料 1. Java 言語で学ぶデザインパターン入門 第3 版 2. 直撃!デザインパターン 3. ぼくにもわかるデザインパターン 第2 章

    GoF パターン大カタログ ~パターンがみるみる頭にしみこむ~ 4. 組込み分野のためのUML モデル解説書 部品編 C001 目標制御 【連続講座2 】デザインパターンを学び、ソフトウェア設計に生かそう 77