Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
増田 亨
PDF, PPTX
15,842 views
リーンなコードを書こう:実践的なオブジェクト指向設計
DevLove仙台 オブジェクト設計とリーン開発、その実践 変更しやすく、コードを改善する
Technology
◦
Related topics:
Object-Oriented Concepts
•
Read more
49
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 51
2
/ 51
3
/ 51
4
/ 51
5
/ 51
6
/ 51
7
/ 51
8
/ 51
9
/ 51
10
/ 51
11
/ 51
12
/ 51
13
/ 51
14
/ 51
15
/ 51
16
/ 51
17
/ 51
18
/ 51
19
/ 51
20
/ 51
21
/ 51
22
/ 51
23
/ 51
24
/ 51
25
/ 51
26
/ 51
27
/ 51
28
/ 51
29
/ 51
30
/ 51
31
/ 51
32
/ 51
33
/ 51
34
/ 51
35
/ 51
36
/ 51
37
/ 51
38
/ 51
39
/ 51
40
/ 51
41
/ 51
42
/ 51
43
/ 51
44
/ 51
45
/ 51
46
/ 51
47
/ 51
48
/ 51
49
/ 51
50
/ 51
51
/ 51
More Related Content
PDF
ドメイン駆動で開発する ラフスケッチから実装まで
by
増田 亨
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
by
増田 亨
PPTX
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
PDF
ドメイン駆動設計に15年取り組んでわかったこと
by
増田 亨
PDF
ドメイン駆動設計 本格入門
by
増田 亨
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
PDF
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
PDF
ドメイン駆動設計のための Spring の上手な使い方
by
増田 亨
ドメイン駆動で開発する ラフスケッチから実装まで
by
増田 亨
ドメイン駆動設計 ( DDD ) をやってみよう
by
増田 亨
世界一わかりやすいClean Architecture
by
Atsushi Nakamura
ドメイン駆動設計に15年取り組んでわかったこと
by
増田 亨
ドメイン駆動設計 本格入門
by
増田 亨
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
ドメイン駆動設計のための Spring の上手な使い方
by
増田 亨
What's hot
PDF
世界でいちばんわかりやすいドメイン駆動設計
by
増田 亨
PDF
ドメイン駆動設計サンプルコードの徹底解説
by
増田 亨
PDF
DDD sample code explained in Java
by
増田 亨
PDF
正しいものを正しく作る塾-設計コース
by
増田 亨
PDF
開発速度が速い #とは(LayerX社内資料)
by
mosa siru
PDF
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
PDF
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
PDF
シリコンバレーの「何が」凄いのか
by
Atsushi Nakada
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
PDF
ドメイン駆動設計(DDD)の実践Part2
by
増田 亨
PDF
ドメイン駆動設計 基本を理解する
by
増田 亨
PDF
オブジェクト指向プログラミングのためのモデリング入門
by
増田 亨
PDF
ドメインオブジェクトの見つけ方・作り方・育て方
by
増田 亨
PDF
Python におけるドメイン駆動設計(戦術面)の勘どころ
by
Junya Hayashi
PDF
マイクロにしすぎた結果がこれだよ!
by
mosa siru
PDF
gRPC入門
by
Kenjiro Kubota
PDF
ドメイン駆動設計入門
by
Takuya Kitamura
PDF
ドメインオブジェクトの設計ガイドライン
by
増田 亨
PDF
マイクロサービス 4つの分割アプローチ
by
増田 亨
PDF
オブジェクト指向できていますか?
by
Moriharu Ohzu
世界でいちばんわかりやすいドメイン駆動設計
by
増田 亨
ドメイン駆動設計サンプルコードの徹底解説
by
増田 亨
DDD sample code explained in Java
by
増田 亨
正しいものを正しく作る塾-設計コース
by
増田 亨
開発速度が速い #とは(LayerX社内資料)
by
mosa siru
イミュータブルデータモデル(入門編)
by
Yoshitaka Kawashima
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
シリコンバレーの「何が」凄いのか
by
Atsushi Nakada
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
ドメイン駆動設計(DDD)の実践Part2
by
増田 亨
ドメイン駆動設計 基本を理解する
by
増田 亨
オブジェクト指向プログラミングのためのモデリング入門
by
増田 亨
ドメインオブジェクトの見つけ方・作り方・育て方
by
増田 亨
Python におけるドメイン駆動設計(戦術面)の勘どころ
by
Junya Hayashi
マイクロにしすぎた結果がこれだよ!
by
mosa siru
gRPC入門
by
Kenjiro Kubota
ドメイン駆動設計入門
by
Takuya Kitamura
ドメインオブジェクトの設計ガイドライン
by
増田 亨
マイクロサービス 4つの分割アプローチ
by
増田 亨
オブジェクト指向できていますか?
by
Moriharu Ohzu
Viewers also liked
PDF
現場コーチから見えてきた越境する現場の3つの特徴
by
GuildWorks
PDF
技術者の働き方/ リモートワークという働き方 powered byドメイン駆動設計
by
GuildWorks
PDF
ちいさなオブジェクトでドメインモデルを組み立てる
by
増田 亨
PDF
実践的な設計って、なんだろう?
by
増田 亨
PDF
現場で役立つシステム設計の原則
by
増田 亨
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
PDF
データベース設計徹底指南
by
Mikiya Okuno
PDF
デキるプログラマだけが知っているコードレビュー7つの秘訣
by
Masahiro Nishimi
PDF
越境する情シス:進化可能なアーキテクチャを手に入れる
by
増田 亨
PDF
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
by
Unity Technologies Japan K.K.
現場コーチから見えてきた越境する現場の3つの特徴
by
GuildWorks
技術者の働き方/ リモートワークという働き方 powered byドメイン駆動設計
by
GuildWorks
ちいさなオブジェクトでドメインモデルを組み立てる
by
増田 亨
実践的な設計って、なんだろう?
by
増田 亨
現場で役立つシステム設計の原則
by
増田 亨
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
データベース設計徹底指南
by
Mikiya Okuno
デキるプログラマだけが知っているコードレビュー7つの秘訣
by
Masahiro Nishimi
越境する情シス:進化可能なアーキテクチャを手に入れる
by
増田 亨
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
by
Unity Technologies Japan K.K.
Similar to リーンなコードを書こう:実践的なオブジェクト指向設計
PDF
開発プロセス 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第2回】
by
Tomoharu ASAMI
PDF
わかるコードを書くために For writing clean code
by
Eyes, JAPAN
PDF
20120706-readablecode
by
Masanori Kado
KEY
リーダブルコード
by
Keita Otsuka
PPT
レガシーコード読書会 20120618
by
Suguru Shirai
PDF
名古屋Ruby会議02 LT:Ruby中級への道
by
Shigeru UCHIYAMA
PDF
Phpではじめるオブジェクト指向(公開用)
by
VOYAGE GROUP
PPT
Start!! Ruby
by
mitim
PDF
Scrum alliance regional gathering tokyo 2013 pub
by
グロースエクスパートナーズ株式会社/Growth xPartners Incorporated.
PDF
nomlab_okayamaruby_slide
by
nomlab
PDF
Meta programing ruby monday
by
Yuisho Takafuji
PPTX
リーダブルコード 1.0'
by
Yamamura Takashi
PDF
リッチなドメインモデル 名前探し
by
増田 亨
PDF
Code complete ch22_developper_test
by
Sho Shimauchi
PDF
GCSアジャイル開発を使ったゲームの作り方
by
Hiroyuki Tanaka
PDF
nomlab_okayamaruby_subslide
by
nomlab
PDF
Ruby on Rails 入門
by
Yasuko Ohba
PDF
DDD 20121106 SEA Forum November
by
増田 亨
PDF
Coderetreat
by
YAMANE Toshiaki
PDF
Hyper → Highspeed → Development
by
aktsk
開発プロセス 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第2回】
by
Tomoharu ASAMI
わかるコードを書くために For writing clean code
by
Eyes, JAPAN
20120706-readablecode
by
Masanori Kado
リーダブルコード
by
Keita Otsuka
レガシーコード読書会 20120618
by
Suguru Shirai
名古屋Ruby会議02 LT:Ruby中級への道
by
Shigeru UCHIYAMA
Phpではじめるオブジェクト指向(公開用)
by
VOYAGE GROUP
Start!! Ruby
by
mitim
Scrum alliance regional gathering tokyo 2013 pub
by
グロースエクスパートナーズ株式会社/Growth xPartners Incorporated.
nomlab_okayamaruby_slide
by
nomlab
Meta programing ruby monday
by
Yuisho Takafuji
リーダブルコード 1.0'
by
Yamamura Takashi
リッチなドメインモデル 名前探し
by
増田 亨
Code complete ch22_developper_test
by
Sho Shimauchi
GCSアジャイル開発を使ったゲームの作り方
by
Hiroyuki Tanaka
nomlab_okayamaruby_subslide
by
nomlab
Ruby on Rails 入門
by
Yasuko Ohba
DDD 20121106 SEA Forum November
by
増田 亨
Coderetreat
by
YAMANE Toshiaki
Hyper → Highspeed → Development
by
aktsk
More from 増田 亨
PDF
ソフトウェア開発のやり方の改善
by
増田 亨
PDF
事業活動モデル・システム機能モデル・ビジネスロジックの記述
by
増田 亨
PDF
オブジェクト指向プログラミングの現在・過去・未来
by
増田 亨
PDF
ドメイン駆動設計 コアドメインを語り合ってみよう
by
増田 亨
PDF
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
by
増田 亨
PDF
ドメイン駆動設計という設計スタイル
by
増田 亨
PDF
プロダクトづくりのためのソフトウェア設計スタイル
by
増田 亨
PDF
ソフトウェア設計の学び方を考える
by
増田 亨
PDF
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
by
増田 亨
PDF
ドメイン駆動設計の正しい歩き方
by
増田 亨
PDF
ビジネスルールの複雑さに立ち向かう
by
増田 亨
PDF
ソフトウェアの核心にある複雑さに立ち向かう
by
増田 亨
PDF
アジャイルなソフトウェア設計を目指して
by
増田 亨
PDF
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
PDF
SoR 2.0 summary
by
増田 亨
PDF
毎日が越境だ!
by
増田 亨
PDF
SoR 2.0 基幹システムの再定義と再構築
by
増田 亨
PDF
ドメイン駆動設計とは何か 【入門編】
by
増田 亨
PDF
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
by
増田 亨
ソフトウェア開発のやり方の改善
by
増田 亨
事業活動モデル・システム機能モデル・ビジネスロジックの記述
by
増田 亨
オブジェクト指向プログラミングの現在・過去・未来
by
増田 亨
ドメイン駆動設計 コアドメインを語り合ってみよう
by
増田 亨
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
by
増田 亨
ドメイン駆動設計という設計スタイル
by
増田 亨
プロダクトづくりのためのソフトウェア設計スタイル
by
増田 亨
ソフトウェア設計の学び方を考える
by
増田 亨
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
by
増田 亨
ドメイン駆動設計の正しい歩き方
by
増田 亨
ビジネスルールの複雑さに立ち向かう
by
増田 亨
ソフトウェアの核心にある複雑さに立ち向かう
by
増田 亨
アジャイルなソフトウェア設計を目指して
by
増田 亨
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
SoR 2.0 summary
by
増田 亨
毎日が越境だ!
by
増田 亨
SoR 2.0 基幹システムの再定義と再構築
by
増田 亨
ドメイン駆動設計とは何か 【入門編】
by
増田 亨
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
by
増田 亨
Recently uploaded
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):コアマイクロシステムズ株式会社 テーマ 「AI HPC時代のトータルソリューションプロバイダ」
by
PC Cluster Consortium
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):Pacific Teck Japan テーマ3「『TrinityX』 AI時代のクラスターマネジメ...
by
PC Cluster Consortium
PDF
ニューラルプロセッサによるAI処理の高速化と、未知の可能性を切り拓く未来の人工知能
by
Data Source
PPTX
ChatGPTのコネクタ開発から学ぶ、外部サービスをつなぐMCPサーバーの仕組み
by
Ryuji Egashira
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):Pacific Teck Japan テーマ2「『Slinky』 SlurmとクラウドのKuber...
by
PC Cluster Consortium
PPTX
2025年11月24日情報ネットワーク法学会大井哲也発表「API利用のシステム情報」
by
Tetsuya Oi
PDF
論文紹介:MotionMatcher: Cinematic Motion Customizationof Text-to-Video Diffusion ...
by
Toru Tamaki
PDF
AI開発の最前線を変えるニューラルネットワークプロセッサと、未来社会における応用可能性
by
Data Source
PDF
論文紹介:DiffusionRet: Generative Text-Video Retrieval with Diffusion Model
by
Toru Tamaki
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):富士通株式会社 テーマ1「HPC&AI: Accelerating material develo...
by
PC Cluster Consortium
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):日本ヒューレット・パッカード合同会社 テーマ1「大規模AIの能力を最大限に活用するHPE Comp...
by
PC Cluster Consortium
PDF
論文紹介:HiLoRA: Adaptive Hierarchical LoRA Routing for Training-Free Domain Gene...
by
Toru Tamaki
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):日本ヒューレット・パッカード合同会社 テーマ3「IT運用とデータサイエンティストを強力に支援するH...
by
PC Cluster Consortium
PDF
膨大なデータ時代を制する鍵、セグメンテーションAIが切り拓く解析精度と効率の革新
by
Data Source
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):エヌビディア合同会社 テーマ1「NVIDIA 最新発表製品等のご案内」
by
PC Cluster Consortium
PCCC25(設立25年記念PCクラスタシンポジウム):コアマイクロシステムズ株式会社 テーマ 「AI HPC時代のトータルソリューションプロバイダ」
by
PC Cluster Consortium
PCCC25(設立25年記念PCクラスタシンポジウム):Pacific Teck Japan テーマ3「『TrinityX』 AI時代のクラスターマネジメ...
by
PC Cluster Consortium
ニューラルプロセッサによるAI処理の高速化と、未知の可能性を切り拓く未来の人工知能
by
Data Source
ChatGPTのコネクタ開発から学ぶ、外部サービスをつなぐMCPサーバーの仕組み
by
Ryuji Egashira
PCCC25(設立25年記念PCクラスタシンポジウム):Pacific Teck Japan テーマ2「『Slinky』 SlurmとクラウドのKuber...
by
PC Cluster Consortium
2025年11月24日情報ネットワーク法学会大井哲也発表「API利用のシステム情報」
by
Tetsuya Oi
論文紹介:MotionMatcher: Cinematic Motion Customizationof Text-to-Video Diffusion ...
by
Toru Tamaki
AI開発の最前線を変えるニューラルネットワークプロセッサと、未来社会における応用可能性
by
Data Source
論文紹介:DiffusionRet: Generative Text-Video Retrieval with Diffusion Model
by
Toru Tamaki
PCCC25(設立25年記念PCクラスタシンポジウム):富士通株式会社 テーマ1「HPC&AI: Accelerating material develo...
by
PC Cluster Consortium
PCCC25(設立25年記念PCクラスタシンポジウム):日本ヒューレット・パッカード合同会社 テーマ1「大規模AIの能力を最大限に活用するHPE Comp...
by
PC Cluster Consortium
論文紹介:HiLoRA: Adaptive Hierarchical LoRA Routing for Training-Free Domain Gene...
by
Toru Tamaki
PCCC25(設立25年記念PCクラスタシンポジウム):日本ヒューレット・パッカード合同会社 テーマ3「IT運用とデータサイエンティストを強力に支援するH...
by
PC Cluster Consortium
膨大なデータ時代を制する鍵、セグメンテーションAIが切り拓く解析精度と効率の革新
by
Data Source
PCCC25(設立25年記念PCクラスタシンポジウム):エヌビディア合同会社 テーマ1「NVIDIA 最新発表製品等のご案内」
by
PC Cluster Consortium
リーンなコードを書こう:実践的なオブジェクト指向設計
1.
DevLove仙台 リーンな開発 リーンなコードを書こう 2013年11月30日 有限会社システム設計 増田
2.
アジェンダ 1.リーンな開発はリーンなコードから 2.コードをリーンにする ・コードの改善の準備 ・コードの重複をなくす ・変更の副作用をなくす ・for文を扱いやすくする ・if文/switch文を部品に分解する
3.
リーンな開発は リーンなコードから
4.
「リーン開発の現場」まえがき 継続的な改善 これが リーンな開発の すべてだ
5.
開発のやり方の改善で 大きな成果をだすためには コードの変更コストを下げる 変更コストが下がれば やり方の改善効果は倍増する
6.
リーン すっきりした ムダのないコードは 変更がやりやすい 変更がやりやすいと 改善スピードが加速する
7.
メタボ 体脂肪率 X% どろどろ血 こんなコードは 変更がたいへん
8.
変更がたいへんなコード • • • • • • • • どこで何をやっているかわからない だらだら長い コピペの臭い 変数名が微妙 コメントが意味不明 なおしたはずが、なおっていない ちょっとした変更が、あちこちに飛び火 結局、全部やりなおし
9.
コードの改善
10.
コードを改善する機会 • 変更が必要になった時 – ビジネスルールの変更 –
機能の追加 • 変更がやりやすいように、コードを改善してから 変更する • 小さな変更依頼が良いチャンス – 変更の目的が明確 – なぜその変更がたいへんか、原因がわかりやすい – 改善の before/after を確認しやすい • 変更するたびに、小さな改善を累積していく • 大きなブレークスルーが起きる
11.
まずはコードの整理 • 今回の変更に関係するコードとそうでない コードを分ける – 機能の変更はしない –
コードを分ける基本手段はメソッド • 今回の変更の対象となるデータとその操作だ けを集めた部品(メソッド)を作る – 「メソッドの抽出」リファクタリング – IDE を使いこなす – 「リファクタリング」で復習する • 関係するクラス、すべてでこれを繰り返す – 現在の機能が動いているか確認
12.
メソッド抽出の候補 • 空行で区切られた数行のかたまり • コメントで書かれた見出し –
ブロックの切れ目のはず • • • • 同じインデントレベルのコードのかたまり if()内の条件式 if/switch で分岐した、それぞれのブロック for文のボディ
13.
簡単な例 //変更前 void usage( String
name, int value) { System.out.println( “利用回数” ); System.out.println( new Date() ); } //詳細表示 System.out.println( “氏名:” + name ); System.out.println( “回数” + value ); //変更後 void usage( String name, int value) { System.out.println( “利用回数” ); System.out.println( new Date() ); } detail(name,value); void detail( String name, int value ) { System.out.println( “氏名:” + name ); System.out.println( “回数” + value ); }
14.
メソッド分割の補足 • 分割しすぎると一連の流れが追いにくい – Yes –
一連の流れ(=手続き型プログラミング)だから、変更が大 変になっている – ばらばらの部品に分けて、変更がやりやすいように組み立 てなおす – 変更の視点で組み立てなおすと、コードがわかりやすくな る味を覚えましょう • 対象が計算式1行だけでも、メソッドにするの? – Yes – 他のコードと分離することが大切 • メソッドチェイン – 1ステップずつ分割したほうが、整理がしやすい
15.
メソッドで使う変数に注目 • 抽出したメソッドで参照・変更・生成する データを徹底的に調べる – どこで宣言されているか –
どこで初期化されているか – どこで上書きされているか • 可能な限りメソッドのローカル変数にする – メソッド内で宣言・初期化する • 引数が多ければ、一つのクラスにまとめる – 最初はデータの入れものクラスで良い
16.
クラスを作る • 変更に関連するデータとコードを集めるため の入れものとしてクラスを宣言する – クラス名は、今回の仕様変更を記述した言葉に中 から見つかる –
複数の引数をまためたクラスは有力候補 • 必要なデータをインスタンス変数で宣言 • データ初期化をコンストラクタで宣言 – 初期化のパターンごとのコンストラクタ • メソッドをこのクラスに移動してくる – 引数はなくせるはず – インスタンス変数の参照だけで処理する
17.
Detail クラス class Detail { private
String name; private int value; Detail( String name, int value ) { this.name = name; this.value = value; } } void print() { System.out.println( “氏名:” + name ); System.out.println( “回数” + value ); }
18.
クラスを使うように書き換える • 移動前のメソッドを呼び出している箇所 を書き換える – new
でオブジェクトを生成し – (移動した)メソッドを呼び出す • 現在の機能通りに動いていることを確認 • これで、ようやく機能変更の準備が完了
19.
Detail クラスを使う //変更前 void usage(
String name, int value) { System.out.println( “利用回数” ); System.out.println( new Date() ); } //変更後 void usage( String name, int value) { System.out.println( “利用回数” ); System.out.println( new Date() ); detail(name,value); void detail( String name, int value ) { System.out.println( “氏名:” + name ); System.out.println( “回数” + value ); } } Detail detail = new detail(name,value); detail.print(); 詳細の印刷内容を変更する時、 Detail クラスに変更を局所化できる 特に効果が大きいのは、 ・複数個所に重複している場合 ・氏名と回数を使う他のロジックが ある場合
20.
コードの重複をなくす • 基本のやり方は、Detailクラスの例のよう に、変更の対象範囲をメソッドに分解し て、クラスに移動する • 現実のコードは、これほど単純ではない –
入り組んだデータの初期化、参照、上書きが、 プログラムのあちこちに散らばっている
21.
実践的なやり方 • フィールド変数、コンストラクタ、getterでクラスを宣言 – クラス名は、おそらく変更仕様書にでてくるキーワード •
詳細表示形式の変更 • 電話番号の必須条件を解除 • データを設定している箇所を見つけ、このクラスのコンスト ラクタに置き換える(オブジェクトを生成する) • データを参照する箇所を見つけ、このクラスのgetter で書き 換える • get した後のロジックを、このクラスに移動する – getter が削除できるまで繰り返す – どうしても削除できなかったら、メソッド名をもっと意味のあ る名前に変える 重複したロジックがこのクラスに集まってくる データクラスが、振る舞いを持ったクラスに進化する
22.
クラスの粒度 • 今回の変更に関連するデータは、String ひ とつだけです Stringのフィールドが一つだけのクラスを 作るんですか? •
Yes – 変更単位が、その粒度なんだから、クラスと して独立させる – 変更すべきコードを局所に閉じ込める – 変更の影響箇所は型(クラス名)で特定する
23.
小さなクラスたち • 基本データ型 (
Integer, String, Date )を1つか2つ 持つ小さなクラスが、変更の対象になることが多 い • クラス名は、業務要件の基本語彙になる • 基本語彙クラスがそろってくると、コードは要件 定義書に近づいていく – 語彙 – 構造 パッケージ • ドキュメントの改善 – 業務要件をコードに変換するためのプログラム仕様 書は不要になる – 業務仕様書の重複が、プログラムから発見できる
24.
数値系のクラスの例 • • • • • Quantity Unit Amount Money Currency 数量と単位 単位と換算機能 金額、千円単位表示 金額と通貨 通貨
25.
日付系のクラスの例 • • • • • • • Days 日数 Hours 時間数 Period 期間(開始日+終了日) DueDate 予定日 YearAndMonth 年月 DateOfRecord 記録日 DateOfOccurrence 発生日
26.
テキスト系のクラスの例 • • • • • • Telephone/Email/Url, … Line 一行のテキスト Description 説明(複数行のテキスト) Note メモ(作成日時と作成者) Definition 見出し語と説明のペア Definitions
複数の「見出し語+説明」
27.
変更の副作用をなくす
28.
原因はデータの上書き • じゃあ、データの上書きをやめればよい – setter
は使わない – データは、コンストラクタでのみ設定可能 – データを変えたい時は、別のオブジェクトを 生成する – それぞれのオブジェクトを、いつ、どこで参 照しても、同じ内容を保障する • 処理の順番を入れ替えても副作用が起きない 不変(immutable)オブジェクトが副作用をなくす
29.
原因はデータの複製 • 同じデータをあちこちの変数で保持 こっちも直しても、あっちがなおらない • じゃあ、複製を持つのやめればいい – – – – – – データ宣言とその操作を一つのクラスに集める ひとつの値は、ひとつのオブジェクトが保持 別の値は、別のオブジェクトが保持する 引数やリターン値で「データ」をやりとりしない オブジェクトを渡す オブジェクトに仕事をさせる
30.
for 文を扱いやすくする
31.
for 文とコレクション • バグと副作用の巣窟です –
コレクションのグローバル参照をやめる – コレクションを渡すことをやめる • 変更の対象データがコレクション – そのコレクションだけを持つクラスを宣言 – そのクラスにロジックを集める – そのクラスはコレクションを返さない コレクションを特別扱いにする ファーストクラスコレクション
32.
ファーストクラスコレクション 基本パターンは、単数形クラスと複数形クラスのペア class Book { // 書名、ジャンル、価格、人気 } class
Books { List<Book> books; } // コレクション操作のメソッド群 class Customer { ... } class Customers { List<Customer> customers; … }
33.
ファーストクラスコレクション • プログラムのあちこちに散らばっていたロジックを集 約するだけでも、コードは安定する • コレクションへの要素の追加や削除、要素の変更専用 のメソッドを用意する –
外部からできることの限定 – 不整合チェックなどのガードを強化 • ループ処理の記法 – 安全で楽に書ける方向に進化している – 安全でシンプルに書ければ、ファーストクラスコレクショ ンはいらなくなる? – No! • 楽に書けると、ますます、あちこちにコードが重複する • 変更コストを下げるには、ファーストクラスコレクション
34.
if文/switch文を 部品に分解する
35.
変更コストは条件分岐との戦い • スパゲッティコード goto文 –
if/switch は、goto文の特殊形態 – if/switch の分岐後のブロックが長くなれば、 goto文使ったスパゲティといっしょ • 今までのやり方の応用編 – 分岐ごとにメソッドにまとめる – あちこちで同じ条件分岐したメソッドを集め るためのクラスを作る
36.
分岐ごとにクラスにわける … Amount fee(String guestType) { if(
guestType.equals( "adult“ ) ) return adultFee(); else return childFee() ; //子供 } … private Amount adultFee() { return Yen(100); } private Amount childFee() { return new Yen(50); } class Adult { Amount fee() { return new Yen(100); } } class Child { Amount fee() { return new Yen(50); } }
37.
別のクラスを同じに扱う 異なるクラスのオブジェクトも、同じ「型」で扱える interface Guest { Amount fee(); } class
Usage { Guest guest; Usage(guest) { this.guest = guest; } class Adult implements Guest { … } class Child implements Guest { … } } Amount fee() { return guest.fee(); } 幼児料金、シニア料金を追加する場合、if/switchより、ずっと安全・簡単
38.
Java の 列挙型ならもっと簡単 enum
Guest { Adult(100), Child(50), Baby(0),Senior(80); Amount fee ; Guest(int fee) { this.fee = new Amount(fee); } } Amount fee() { return this.fee; } Javaの列挙型: Interface 宣言 + 実装クラス宣言 + singleton 型ごとに、振る舞いを 持てる 区分や種別のコードの整理の 特効薬
39.
状態遷移もシンプルに enum State { opened,closed EnumMap<State,EnumSet<State>> transitions;
// 状態遷移先 EnumMap<State,EnumSet<Event>> events; // 状態ごとの可能イベント State canTransitTo(State state) { Set<State> states = transitions.get(this); return states.contains(state); } } Set<Event> possibleEvents() { return events.get(this); } enum Event { //イベント種類 open,close } 状態/イベントの追加、遷移ルールの変更が簡単・安全
40.
パッケージ名 クラス名 メソッド名 名前づけで楽をする (英語で)
41.
楽をしましょう 問題領域の入門書(たくさんある) ・目次はそのままパッケージ設計 ・説明はクラス仕様書(情報名、扱い方) ・索引で影響範囲をチェック 英単語のイメージを共有する make/create/build/construct … all/every/each … for/to/of/with
…
42.
大きなコード改善
43.
業務システムの基本構成 画面 アプリケーション 連携 アプリケーション 帳票 アプリケーション データベース
44.
アプリケーションの中核部品 画面 アプリケーション 連携 アプリケーション ドメイン モデル 帳票 アプリケーション ここに 業務ロジックを 集める データベース
45.
ドメインモデルをみんなで使う 画面 アプリケーション 連携/バッチ アプリケーション 氏名 連絡 手段 住所 連絡 履歴 帳票 アプリケーション 業務で使う データ+ロジックを ここに集約 データベース
46.
ドメインモデルは コードの重複を減らす • あちこちに分散しがちな業務ロジックを データ中心に整理し、集約する • いやな臭い –
データを要求する getter メソッド • そのデータを使うロジックが、別のクラスに分散 • あちこちのクラスに重複して書かれている危険な 兆候
47.
コード量が減れば • • • • テストが減る ドキュメントが減る バグ調査が楽になる 変更の影響が見通しやすい
48.
ドメインモデル ほんとうの価値 • 業務の知識の浸透 – ビジネス目標/システムの価値の理解 –
業務の全体像/基本の仕組みの理解 – 業務の現場にある肌感覚、現場の知恵 • 言語表現を超えた暗黙知が育つ – 業務アプリケーションの設計のコツ、かんどころ、 おとしどころ、… – 個人に内面化された価値観、方向感 – チームで共有化された価値観、方向感 • 「あたり」がつくようになる – 的外れの作業/とんでもない勘違い/手戻りが減る – 進むべき方向がわかりやすくなる ドメインモデルがリーン開発を加速する
49.
今日のまとめ コードをリーンにする 実践ノウハウ
50.
変更が必要になったら • メソッドでコードを整理する • データに注目してクラスを宣言 そのクラスにロジックを集める •
オブジェクトを不変(immutable)にする • コレクションは特別扱いする • 条件分岐はクラスに分ける 型を同じにする • (Javaなら) 区分・種別は Enumで • ドメインモデルで全体を大きく改善する • ブレークスルーのために、小さな改善を続ける
51.
ありがとうございました
Download