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

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

k-abe
October 25, 2024

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう(Adapter・Factory Method・Singleton)

2024/10/25 社内勉強会の資料
より良い設計を目指すための小話、Adapter、Factory Method、Singletonをテーマにしている。

URLリンクが有効な資料はこちらを参照してください。
https://www.docswell.com/s/juraruming/5QRMXX-2024-10-25-142836

k-abe

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

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

    。 →必要なものが凝集している状態 キッチン周りに洗濯機はいらない。料理をつくるという関心ごとに洗 濯機は不要。 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 14
  4. Adapter 参考資料1  章題  【一皮かぶせて再利用】 すでに提供されているものがそのまま使えないときに、必要な形に 変換してから利用する パソコンのAC アダプター(直流12V で動く製品とする) 提供されているもの

    -> 交流100V AC アダプタが変換するもの -> 交流を直流に変換。交流100V をパソ コンが動作する12V に変換する 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 23
  5. アダプタのプラグ部分は取り 外し可能で海外でも使えるよ うに考慮されている(設計し た)と予想できる。 調べてみたらApple ワールド トラベルアダプタキットなる 製品があり、7 種類のプラグ形 状があることがわかった。

    プラグ部分を容易に変更でき る構造になっている。 このように容易に変更できる 構造をソフトウェアにも持ち 込みたい!!! 【連続講座1 】デザインパターンを学び、ソフトウェ 25
  6. Adapter パターンのサンプルプログラム例 テーマ:既にある加算に下限・上限の制限を追加する。 例えば、下限O 、上限100 のときに加算の計算結果が上限値を超えた ら上限値の100 にする。 加算の計算結果が下限値を下回ったら下限値の0 に固定する。

    表 電源の比喩とサンプルプログラムの対応関係 \ 電源の比喩 サンプルプログラム 提供されているもの 交流100 ボルト Calc クラス 変換装置 アダプター LimitCalc クラス 必要なもの 直流12 ボルト Limiter クラス 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 26
  7. Adapter サンプルプログラムの実行結果 $ java Main /***** Calc *****/ ret_val(0 +

    101) = 101 ret_val(0 + (-1)) = -1 /***** LimitCalc *****/ limit min value = 0/limit max value = 100 ret_val(0 + 50) = 50 ret_val(0 + 100) = 100 ret_val(0 + 101) = 100 ret_val(0 + 0) = 0 ret_val(0 + (-1)) = 0 Calc はリミットなしの加算。LimitCalc はリミットありの加算 LimintCalc の下限は0 、上限は100 に設定 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 29
  8. Adapter サンプルプログラムの実行結果 $ java Main /***** IDCardのFactory *****/ Hiroshi Yukiのカードを作ります。

    IDCard [owner=Hiroshi Yuki]を登録しました。 Tomuraのカードを作ります。 IDCard [owner=Tomura]を登録しました。 Hanako Satoのカードを作ります。 IDCard [owner=Hanako Sato]を登録しました。 IDCard [owner=Hiroshi Yuki]を使います。 IDCard [owner=Tomura]を使います。 IDCard [owner=Hanako Sato]を使います。 /***** BussinesCardのFactory *****/ Koji Abeの名刺を作ります。 BusinessCard [owner=Koji Abe]を登録しました。 Riku Abeの名刺を作ります。 BusinessCard [owner=Riku Abe]を登録しました。 BusinessCard [owner=Koji Abe]を使います。 BusinessCard [owner=Riku Abe]を使います。 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 35
  9. Adapter サンプルプログラムの実行結果 IDCard のFactory は参考資料1 のサンプルコード BussinesCard のFactory は今回追加した名刺のFactory と商品の名刺

    フレームワークのパッケージ内は変更せず、具体的な工場・商品の 追加で新しい種類のインスタンス作成ができた 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 36
  10. static Factory Method インスタンス生成のためのクラスメソッド(クラスをインスタンス 化しなくても呼び出し可能なメソッド) GoF のFactory Method パターン違うが、インスタンス生成でよく使 われる手法。

    (個人的に開発シーンでFactory と呼ぶときはこちらを指すことが 多いと思っている) 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 参考資料1 より引用 “ “ 39
  11. static Factory Method java のAPI のstatic Factory Method として参考資料1 で紹介されてい

    るものは以下のとおり java.security.SecureRandom のgetInstance メソッド java.util.List のof メソッド java.util.Arrays のasList メソッド java.lang.String のvalueOf メソッド java.time.Instant のnow メソッド 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 40
  12. Singleton サンプルプログラムの実行結果 $ java Main Start. インスタンスを生成しました。 printjob1とprintjob2は同じインスタンスです。 End. 「インスタンスを生成しました。

    」のメッセージが1 つなので、イン スタンスは1 つのみ生成されている。 getInstance メソッドで取得したインスタンスは同じことを確認でき た 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 46
  13. ディレクトリ名:PrintJob_2_1 Singleton のインスタンス生成の実装を下記に変更(インスタンスが生 成済みかnull チェックするようにした) public class PrintJob { private

    static PrintJob printJob = null; private PrintJob() { System.out.println("インスタンスを生成しました。"); } public static PrintJob getInstance() { if (printJob == null) { printJob = new PrintJob(); } return printJob; } } 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 49
  14. PrintJob_2_2 をコンパイル・実行するとつぎの結果になる。 Start End インスタンスを生成しました。 インスタンスを生成しました。 インスタンスを生成しました。 PrintJob B: obj

    = PrintJob@1151bbe3 PrintJob C: obj = PrintJob@7b63961c PrintJob A: obj = PrintJob@4230a45b 3 つインスタンスをつくっており、異なるインスタンスになってい る。 ※PC 環境によっては結果が異なるかもしれません。私のPC だと毎 回異なるインスタンスになりました。 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 53
  15. Q. 何故、Singleton でなくなったのでしょうか? A. このメソッドの条件判断がマルチスレッドで実行されるため public static PrintJob getInstance() {

    if (printJob == null) { printJob = new PrintJob(); } return printJob; } 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 55
  16. synchronized を付加する public static synchronized PrintJob getInstance() { if (printJob

    == null) { printJob = new PrintJob(); } return printJob; } 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 57
  17. PrintJob_2_3 (synchronized )の実行結果 $ java Main Start End インスタンスを生成しました。 PrintJob

    B: obj = PrintJob@386514c2 PrintJob A: obj = PrintJob@386514c2 PrintJob C: obj = PrintJob@386514c2 インスタンスが1 個だけ作成されており、Singleton 対応できている ことが確認できた。 PrintJob_2_1 のコードが基本形だと思う。 PrintJob_2_1 のコードをマルチスレッド環境で実行してもSingleton 対応できている。 【連続講座1 】デザインパターンを学び、ソフトウェア設計に生かそう 58
  18. 参考資料 1. Java 言語で学ぶデザインパターン入門 第3 版 2. 直撃!デザインパターン 3. ぼくにもわかるデザインパターン 第2 章

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