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

クソコード動画『カプセル化 Mk-II』 で考える 上手くカプセル化できない理由 / encapsulation2

クソコード動画『カプセル化 Mk-II』 で考える 上手くカプセル化できない理由 / encapsulation2

オブジェクト指向カンファレンス2024

クソコード動画『カプセル化 Mk-II』
https://twitter.com/MinoDriven/status/1771763728234537310

下記セッションで用いたスライドです
https://fortee.jp/oocon-2024/proposal/9e935d37-5480-4488-bc6d-3b9ee492106f

MinoDriven

March 22, 2024
Tweet

More Decks by MinoDriven

Other Decks in Programming

Transcript

  1. やはり各目的それぞれで必要な要素やルールが異なる 【上位目的】 商品を売買したい 【下位目的】 在庫管理したい 【下位目的】 注文したい 【下位目的】 配送したい 発注金額

    在庫量 安定在庫量 在庫回転期間 入庫ルール 発注ルール 商品 注文数 注文金額 支払い方法 ポイントバック 注文ルール 梱包サイズ 総重量 配送元 配送先 配送ルート 配送ルール
  2. 【目的】 注文したいですわ 【目的】 予約したいですわ 【目的】 映画を沢山観たいですわ 商品 注文数 注文金額 支払い方法

    注文ルール ポイント還元率 商品 注文数 注文金額 支払い方法 予約日時 予約ルール ポイント還元率 プラン名 地域 支払い方法 サブスクルール ポイント還元率 各目的それぞれで必要な要素やルールが異なる
  3. 【手段】 注文明細クラス 【目的】 注文したいですわ 【目的】 予約したいですわ 【目的】 映画を沢山観たいですわ そ、そんなみんなの願いをいっぺん に叶えられるわけ……

    どああああああああ!!!! 注文明細クラスが多目的に使われていたのが原因。 各目的(関心)のデータやルールが混在してしまい、なんとか動作 させるためにむりやりsetterを追加する、例外的な処理を加えるな ど、カプセル化を破らねばならなかった。
  4. どうカプセル化すべきだったか 【目的】 注文したいですわ 【目的】 予約したいですわ 【目的】 映画を沢山観たいですわ 【手段】 予約クラス 【手段】

    注文クラス 【手段】 映画サブスク 注文クラス クラスが単目的になるよう設計する。ぞれぞれ、たったひとつの 目的を確実に達成できるようデータやロジックをカプセル化する。
  5. 【手段】 注文品モデル 【目的】 在庫管理 【目的】 注文 【目的】 配送 【手段】 配送品モデル

    【手段】 在庫品モデル 目的を丁寧に見分けて区分し(←ココ重要)、 各目的の達成に必要な特徴のみを抜き出し、モデルにしよう。