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,847 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
ドメイン駆動設計 ( DDD ) をやってみよう
by
増田 亨
PDF
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
PDF
ちいさなオブジェクトでドメインモデルを組み立てる
by
増田 亨
PDF
オブジェクト指向できていますか?
by
Moriharu Ohzu
PDF
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
by
Takuto Wada
PDF
例外設計における大罪
by
Takuto Wada
PDF
オブジェクト指向プログラミングのためのモデリング入門
by
増田 亨
PDF
組織にテストを書く文化を根付かせる戦略と戦術
by
Takuto Wada
ドメイン駆動設計 ( DDD ) をやってみよう
by
増田 亨
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
ちいさなオブジェクトでドメインモデルを組み立てる
by
増田 亨
オブジェクト指向できていますか?
by
Moriharu Ohzu
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
by
Takuto Wada
例外設計における大罪
by
Takuto Wada
オブジェクト指向プログラミングのためのモデリング入門
by
増田 亨
組織にテストを書く文化を根付かせる戦略と戦術
by
Takuto Wada
What's hot
PDF
オブジェクト指向エクササイズのススメ
by
Yoji Kanno
PDF
いつやるの?Git入門
by
Masakazu Matsushita
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
PDF
ソフトウェアにおける 複雑さとは何なのか?
by
Yoshitaka Kawashima
PDF
ドメイン駆動設計サンプルコードの徹底解説
by
増田 亨
PDF
世界でいちばんわかりやすいドメイン駆動設計
by
増田 亨
PDF
Marp Tutorial
by
Rui Watanabe
PDF
ドメイン駆動設計 基本を理解する
by
増田 亨
PDF
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
by
Shin Ohno
PDF
ドメイン駆動設計 本格入門
by
増田 亨
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
by
NTT DATA Technology & Innovation
KEY
やはりお前らのMVCは間違っている
by
Koichi Tanaka
PDF
データベース設計徹底指南
by
Mikiya Okuno
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
by
Masahito Zembutsu
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
by
Hiro H.
PDF
ドメイン駆動設計に15年取り組んでわかったこと
by
増田 亨
PDF
アジャイルにモデリングは必要か
by
Hiromasa Oka
PPTX
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
by
Tadahiro Ishisaka
PDF
なぜデータモデリングが重要なのか?
by
Yoshitaka Kawashima
オブジェクト指向エクササイズのススメ
by
Yoji Kanno
いつやるの?Git入門
by
Masakazu Matsushita
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
by
Koichiro Matsuoka
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
by
Takuto Wada
ソフトウェアにおける 複雑さとは何なのか?
by
Yoshitaka Kawashima
ドメイン駆動設計サンプルコードの徹底解説
by
増田 亨
世界でいちばんわかりやすいドメイン駆動設計
by
増田 亨
Marp Tutorial
by
Rui Watanabe
ドメイン駆動設計 基本を理解する
by
増田 亨
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
by
Shin Ohno
ドメイン駆動設計 本格入門
by
増田 亨
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
by
NTT DATA Technology & Innovation
やはりお前らのMVCは間違っている
by
Koichi Tanaka
データベース設計徹底指南
by
Mikiya Okuno
コンテナの作り方「Dockerは裏方で何をしているのか?」
by
Masahito Zembutsu
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
by
Hiro H.
ドメイン駆動設計に15年取り組んでわかったこと
by
増田 亨
アジャイルにモデリングは必要か
by
Hiromasa Oka
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
by
Tadahiro Ishisaka
なぜデータモデリングが重要なのか?
by
Yoshitaka Kawashima
Viewers also liked
PDF
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
PDF
実践的な設計って、なんだろう?
by
増田 亨
PDF
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
by
Unity Technologies Japan K.K.
PDF
デキるプログラマだけが知っているコードレビュー7つの秘訣
by
Masahiro Nishimi
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
PDF
現場で役立つシステム設計の原則
by
増田 亨
PDF
越境する情シス:進化可能なアーキテクチャを手に入れる
by
増田 亨
PDF
技術者の働き方/ リモートワークという働き方 powered byドメイン駆動設計
by
GuildWorks
PDF
現場コーチから見えてきた越境する現場の3つの特徴
by
GuildWorks
オブジェクト指向の設計と実装の学び方のコツ
by
増田 亨
実践的な設計って、なんだろう?
by
増田 亨
【Unity道場スペシャル 2017札幌】最適化をする前に覚えておきたい技術 -札幌編-
by
Unity Technologies Japan K.K.
デキるプログラマだけが知っているコードレビュー7つの秘訣
by
Masahiro Nishimi
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
現場で役立つシステム設計の原則
by
増田 亨
越境する情シス:進化可能なアーキテクチャを手に入れる
by
増田 亨
技術者の働き方/ リモートワークという働き方 powered byドメイン駆動設計
by
GuildWorks
現場コーチから見えてきた越境する現場の3つの特徴
by
GuildWorks
Similar to リーンなコードを書こう:実践的なオブジェクト指向設計
PDF
リッチなドメインモデル 名前探し
by
増田 亨
PDF
GCSアジャイル開発を使ったゲームの作り方
by
Hiroyuki Tanaka
PDF
Code complete ch22_developper_test
by
Sho Shimauchi
PDF
わかるコードを書くために For writing clean code
by
Eyes, JAPAN
PDF
Scrum alliance regional gathering tokyo 2013 pub
by
グロースエクスパートナーズ株式会社/Growth xPartners Incorporated.
PDF
nomlab_okayamaruby_slide
by
nomlab
PPT
レガシーコード読書会 20120618
by
Suguru Shirai
PPTX
リーダブルコード 1.0'
by
Yamamura Takashi
KEY
リーダブルコード
by
Keita Otsuka
PDF
Ruby on Rails 入門
by
Yasuko Ohba
PDF
Coderetreat
by
YAMANE Toshiaki
PPT
Start!! Ruby
by
mitim
PDF
名古屋Ruby会議02 LT:Ruby中級への道
by
Shigeru UCHIYAMA
PDF
Phpではじめるオブジェクト指向(公開用)
by
VOYAGE GROUP
PDF
開発プロセス 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第2回】
by
Tomoharu ASAMI
PDF
DDD 20121106 SEA Forum November
by
増田 亨
PDF
Hyper → Highspeed → Development
by
aktsk
PDF
nomlab_okayamaruby_subslide
by
nomlab
PDF
20120706-readablecode
by
Masanori Kado
PDF
Meta programing ruby monday
by
Yuisho Takafuji
リッチなドメインモデル 名前探し
by
増田 亨
GCSアジャイル開発を使ったゲームの作り方
by
Hiroyuki Tanaka
Code complete ch22_developper_test
by
Sho Shimauchi
わかるコードを書くために For writing clean code
by
Eyes, JAPAN
Scrum alliance regional gathering tokyo 2013 pub
by
グロースエクスパートナーズ株式会社/Growth xPartners Incorporated.
nomlab_okayamaruby_slide
by
nomlab
レガシーコード読書会 20120618
by
Suguru Shirai
リーダブルコード 1.0'
by
Yamamura Takashi
リーダブルコード
by
Keita Otsuka
Ruby on Rails 入門
by
Yasuko Ohba
Coderetreat
by
YAMANE Toshiaki
Start!! Ruby
by
mitim
名古屋Ruby会議02 LT:Ruby中級への道
by
Shigeru UCHIYAMA
Phpではじめるオブジェクト指向(公開用)
by
VOYAGE GROUP
開発プロセス 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第2回】
by
Tomoharu ASAMI
DDD 20121106 SEA Forum November
by
増田 亨
Hyper → Highspeed → Development
by
aktsk
nomlab_okayamaruby_subslide
by
nomlab
20120706-readablecode
by
Masanori Kado
Meta programing ruby monday
by
Yuisho Takafuji
More from 増田 亨
PDF
マイクロサービス 4つの分割アプローチ
by
増田 亨
PDF
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
PDF
ドメイン駆動設計という設計スタイル
by
増田 亨
PDF
ドメイン駆動設計の正しい歩き方
by
増田 亨
PDF
ソフトウェア設計の学び方を考える
by
増田 亨
PDF
ビジネスルールの複雑さに立ち向かう
by
増田 亨
PDF
DDD sample code explained in Java
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
増田 亨
マイクロサービス 4つの分割アプローチ
by
増田 亨
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
ドメイン駆動設計という設計スタイル
by
増田 亨
ドメイン駆動設計の正しい歩き方
by
増田 亨
ソフトウェア設計の学び方を考える
by
増田 亨
ビジネスルールの複雑さに立ち向かう
by
増田 亨
DDD sample code explained in Java
by
増田 亨
オブジェクト指向プログラミングの現在・過去・未来
by
増田 亨
ソフトウェアの核心にある複雑さに立ち向かう
by
増田 亨
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
by
増田 亨
ソフトウェア開発のやり方の改善
by
増田 亨
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
by
増田 亨
正しいものを正しく作る塾-設計コース
by
増田 亨
アジャイルなソフトウェア設計を目指して
by
増田 亨
プロダクトづくりのためのソフトウェア設計スタイル
by
増田 亨
毎日が越境だ!
by
増田 亨
ドメインオブジェクトの設計ガイドライン
by
増田 亨
ドメイン駆動設計 コアドメインを語り合ってみよう
by
増田 亨
事業活動モデル・システム機能モデル・ビジネスロジックの記述
by
増田 亨
SoR 2.0 summary
by
増田 亨
Recently uploaded
PPTX
ddevについて .
by
iPride Co., Ltd.
PDF
第21回 Gen AI 勉強会「NotebookLMで60ページ超の スライドを作成してみた」
by
嶋 是一 (Yoshikazu SHIMA)
PDF
Drupal Recipes 解説 .
by
iPride Co., Ltd.
PDF
さくらインターネットの今 法林リージョン:さくらのAIとか GPUとかイベントとか 〜2026年もバク進します!〜
by
法林浩之
PDF
2025→2026宙畑ゆく年くる年レポート_100社を超える企業アンケート総まとめ!!_企業まとめ_1229_3版
by
sorabatake
PDF
100年後の知財業界-生成AIスライドアドリブプレゼン イーパテントYouTube配信
by
e-Patent Co., Ltd.
PDF
Reiwa 7 IT Strategist Afternoon I Question-1 Ansoff's Growth Vector
by
akipii ogaoga
PDF
Reiwa 7 IT Strategist Afternoon I Question-1 3C Analysis
by
akipii ogaoga
PDF
Starlink Direct-to-Cell (D2C) 技術の概要と将来の展望
by
CRI Japan, Inc.
ddevについて .
by
iPride Co., Ltd.
第21回 Gen AI 勉強会「NotebookLMで60ページ超の スライドを作成してみた」
by
嶋 是一 (Yoshikazu SHIMA)
Drupal Recipes 解説 .
by
iPride Co., Ltd.
さくらインターネットの今 法林リージョン:さくらのAIとか GPUとかイベントとか 〜2026年もバク進します!〜
by
法林浩之
2025→2026宙畑ゆく年くる年レポート_100社を超える企業アンケート総まとめ!!_企業まとめ_1229_3版
by
sorabatake
100年後の知財業界-生成AIスライドアドリブプレゼン イーパテントYouTube配信
by
e-Patent Co., Ltd.
Reiwa 7 IT Strategist Afternoon I Question-1 Ansoff's Growth Vector
by
akipii ogaoga
Reiwa 7 IT Strategist Afternoon I Question-1 3C Analysis
by
akipii ogaoga
Starlink Direct-to-Cell (D2C) 技術の概要と将来の展望
by
CRI Japan, Inc.
リーンなコードを書こう:実践的なオブジェクト指向設計
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