Upload
Download free for 30 days
Login
Submit search
凝集度と責務
Download as PPTX, PDF
0 likes
376 views
Toshinori Chiba
社内向けに凝集度と責務について紹介、発表した資料です。
Software
Read more
1 of 33
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
More Related Content
PDF
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
PDF
例外設計における大罪
Takuto Wada
PDF
分散システムの限界について知ろう
Shingo Omura
PDF
Java仮想マシンの実装技術
Kiyokuni Kawachiya
PPTX
分散システムについて語らせてくれ
Kumazaki Hiroki
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
PPTX
C#で速度を極めるいろは
Core Concept Technologies
PDF
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
Masashi Shibata
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
例外設計における大罪
Takuto Wada
分散システムの限界について知ろう
Shingo Omura
Java仮想マシンの実装技術
Kiyokuni Kawachiya
分散システムについて語らせてくれ
Kumazaki Hiroki
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba
C#で速度を極めるいろは
Core Concept Technologies
サイバーエージェントにおけるMLOpsに関する取り組み at PyDataTokyo 23
Masashi Shibata
What's hot
(20)
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
PDF
トランザクションの並行実行制御 rev.2
Takashi Hoshino
PDF
10GbE時代のネットワークI/O高速化
Takuya ASADA
PDF
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
Yoshifumi Kawai
PDF
WebAssemblyのWeb以外のことぜんぶ話す
Takaya Saeki
PDF
プログラミングコンテストでの動的計画法
Takuya Akiba
PDF
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
PDF
Tackling Complexity
Yoshitaka Kawashima
PDF
AtCoder Beginner Contest 035 解説
AtCoder Inc.
PDF
目grep入門 +解説
murachue
PDF
できる!並列・並行プログラミング
Preferred Networks
PPTX
トランザクションの設計と進化
Kumazaki Hiroki
PDF
オブジェクト指向エクササイズのススメ
Yoji Kanno
PDF
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
PDF
sysloadや監視などの話(仮)
Takanori Sejima
PDF
Ethernetの受信処理
Takuya ASADA
PDF
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
Preferred Networks
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
PDF
雑なMySQLパフォーマンスチューニング
yoku0825
PDF
ゲームのインフラをAwsで実戦tips全て見せます
infinite_loop
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
トランザクションの並行実行制御 rev.2
Takashi Hoshino
10GbE時代のネットワークI/O高速化
Takuya ASADA
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
Yoshifumi Kawai
WebAssemblyのWeb以外のことぜんぶ話す
Takaya Saeki
プログラミングコンテストでの動的計画法
Takuya Akiba
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
Tackling Complexity
Yoshitaka Kawashima
AtCoder Beginner Contest 035 解説
AtCoder Inc.
目grep入門 +解説
murachue
できる!並列・並行プログラミング
Preferred Networks
トランザクションの設計と進化
Kumazaki Hiroki
オブジェクト指向エクササイズのススメ
Yoji Kanno
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
sysloadや監視などの話(仮)
Takanori Sejima
Ethernetの受信処理
Takuya ASADA
Kaggle Happywhaleコンペ優勝解法でのOptuna使用事例 - 2022/12/10 Optuna Meetup #2
Preferred Networks
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
雑なMySQLパフォーマンスチューニング
yoku0825
ゲームのインフラをAwsで実戦tips全て見せます
infinite_loop
Ad
Similar to 凝集度と責務
(18)
PPTX
凝集度と責務
Toshinori Chiba
PDF
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
PPTX
PHP基礎勉強会
Yuji Otani
PDF
Hokkaido.pm #11
moznion
PPTX
プログラミング勉強会 その0
Hirokazu Fukami
PPTX
可読性について リーダブルコード part1(表面上の改善)
tak
PPTX
20100324 勉強会資料(ドメイン駆動)
Masayuki Kanou
PDF
アプリでもオブジェクト指向エクササイズ(Potatotips#3)
Shoichi Matsuda
PDF
Nds#24 単体テスト
Kazumune Katagiri
PDF
Hey It's Not My TDD!
Yasui Tsutomu
PDF
ノーコード・ローコード開発の意義
千紘 佐野
PDF
読みやすいプログラム、書き換えやすいプログラム
amusementcreators
PPT
ジェネリクスの概論とか
nagise
PDF
Tdd
Takaya Kotohata
PPTX
古い?ダサい?まだまだイケルChef!
Naoto Ishizawa
PPT
Start!! Ruby
mitim
PDF
Howtoよいデザイン
Hiroki Yagita
PPTX
tfug-kagoshima
tak9029
凝集度と責務
Toshinori Chiba
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
PHP基礎勉強会
Yuji Otani
Hokkaido.pm #11
moznion
プログラミング勉強会 その0
Hirokazu Fukami
可読性について リーダブルコード part1(表面上の改善)
tak
20100324 勉強会資料(ドメイン駆動)
Masayuki Kanou
アプリでもオブジェクト指向エクササイズ(Potatotips#3)
Shoichi Matsuda
Nds#24 単体テスト
Kazumune Katagiri
Hey It's Not My TDD!
Yasui Tsutomu
ノーコード・ローコード開発の意義
千紘 佐野
読みやすいプログラム、書き換えやすいプログラム
amusementcreators
ジェネリクスの概論とか
nagise
Tdd
Takaya Kotohata
古い?ダサい?まだまだイケルChef!
Naoto Ishizawa
Start!! Ruby
mitim
Howtoよいデザイン
Hiroki Yagita
tfug-kagoshima
tak9029
Ad
凝集度と責務
1.
凝集度と責務 トイレのレバーが遠すぎて流すことができません T.Chiba
2.
今回のテキスト keywords DDD, オブジェクト指向
3.
プログラムを初めて勉強したとき 「同じ処理は共通化することで、効率化を測るのがいいプログラムである」 みたいなことを勉強する
4.
DRY(Don’t Repeat Yourself)原則(っぽい何か) 同じコードを書くな! 処理を共通化して、ロジックを1箇所に! それで修正するときは1箇所の修正で済むのだ!
5.
DRY原則(本物) すべての知識はシステム内において、単一、かつ明確な、そして 信頼できる表現になっていなければならない。 (達人プログラマ 第2章 7
二重化の過ち)
6.
完全に理解した フルネームってつまり、間に空白がある文字列。よし、共通化だ! ※普段もうこんなコード書かないので頑張って絞り出した 共通機能ライブラリ 方式(CommonとかUtil とか)
7.
共通化が保守性を下げている。。? middleNameも追加で。 えっ。。
8.
おかしい。。共通化した箇所、修正のたびに影 響範囲は広くて修正しづらい。 てか、この関数何用の関数なんだ? 邪魔だなこの関数。
9.
何がおかしかったのか?
10.
「データクラス」と「機能クラス」に別れた 手続き型の設計になってしまっていた
11.
手続的設計でおこる ダメな共通化 共通機能ライブラリ ● 汎用的な共通関数 ● 用途ごとに細分化した共 通関数
12.
汎用的な共通関数 手続的設計でおこるダメな共通化1
13.
用途ごとに細分化し た共通関数 手続的設計で起こるダメな共通化2
14.
クラスはデータとロジ ックを一緒に扱うため の機能 オブジェクト指向をやろう
15.
本来あって欲しかった姿
16.
手続的設計からオブジェクト指向へ ● データをロジックを分ける実装では距離が離れすぎてどこで何をしているかの見通しがつかな くなる。 ● 機能・操作に着目すると手続的になりがち。 ●
DRY原則は処理をまとめる共通化のことではない。知識をシステム内で単一にしろという話。 ● オブジェクトに注目することでDRY原則を満たせるようになる。
17.
いい設計をするため に必要な2つの視点 ● 凝集度 ● 責務 オブジェクト指向らしく設計する ために
18.
凝集度 関連性の高いデータとロジックだけを集めたクラスを凝集度が高いと言う。
19.
責務 責務は、ソフトウェアオブジェクトについて大ざっぱに記述したものです。責務には、以下の3つの 主要な項目が含まれます。 ● オブジェクトが行う動作 ● オブジェクトが持つ知識 ●
オブジェクトが他に影響を与える主要な判断 (オブジェクトデザイン 4.1 責務とは何か)
22.
「トイレ」クラスの例 低凝集な実装とは、トイレで用を足して、流そうとしたら流すための レバーが100m先の他人の家のキッチンにあるような状態のこと。 責務が不明瞭とは、炊飯機能付きトイレのようなもの。
23.
トイレの仕様 ● タンク(便器で水を貼っているところ)を持つ ● 流すことができる
24.
低凝集なトイレ
25.
責務がおかしいトイレ
26.
高凝集かつ責務が正しいトイレ
27.
オブジェクト指向らしい設計にするには ● メソッドをロジックの置き場所にする ● ロジックを、データを持つクラスに移動する ●
使う側のクラスにロジックを書き始めたら、設計を見直す ● メソッドを短くして、ロジックの移動をやりやすくする ● メソッドでは必ずインスタンス変数を使う ● クラスが肥大化したら小さく分ける ● パッケージを使ってクラスを整理する 現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法 増田 亨
28.
危険な臭い やりがちで、低凝集、責務不明瞭を引き 起こす具体例 ● 定数クラス ● Common,
Utilクラス 低凝集、責務不明瞭の兆候
29.
低凝集の代表、定数クラス 固定値のパターンを表現するのに使われる。 定数をまとめて管理しているので、修正が発生しても修正が容易なように見える。 しかし、その定数がどこでどのように振る舞い、なんのための値なのかが結局のところ変数名くらい しか手がかりがない。 ロジックと値の距離が遠くなりがち
30.
よくあるのはやはり右のような例。 DNAの定義として、Adenine, Thymine, Cytosine, Guanineがありますって言われた時にその対応を Constantsオブジェクトに書いて、判定でConstantsと 比較してしまう。 DNAの仕様表現として浅いし、これ以上何もできない。 Constantsクラスはファットになりがち。 またロジックも各所に出てきちゃうので、DRY的にも NG
31.
sealed trait, sealed
abstract class を使って、 固定パターンは表現します。 コードなどの対応がある場合は、ファクト リを準備して生成できるようにしておくと 良いです。 ファクトリはテストが必要です。 これならば、DNAにはどのようなパター ンがあって、それぞれどういう特徴、仕様 を持つのかさらに追加で記述することも可 能です。 どうすべきか?
32.
責務不明瞭の代表、Common, Util クラス この手のクラスが存在する時、どのオブジェクトの振る舞いとして表現すべきかが考えきれていない。 データとそれに対する処理が遠いので、どのクラスで使うのか?なんの値の仕様なのかがわかりにく く、見通しがつかなくなる。 そもそも気づくことも難しいので、似たような処理が複数箇所で作られかねない。
33.
まとめ ● 手続的な設計ではなく、オブジェクト指向に ● データクラスと機能クラスに分けてはいけない ●
いい設計のポイントは凝集度と責務を常に考えること ● 定数クラスやUtilを使わない。おくべき場所が他にあるはず。
Editor's Notes
#5:
って思ってました。
#6:
原点はコードの二重化ではなく、知識の二重化を話している。
#7:
普段書かないから例が出てこないので絞り出しました。 いや、まあね。フルネームの表現は抽象的に考えてたら空白区切りの文字列ですから(ゴミ) UtilやConstantsほど身の危険を感じるobjectもなかなかない。※自分がレビュワーなら即rejectする。 ここまでひどいコードはなかなかないかもしれないが、多分UtilとかConstantsがあるやつは似たようなコードが絶対あると思う。 多分、古いJavaとかの時代だと結構前処理が面倒だったりして使い所あったのだろうけど(知らんけど、それでも、自分ならなるたけ書かないかなぁ。)、Scalaの場合はそんな面倒なコードに(ちゃんと書けば)ならないのでまず要らない。 大体そういう状況はクラス設計が適切じゃないから同じ知識がUtilとなって散在してしまっていることがほとんどだと思う。
#8:
まあ一番感じたのは、リクエストとレスポンスのモデル複数箇所で使ってしまっていたときでしたね。 いやまあ、これは共通化できているとは言えないのだけれど。 UtilとかConstantsがあるとき大体クソ。
#9:
とか
#13:
関数の引数にフラグを書くのはフラグ引数っていう有名なアンンチパターンですね。 詳細Clean Codeの「においと経験則」を参照
#15:
そもそもデータクラスと機能クラスに分ける設計は「クラス」本来の使い方ではない。 むしろJavaが言語の仕組みとしてクラスを採用した意図とは正反対の使い方 クラスはデータとロジックを一つのプログラミング単位にまとめる仕組み データをインスタンス変数として持ち、そのインスタンス変数を使った判断/加工/計算のロジックをメソッドに書くのが、クラス本来の使い方。
#16:
インスタンス変数があって、そしてメソッドがある。 振る舞いを表現している。 これは簡単な例だからそりゃそうだろって思うかもしれないけど、実際のプロダクトレベルだとできてないコードは非常に多い。
#17:
先ほどの例のような設計にしないための視点を紹介します。
#18:
なんとなき、手続的な設計が良くないことは伝わったと思います。 ただ、(僕の例がアレなこともあって)伝わり切ってない気がしますので、いい設計にするために必要な2つの視点を紹介します。
#19:
凝集度はアプリケーション設計の勉強をしていると必ず出てきてかつなかなか説明が見つからない概念です。そしてすごく重要。
#20:
参考 https://qiita.com/j5ik2o/items/a64007c6d7a89ec2e086 もう中古でしか手に入らない感じだけど、オブジェクトデザインって本に責務の定義は書いてある。
#21:
DDDコミュニティを主宰しているログラスの松岡さんの定期ツイートが分かりやすいので紹介します。
#24:
水洗トイレを想像しながら最低限の仕様を考えました。
#25:
機能に着目するとこのような実装になる。 さっきのStringUtilのような実装ですね。 利用者は水洗トイレだと思って使おうとするが、用を足すための穴は空いておらず、流し方もわからない。 まさか、自分で一旦床(メモリ上)に糞を出し、トイレと書かれた箱に入っている壺にそれを入れて、流すにはトイレ箱を川に持っていって流さなければならないとは思わないだろう。
#26:
本を積んで保管するのはトイレの責務ではありません。
#27:
トイレが水や糞尿を保持するタンクを持ち、トイレに対して糞尿をすることができ、流すことができる。 そのオブジェクトが何をするのかを表現する必要がある。
#28:
それぞれの詳細については記載の書籍に書かれています。 増田さん本の内容やイベントで話ている印象だと、こういったアプリケーション設計を現場に浸透させるには極端さが必要だと思っている節があります。 自分もそっち派で、やはり緩いコードレビューでは浸透しないですし、まずは大袈裟に極端にやって、そこから段々と自然体になっていくものだと思ってます。
#29:
やりがちがだけど
#31:
http://xerial.org/scala-cookbook/recipes/2012/06/29/enumeration DNAとか生物的なものがあってるかは知りません。
#33:
これは例割愛します。
Download