クソコード動画『カプセル化 Mk-II』 で考える 上手くカプセル化できない理由 / encapsulation2
by
MinoDriven
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
クソコード動画『カプセル化 Mk-II』 で考える 上手くカプセル化できない理由 2024/03/24(日) お茶の水女子大学 オブジェクト指向カンファレンス2024 #ooc_2024 ミノ駆動 ( @MinoDriven )
Slide 2
Slide 2 text
この動画の解説スライドです クソコード動画『カプセル化 Mk-II』
Slide 3
Slide 3 text
ミノ駆動 エンゲージメント向上サービスを手掛ける 株式会社スタメンで働いています アプリケーションアーキテクトとして 以下設計全般に取り組んでおります ● 技術的負債の解消 ● アーキテクチャの再設計 ● 拡張性向上設計 ● エンジニアへの設計サポート(助言、提案など) @MinoDriven
Slide 4
Slide 4 text
著書紹介 『良いコード/悪いコードで学ぶ設計入門』 技術的負債を作り込まない 変更容易性の高い設計を学ぶ 初級〜中級向け入門書 新卒エンジニアに最適です 輪読会も多数開催されております 発売 23ヶ月で 11刷重版 発行部数 3万部 超え
Slide 5
Slide 5 text
ITエンジニア本大賞2023 大賞受賞
Slide 6
Slide 6 text
ここから本題です
Slide 7
Slide 7 text
カプセル化 とは データとそのデータを操作するロジックをひとまとめに すること。 クラスベースオブジェクト指向言語では、カプセル化の 手段としてクラスが提供されている。 インスタンス変数とインスタンス変数を操作するメソッ ドとしてクラスにひとまとめにする。 正常に操作可能なメソッドのみ実装し、公開する (setterは不正値も含めどんな値でも代入できてしまう ため避けること)。 Class field : type method() インスタンスメソッドは、必ず 自身のインスタンス変数を使 うこと
Slide 8
Slide 8 text
関心の分離 とは 関心ごとに構成を分離する考え方。カプセル化と表裏一体の関係にある。 関心単位でカプセル化することにより、異なる関心を分離隔離できる。 関心単位で分離することにより、ある関心の変更が別の関心に影響しなくなる。ある関 心について考えている間、別の関心を忘れることができ、認知負荷が低減する。総じて 保守や変更に強くなる。 関心事A用の クラス 関心事B用の クラス
Slide 9
Slide 9 text
ところが
Slide 10
Slide 10 text
上手くカプセル化したつもりでも壊されてしまう
Slide 11
Slide 11 text
状況により必要なデータ、不必要なデータが違う
Slide 12
Slide 12 text
予期しない変更影響が生じる、変更に弱くなってしまう
Slide 13
Slide 13 text
一体なぜだろう? こんなに頑張って設計してるのに…
Slide 14
Slide 14 text
ていうか 関心って何だよ!?
Slide 15
Slide 15 text
カプセル化と関心について 整理します
Slide 16
Slide 16 text
本発表の一番大事なこと それは…
Slide 17
Slide 17 text
目的
Slide 18
Slide 18 text
目的
Slide 19
Slide 19 text
目的
Slide 20
Slide 20 text
大事なことなので 3回言いました
Slide 21
Slide 21 text
目的を軸に カプセル化を紐解いていきます
Slide 22
Slide 22 text
システムとは一体なにか?
Slide 23
Slide 23 text
【手段】 目的のために手段が編み出される 【目的】 目的地に はやく行きたい
Slide 24
Slide 24 text
【手段】 【手段】 【手段】 システムとは目的達成手段 【目的】 食べ物を温めたい 【目的】 髪を乾かしたい 【目的】 掃除したい
Slide 25
Slide 25 text
当然ITシステムも目的達成手段 【目的】 商品を売買したい 【目的】 意思疎通したい 【手段】 ECサイト 【手段】 SNS
Slide 26
Slide 26 text
重要観点 システムは手段 手段には目的がある
Slide 27
Slide 27 text
目的の構造特性
Slide 28
Slide 28 text
【目的】 山登りしたい たとえば「山登りしたい」という目的があるとする。 何も考えずに山は登れるものでしょうか…?? いろいろリスクが考えられますね。
Slide 29
Slide 29 text
目的があってはじめて問題が顕在化する 【目的】 山登りしたい 【問題】 急な気温変化 (低体温症、熱中症) 【問題】 遭難 【問題】 虫刺され
Slide 30
Slide 30 text
そして問題は(上位目的に対する)下位目的となる 【上位目的】 山登りしたい 【下位目的】 急な気温変化に 対応したい 【下位目的】 正しいルートを 把握したい 【下位目的】 虫刺されを 防ぎたい
Slide 31
Slide 31 text
各目的に対応する解決手段を用意する 【上位目的】 山登りしたい 【下位目的】 急な気温変化に 対応したい 【下位目的】 正しいルートを 把握したい 【下位目的】 虫刺されを 防ぎたい 【手段】 登山ウェア 【手段】 地図 GPS 【手段】 虫除けスプレー おにやんまくん
Slide 32
Slide 32 text
つまり目的が決まることで 目的達成に必要な要素が洗い出される 【超重要】 各目的それぞれで 必要な要素は異なる
Slide 33
Slide 33 text
ECサイトの目的「商品売買」も下位目的に分解可能 【上位目的】 商品を売買したい 【下位目的】 在庫管理したい 【下位目的】 注文したい 【下位目的】 配送したい
Slide 34
Slide 34 text
やはり各目的それぞれで必要な要素やルールが異なる 【上位目的】 商品を売買したい 【下位目的】 在庫管理したい 【下位目的】 注文したい 【下位目的】 配送したい 発注金額 在庫量 安定在庫量 在庫回転期間 入庫ルール 発注ルール 商品 注文数 注文金額 支払い方法 ポイントバック 注文ルール 梱包サイズ 総重量 配送元 配送先 配送ルート 配送ルール
Slide 35
Slide 35 text
ちなみに目的の構造特性についてはこの書籍が詳しいです
Slide 36
Slide 36 text
ところで話は変わって 都市伝説「電子レンジと濡れた猫」
Slide 37
Slide 37 text
ある人が濡れた猫を乾かしてあげようと猫を電子レンジに入れて 温めたところ猫が死んでしまったという都市伝説 な、なにをするつもりだ、ヤメロ…!! アバーーーーーーーーー!!!!!!
Slide 38
Slide 38 text
電子レンジを目的外に利用してしまった。 家電製品の取扱説明書にも「目的外の使用で損害が生じ た場合保証できない」とある。 【目的】 食べ物を温めたい 【手段】 電子レンジ 【目的】 猫を乾かしたい 【超重要】手段から見て、対応する目的はひとつ
Slide 39
Slide 39 text
主張 ソフトウェアでも 同じことが言える
Slide 40
Slide 40 text
【目的】 注文したいですわ 【目的】 予約したいですわ 【目的】 映画を沢山観たいですわ 商品 注文数 注文金額 支払い方法 注文ルール ポイント還元率 商品 注文数 注文金額 支払い方法 予約日時 予約ルール ポイント還元率 プラン名 地域 支払い方法 サブスクルール ポイント還元率 各目的それぞれで必要な要素やルールが異なる
Slide 41
Slide 41 text
【手段】 注文明細クラス 【目的】 注文したいですわ 【目的】 予約したいですわ 【目的】 映画を沢山観たいですわ そ、そんなみんなの願いをいっぺん に叶えられるわけ…… どああああああああ!!!! 注文明細クラスが多目的に使われていたのが原因。 各目的(関心)のデータやルールが混在してしまい、なんとか動作 させるためにむりやりsetterを追加する、例外的な処理を加えるな ど、カプセル化を破らねばならなかった。
Slide 42
Slide 42 text
どうカプセル化すべきだったか 【目的】 注文したいですわ 【目的】 予約したいですわ 【目的】 映画を沢山観たいですわ 【手段】 予約クラス 【手段】 注文クラス 【手段】 映画サブスク 注文クラス クラスが単目的になるよう設計する。ぞれぞれ、たったひとつの 目的を確実に達成できるようデータやロジックをカプセル化する。
Slide 43
Slide 43 text
モデリングの話
Slide 44
Slide 44 text
保守性、変更容易性を高めるには なんといってもモデリング
Slide 45
Slide 45 text
みなさん上手く モデリングできていますか?
Slide 46
Slide 46 text
どういう観点で モデリングしていますか?
Slide 47
Slide 47 text
商品モデル 例えばECサイトのモデリングを考えてみます 商品モデル……これでいいのでしょうか?? もうイヤな予感しかしないですね
Slide 48
Slide 48 text
【手段】 商品モデル 【目的】 在庫管理 【目的】 注文 【目的】 配送 あらゆる目的と結びついて あっという間に巨大化複雑化します
Slide 49
Slide 49 text
モデル とは ドメインにおける選択された側面を記述し、そのドメインに関 連した問題を解決するのに使用できる抽象の体系。(*1) (*1)『エリック・エヴァンスのドメイン駆動設計』著: Eric Evans、監訳:今関剛、訳:和智右桂、牧野祐子、 2011年 刊行、翔泳社、p.519より引用 意訳)問題解決のために、物事の特定の側面を抽象化し たもの
Slide 50
Slide 50 text
抽象化といっても どう抽象化すればいいんだろう?
Slide 51
Slide 51 text
目的論的抽象
Slide 52
Slide 52 text
https://qiita.com/hirokidaichi/items/61ad129eae43771d0fc3
Slide 53
Slide 53 text
『スケールする要求を支える仕様の「意図」と「直交性」』、著:広木大地 より引用 https://qiita.com/hirokidaichi/items/61ad129eae43771d0fc3 (この記事では隠れた意図 (目的)を探り当てることで、直交性が高くなる、すならち変更に強い構造 が得られる旨が解説されています )
Slide 54
Slide 54 text
存在論的な抽象化では 目的に合う要素だけを上手く抽出できない 目的論的な抽象化だと 目的に合う要素を上手く抽出できる
Slide 55
Slide 55 text
冒頭で解説した重要観点 システムは手段 手段には目的がある
Slide 56
Slide 56 text
対象物に付随する様々な特徴のうち、 ある目的に合致した特 徴のみを抜き出すこと(*2) (*2)『「具体⇄抽象」トレーニング 思考力が飛躍的にアップする 29問』 著:細谷功, PHPビジネス新書, p.97より引 用 書籍『「具体⇄抽象」トレーニング』では 抽象化を次のように説明しています。
Slide 57
Slide 57 text
つまりモデルとは何かを整理すると モデル:ある目的を達成するために、目的に合致した特徴の みを抜き出し、他を捨て去ったもの。 モデリング:特徴を抜き出し、他を捨て去る活動。 であると考えます。 唯一無二の真のモデルなどは存在しません。そこにあるのは 単なる選択であり、目的を満たすためのモデルを選択しなけ ればなりません。(*3) (*3)『セキュア・バイ・デザイン 安全なソフトウェア設計』著: Dan Bergh Johnsson、Daniel Deogun、Daniel Sawano、訳:須田智之、2021年刊行、マイナビ出版、 p.90より引用 【重要】他の目的の要素は捨て去れ、ということ 捨てないと他の関心が混ざり込んでしまう
Slide 58
Slide 58 text
【手段】 注文品モデル 【目的】 在庫管理 【目的】 注文 【目的】 配送 【手段】 配送品モデル 【手段】 在庫品モデル 目的を丁寧に見分けて区分し(←ココ重要)、 各目的の達成に必要な特徴のみを抜き出し、モデルにしよう。
Slide 59
Slide 59 text
今日から使える! 適切にカプセル化するための 目的駆動アプローチ
Slide 60
Slide 60 text
カプセル化と関心(目的)の分離の基本 ● クラスを多目的に流用すると整合性維持が困難になります。変更に弱くなります。 ● クラスは単目的になるよう設計しましょう。 ● 目的の違うものは、それぞれ別のクラスに分離し、カプセル化しよう。
Slide 61
Slide 61 text
複雑なクラスを解消するための要点 ● 複雑で混乱したクラスがある場合、複数の目的のために利用されていないか疑い ましょう。 ● 似たような目的が複数ある場合、見分けがつきにくいので要注意です。 ● 目的が異なると、扱うデータやロジックに差異が生じます。ある状況ではこのデータ は使わない、または状況によって用いるロジックが違う場合、複数の目的が混在し ている可能性大です。 ● フラグやenumで処理を切り替えている箇所は、複数の目的に対応するために処理 (手段)を切り替えている可能性大です。 ● 目的を列挙、整理しましょう。そして各目的に特化したクラスを再設計しましょう。
Slide 62
Slide 62 text
要求分析 ● PdMやドメインエキスパートとは、目的について話し合いましょう。目的とはたとえ ば顧客要求やプロダクトが提供したい価値です。 ● 問題は目的があって初めて顕在化します。「こういう問題を解決したい」という話に なったら、なぜその問題を解決したいのか、根本にある目的を探りましょう ● 目的は人から生じます。ユースケース分析ではアクターを必ず洗い出しましょう。そ して各アクターがどんな目的を持っているのか定義しましょう。このとき、微妙に異 なる目的が含まれていないか特に注意です。目的が違っていたらアクターを分けま しょう。目的:アクター=1:1。
Slide 63
Slide 63 text
仕様策定 ● 手段に対して目的は1つです。そして仕様は目的達成のための手段です。 ● ある仕様がどの目的に対応するものか確認しましょう。 ● 仕様変更は特に注意が必要です。既存仕様が別に仕様に変わった場合、または 付随仕様が追加される場合、目的に変化がないか、別の目的が加わっていないか 注意しましょう。 ● 仕様書だけマルナゲされた場合、目的がわかりません。必ず目的を確認しにいきま しょう。
Slide 64
Slide 64 text
……ここで終わりなんですが
Slide 65
Slide 65 text
伝えたいことが多すぎて このスライドに全然おさまらん! 本1冊書けてしまう
Slide 66
Slide 66 text
というわけで
Slide 67
Slide 67 text
特報
Slide 68
Slide 68 text
性懲りもなく また本を書くことにしました
Slide 69
Slide 69 text
その名も
Slide 70
Slide 70 text
良いコード/悪いコードで学ぶ 目的駆動設計(仮)
Slide 71
Slide 71 text
目的を主軸に、保守性や変更容易性の高いコードを設計するに はどうすればいいかを解説する設計本。 今までよく分からなかった原理原則が、目的を切り口に理解でき るようになる。 前作同様膨大なサンプルコード付きで解説。
Slide 72
Slide 72 text
乞うご期待
Slide 73
Slide 73 text
クソコード動画は このあとX(旧Twitter)に投下します リツイートしてくれると嬉しいです
Slide 74
Slide 74 text
ご清聴ありがとうございました