SlideShare a Scribd company logo

名著『リーダブルコード』を解説者と一緒に読み解こう - 7章 制御フローを読みやすくする

Kouhei Sutou
Kouhei Sutou
Kouhei SutouFree Software Programmer at ClearCode

2015年4月3日(金)21:00-22:00に実施する授業の資料です。今回は「7章 制御フローを読みやすくする」を読みながら、よりよい制御フローの書き方について学びます。

名著『リーダブルコード』を解説者と一緒に読み解こう - 7章 制御フローを読みやすくする

1 of 57
Download to read offline
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
リーダブルコードを
読み解こう
7章 制御フローを読みやすくする
須藤功平
株式会社クリアコード
schoo
2015-04-03
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
質問(1)
前回の授業は…
A:参加した✓
B:参加できなかった
(都合が合わなかった、知らなかったなど)
✓
C:知っていたが参加していない✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
質問(2)
プログラミングについて
A:未経験✓
B:学習中(schooや学校、独学など)✓
C:趣味・仕事でたまに書く
(趣味でWebサイトを作っている、職業がデザイナーなど)
✓
D:趣味・仕事でバリバリ書く
(趣味でOSSを開発している、職業がエンジニアなど)
✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
質問(3)
リーダブルコード(本)を…
A:読んだ✓
B:読んでいる✓
C:まだ読んでいない✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
内容
自己紹介✓
リーダブルコードとは✓
実例で考えよう✓
実際の改善にチャレンジ!✓
まとめ✓
質疑応答✓
リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7
自己紹介(1)
リーダブルコードの
「解説」の著者
http://www.clear-code.com/blog/2012/6/11.html
✓

Recommended

実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...NTT DATA Technology & Innovation
 
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」
DDDオンライン勉強会#2 「集約・境界付けられたコンテキスト」 Koichiro Matsuoka
 
DynamoDBのテーブル設計手法.pptx
DynamoDBのテーブル設計手法.pptxDynamoDBのテーブル設計手法.pptx
DynamoDBのテーブル設計手法.pptxTetsuya Wada
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツpospome
 
超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座Samir Hammoudi
 
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)Koichiro Matsuoka
 
脱RESTful API設計の提案
脱RESTful API設計の提案脱RESTful API設計の提案
脱RESTful API設計の提案樽八 仲川
 
The Twelve-Factor Appで考えるAWSのサービス開発
The Twelve-Factor Appで考えるAWSのサービス開発The Twelve-Factor Appで考えるAWSのサービス開発
The Twelve-Factor Appで考えるAWSのサービス開発Amazon Web Services Japan
 

More Related Content

What's hot

Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方豊明 尾古
 
ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjpChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjpK Kinzal
 
Kubernetes 導入から始める DevOps について
Kubernetes 導入から始める DevOps についてKubernetes 導入から始める DevOps について
Kubernetes 導入から始める DevOps についてShigeru Tatsuta
 
30分でわかるマイクロサービスアーキテクチャ 第2版
30分でわかるマイクロサービスアーキテクチャ 第2版30分でわかるマイクロサービスアーキテクチャ 第2版
30分でわかるマイクロサービスアーキテクチャ 第2版Naoki (Neo) SATO
 
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #1320210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13Amazon Web Services Japan
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いota42y
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)Yoshitaka Kawashima
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAmazon Web Services Japan
 
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)Koichiro Matsuoka
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話ichirin2501
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことgree_tech
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017hirokiky
 
概念モデリング再入門 + DDD
概念モデリング再入門 + DDD概念モデリング再入門 + DDD
概念モデリング再入門 + DDDHiroshima JUG
 
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?Yoshitaka Kawashima
 
DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技Yoichi Toyota
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことyoku0825
 

What's hot (20)

Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方
 
ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjpChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
ChatGPTをシステムに組み込むためのプロンプト技法 #chatgptjp
 
Kubernetes 導入から始める DevOps について
Kubernetes 導入から始める DevOps についてKubernetes 導入から始める DevOps について
Kubernetes 導入から始める DevOps について
 
30分でわかるマイクロサービスアーキテクチャ 第2版
30分でわかるマイクロサービスアーキテクチャ 第2版30分でわかるマイクロサービスアーキテクチャ 第2版
30分でわかるマイクロサービスアーキテクチャ 第2版
 
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #1320210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
 
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design PatternAWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
 
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
境界付けられたコンテキスト 概念編 (ドメイン駆動設計用語解説シリーズ)
 
外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話外部キー制約に伴うロックの小話
外部キー制約に伴うロックの小話
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
PHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったことPHPからgoへの移行で分かったこと
PHPからgoへの移行で分かったこと
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
プロダクト開発してわかったDjangoの深〜いパーミッション管理の話 @ PyconJP2017
 
概念モデリング再入門 + DDD
概念モデリング再入門 + DDD概念モデリング再入門 + DDD
概念モデリング再入門 + DDD
 
なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?なぜデータモデリングが重要なのか?
なぜデータモデリングが重要なのか?
 
DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技DynamoDB設計のちょっとした技
DynamoDB設計のちょっとした技
 
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいことMySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
 

Viewers also liked

[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来Masahiro Nishimi
 
リーダブルコード
リーダブルコードリーダブルコード
リーダブルコードKeita Otsuka
 
Manage Myself
Manage MyselfManage Myself
Manage Myselfbash0C7
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェアプログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェアRyota Nakamura
 
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 横河電機(株)
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 	横河電機(株) YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 	横河電機(株)
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 横河電機(株) 教育CSR大賞
 
20140910 Arduino for beginners
20140910 Arduino for beginners20140910 Arduino for beginners
20140910 Arduino for beginnersKenichi Ohwada
 
「納品のない受託開発」を支えるコードレビューの取り組み
「納品のない受託開発」を支えるコードレビューの取り組み「納品のない受託開発」を支えるコードレビューの取り組み
「納品のない受託開発」を支えるコードレビューの取り組みMasahiro Nishimi
 
Arduinoをこれから始める人のためのArduino紹介スライドβ版
Arduinoをこれから始める人のためのArduino紹介スライドβ版Arduinoをこれから始める人のためのArduino紹介スライドβ版
Arduinoをこれから始める人のためのArduino紹介スライドβ版Katsuhiro Morishita
 
平成25年社会人講座 Arduinoによるマイコン入門講座
平成25年社会人講座 Arduinoによるマイコン入門講座平成25年社会人講座 Arduinoによるマイコン入門講座
平成25年社会人講座 Arduinoによるマイコン入門講座Katsuhiro Morishita
 
リーダブルコード勉強会
リーダブルコード勉強会リーダブルコード勉強会
リーダブルコード勉強会norimatsu2012
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
 プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター) プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)Ryota Nakamura
 
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)Masahiro Nishimi
 
納品のない受託開発を支える レガシーコードを作らない仕組み
納品のない受託開発を支える レガシーコードを作らない仕組み納品のない受託開発を支える レガシーコードを作らない仕組み
納品のない受託開発を支える レガシーコードを作らない仕組みMasahiro Nishimi
 
Arduino 入門
Arduino 入門Arduino 入門
Arduino 入門mitunaga
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣Masahiro Nishimi
 
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステムPython, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステムJunichi Kakisako
 
モーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみるモーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみるKeiichi Sakai
 

Viewers also liked (19)

[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来
 
リーダブルコード
リーダブルコードリーダブルコード
リーダブルコード
 
Manage Myself
Manage MyselfManage Myself
Manage Myself
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェアプログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア
 
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 横河電機(株)
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 	横河電機(株) YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 	横河電機(株)
YOKOGAWA理科教室(小学生でも作れる照度計と放射温度計) 横河電機(株)
 
20140910 Arduino for beginners
20140910 Arduino for beginners20140910 Arduino for beginners
20140910 Arduino for beginners
 
計測計量の基礎   measuring
計測計量の基礎   measuring計測計量の基礎   measuring
計測計量の基礎   measuring
 
「納品のない受託開発」を支えるコードレビューの取り組み
「納品のない受託開発」を支えるコードレビューの取り組み「納品のない受託開発」を支えるコードレビューの取り組み
「納品のない受託開発」を支えるコードレビューの取り組み
 
Arduinoをこれから始める人のためのArduino紹介スライドβ版
Arduinoをこれから始める人のためのArduino紹介スライドβ版Arduinoをこれから始める人のためのArduino紹介スライドβ版
Arduinoをこれから始める人のためのArduino紹介スライドβ版
 
平成25年社会人講座 Arduinoによるマイコン入門講座
平成25年社会人講座 Arduinoによるマイコン入門講座平成25年社会人講座 Arduinoによるマイコン入門講座
平成25年社会人講座 Arduinoによるマイコン入門講座
 
リーダブルコード勉強会
リーダブルコード勉強会リーダブルコード勉強会
リーダブルコード勉強会
 
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
 プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター) プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
プログラムによる計測と制御の仕組みを学ぶための学習支援ソフトウェア (ポスター)
 
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
デキるプログラマだけが知っているコードレビュー7つの秘訣(DevLove版)
 
納品のない受託開発を支える レガシーコードを作らない仕組み
納品のない受託開発を支える レガシーコードを作らない仕組み納品のない受託開発を支える レガシーコードを作らない仕組み
納品のない受託開発を支える レガシーコードを作らない仕組み
 
Arduino 入門
Arduino 入門Arduino 入門
Arduino 入門
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
 
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
 
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステムPython, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
Python, RaspberryPi, Arduinoで作る消費電力モニタリングシステム
 
モーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみるモーターを低速で定速で動かしてみる
モーターを低速で定速で動かしてみる
 

Similar to 名著『リーダブルコード』を解説者と一緒に読み解こう - 7章 制御フローを読みやすくする

リーダブルコードを読んだ後
リーダブルコードを読んだ後リーダブルコードを読んだ後
リーダブルコードを読んだ後Kouhei Sutou
 
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こうKouhei Sutou
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
リーダブルコード勉強会 in 筑波大 - 練習
リーダブルコード勉強会 in 筑波大 - 練習リーダブルコード勉強会 in 筑波大 - 練習
リーダブルコード勉強会 in 筑波大 - 練習Kouhei Sutou
 
リーダブルコード勉強会 in 筑波大 - コードチェンジ
リーダブルコード勉強会 in 筑波大 - コードチェンジリーダブルコード勉強会 in 筑波大 - コードチェンジ
リーダブルコード勉強会 in 筑波大 - コードチェンジKouhei Sutou
 
SEゼミ2015 - OSS Hack 4 Beginners - フィードバック
SEゼミ2015 - OSS Hack 4 Beginners - フィードバックSEゼミ2015 - OSS Hack 4 Beginners - フィードバック
SEゼミ2015 - OSS Hack 4 Beginners - フィードバックKouhei Sutou
 
リーダブルコード 1.0'
リーダブルコード 1.0'リーダブルコード 1.0'
リーダブルコード 1.0'Yamamura Takashi
 
SEゼミ2015 - 練習
SEゼミ2015 - 練習SEゼミ2015 - 練習
SEゼミ2015 - 練習Kouhei Sutou
 
SEゼミ2015 - コードチェンジ
SEゼミ2015 - コードチェンジSEゼミ2015 - コードチェンジ
SEゼミ2015 - コードチェンジKouhei Sutou
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~CHY72
 
Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門晃 遠山
 
SEゼミ2014 - リーダブルコード勉強会のアイスブレイク
SEゼミ2014 - リーダブルコード勉強会のアイスブレイクSEゼミ2014 - リーダブルコード勉強会のアイスブレイク
SEゼミ2014 - リーダブルコード勉強会のアイスブレイクKouhei Sutou
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要Kouhei Sutou
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Hiro Yoshioka
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルにHiroko Tamagawa
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacksHiro Yoshioka
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testingYuji Shimada
 
よい名前を付けましょう リーダブルなんたらとか
よい名前を付けましょう   リーダブルなんたらとかよい名前を付けましょう   リーダブルなんたらとか
よい名前を付けましょう リーダブルなんたらとかよしだ あつし
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦うYugo Shimizu
 

Similar to 名著『リーダブルコード』を解説者と一緒に読み解こう - 7章 制御フローを読みやすくする (20)

リーダブルコードを読んだ後
リーダブルコードを読んだ後リーダブルコードを読んだ後
リーダブルコードを読んだ後
 
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
名著『リーダブルコード - より良いコードを書くためのシンプルで実践的なテクニック』を解説者と一緒に読み解こう
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
リーダブルコード勉強会 in 筑波大 - 練習
リーダブルコード勉強会 in 筑波大 - 練習リーダブルコード勉強会 in 筑波大 - 練習
リーダブルコード勉強会 in 筑波大 - 練習
 
リーダブルコード勉強会 in 筑波大 - コードチェンジ
リーダブルコード勉強会 in 筑波大 - コードチェンジリーダブルコード勉強会 in 筑波大 - コードチェンジ
リーダブルコード勉強会 in 筑波大 - コードチェンジ
 
SEゼミ2015 - OSS Hack 4 Beginners - フィードバック
SEゼミ2015 - OSS Hack 4 Beginners - フィードバックSEゼミ2015 - OSS Hack 4 Beginners - フィードバック
SEゼミ2015 - OSS Hack 4 Beginners - フィードバック
 
リーダブルコード 1.0'
リーダブルコード 1.0'リーダブルコード 1.0'
リーダブルコード 1.0'
 
SEゼミ2015 - 練習
SEゼミ2015 - 練習SEゼミ2015 - 練習
SEゼミ2015 - 練習
 
SEゼミ2015 - コードチェンジ
SEゼミ2015 - コードチェンジSEゼミ2015 - コードチェンジ
SEゼミ2015 - コードチェンジ
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門Behat+Symfony2ではじめるBDD超入門
Behat+Symfony2ではじめるBDD超入門
 
SEゼミ2014 - リーダブルコード勉強会のアイスブレイク
SEゼミ2014 - リーダブルコード勉強会のアイスブレイクSEゼミ2014 - リーダブルコード勉強会のアイスブレイク
SEゼミ2014 - リーダブルコード勉強会のアイスブレイク
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要リーダブルコードワークショップ(パイオニア向け)の概要
リーダブルコードワークショップ(パイオニア向け)の概要
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacks
 
Let s database_testing
Let s database_testingLet s database_testing
Let s database_testing
 
よい名前を付けましょう リーダブルなんたらとか
よい名前を付けましょう   リーダブルなんたらとかよい名前を付けましょう   リーダブルなんたらとか
よい名前を付けましょう リーダブルなんたらとか
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦う
 

More from Kouhei Sutou

Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Kouhei Sutou
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowKouhei Sutou
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアKouhei Sutou
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかKouhei Sutou
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataKouhei Sutou
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像Kouhei Sutou
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataKouhei Sutou
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Kouhei Sutou
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームKouhei Sutou
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムKouhei Sutou
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroongaKouhei Sutou
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Kouhei Sutou
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムKouhei Sutou
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!Kouhei Sutou
 
PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版Kouhei Sutou
 

More from Kouhei Sutou (20)

Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
Apache Arrow Flight – ビッグデータ用高速データ転送フレームワーク #dbts2021
 
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache ArrowRubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
RubyKaigi Takeout 2021 - Red Arrow - Ruby and Apache Arrow
 
Rubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェアRubyと仕事と自由なソフトウェア
Rubyと仕事と自由なソフトウェア
 
Apache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのかApache Arrowフォーマットはなぜ速いのか
Apache Arrowフォーマットはなぜ速いのか
 
Apache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory dataApache Arrow 1.0 - A cross-language development platform for in-memory data
Apache Arrow 1.0 - A cross-language development platform for in-memory data
 
Apache Arrow 2019
Apache Arrow 2019Apache Arrow 2019
Apache Arrow 2019
 
Redmine検索の未来像
Redmine検索の未来像Redmine検索の未来像
Redmine検索の未来像
 
Apache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory dataApache Arrow - A cross-language development platform for in-memory data
Apache Arrow - A cross-language development platform for in-memory data
 
Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6Better CSV processing with Ruby 2.6
Better CSV processing with Ruby 2.6
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
Apache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォームApache Arrow - データ処理ツールの次世代プラットフォーム
Apache Arrow - データ処理ツールの次世代プラットフォーム
 
Apache Arrow
Apache ArrowApache Arrow
Apache Arrow
 
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システムMySQL・PostgreSQLだけで作る高速あいまい全文検索システム
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
 
MySQL 8.0でMroonga
MySQL 8.0でMroongaMySQL 8.0でMroonga
MySQL 8.0でMroonga
 
My way with Ruby
My way with RubyMy way with Ruby
My way with Ruby
 
Red Data Tools
Red Data ToolsRed Data Tools
Red Data Tools
 
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
Mroongaの高速全文検索機能でWordPress内のコンテンツを有効活用!
 
MariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システムMariaDBとMroongaで作る全言語対応超高速全文検索システム
MariaDBとMroongaで作る全言語対応超高速全文検索システム
 
PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!PGroonga 2 – Make PostgreSQL rich full text search system backend!
PGroonga 2 – Make PostgreSQL rich full text search system backend!
 
PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版PGroonga 2 - PostgreSQLでの全文検索の決定版
PGroonga 2 - PostgreSQLでの全文検索の決定版
 

名著『リーダブルコード』を解説者と一緒に読み解こう - 7章 制御フローを読みやすくする

  • 1. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 リーダブルコードを 読み解こう 7章 制御フローを読みやすくする 須藤功平 株式会社クリアコード schoo 2015-04-03
  • 2. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 質問(1) 前回の授業は… A:参加した✓ B:参加できなかった (都合が合わなかった、知らなかったなど) ✓ C:知っていたが参加していない✓
  • 3. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 質問(2) プログラミングについて A:未経験✓ B:学習中(schooや学校、独学など)✓ C:趣味・仕事でたまに書く (趣味でWebサイトを作っている、職業がデザイナーなど) ✓ D:趣味・仕事でバリバリ書く (趣味でOSSを開発している、職業がエンジニアなど) ✓
  • 4. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 質問(3) リーダブルコード(本)を… A:読んだ✓ B:読んでいる✓ C:まだ読んでいない✓
  • 5. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 内容 自己紹介✓ リーダブルコードとは✓ 実例で考えよう✓ 実際の改善にチャレンジ!✓ まとめ✓ 質疑応答✓
  • 6. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 自己紹介(1) リーダブルコードの 「解説」の著者 http://www.clear-code.com/blog/2012/6/11.html ✓
  • 7. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 自己紹介(2) クリアコードの代表取締役 「クリア」な(意図が明確な) 「コード」を大事にする ソフトウェア開発会社 ✓ ✓
  • 8. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 自己紹介(3) 毎日コードを書いている
  • 9. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 リーダブルコードとは(1) 本書の目的は、君のコードを よくすることだ [「はじめに p. x」より引用]
  • 10. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 リーダブルコードとは(2) その中心となるのは、コード は理解しやすくなければいけな いという考えだ [「はじめに p. x」より引用]
  • 11. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 リーダブルコードとは(3) 「コードを理解する」という のは、変更を加えたりバグを見 つけたりできるという意味 [「1.2 読みやすさの基本定理 p. 3」より引用]
  • 12. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 リーダブルコード 読む人が… 変更できるコード✓ バグを見つけられるコード✓ ↓ 読む人視点!
  • 13. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 何をしているコード? Node* node = list->head; if (node == NULL) return; while (node->next != NULL) { Print(node->data); node = node->next; } if (node != NULL) Print(node->data); 「優れた」コードって何? p. 2より
  • 14. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 何をしているコード? for (Node* node = list->head; node != NULL; node = node->next) Print(node->data); 「優れた」コードって何? p. 2より
  • 15. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 どちらがリーダブル? // どちらがリーダブルコード?どうして? // リーダブルコード:変更できる・バグを見つけられるコード // A // B Node* node = list->head; | for (Node* node = list->head; if (node == NULL) return; | node != NULL; while (node->next != NULL) { | node = node->next) Print(node->data); | Print(node->data); node = node->next; | } | if (node != NULL) | Print(node->data); | 「優れた」コードって何? p. 2より
  • 16. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 実例で考えよう 7章 「制御フローを読みやすくする」 より
  • 17. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1 例:式の並び順(1) /* A */ if (length >= 10) /* B */ if (10 <= length) どちらがリーダブル?
  • 18. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1 例:式の並び順(2) /* A */ while (bytes_received < bytes_expected) /* B */ while (bytes_expected > bytes_received) どちらがリーダブル?
  • 19. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1 式の並び順の指針 左側 「調査対象」の式。変化する。✓ length, bytes_received✓ ✓ 右側 「比較対象」の式。変化しにくい。✓ 10, bytes_expected✓ ✓
  • 20. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1 指針に沿った並び順 /* ↓調査対象。変化する。 */ if (length >= 10) /* ↑比較対象。変化しない。 */ /* ↓調査対象 */ while (bytes_received < bytes_expected) /* ↑比較対象 */
  • 21. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1 指針の理由 自然言語の並び順に近い /* もし長さが10以上なら */ if (length >= 10) /* もし10が長さ以下なら */ if (10 <= length)
  • 22. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:別の指針 左側 小さい値✓ ✓ 右側 大きい値✓ ✓ 左から右にいくほど 大きくなることは自然 (例:数直線)
  • 23. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:指針に沿った並び順 使う比較演算子は「<」と「<=」 if (10 <= length) while (bytes_received < bytes_expected)
  • 24. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.1:まとめ 条件式内の並び順を工夫すると リーダブル度があがる ✓ 指針: 左側:変化する式✓ 右側:変化しにくい式✓ ✓
  • 25. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 例:処理の順番(1) /* どちらがリーダブル? */ /* A */ | /* B */ if (a == b) { | if (a != b) { /* ケース1 */ | /* ケース2 */ } else { | } else { /* ケース2 */ | /* ケース1 */ } | }
  • 26. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 例:処理の順番(1) /* A:条件が肯定形だから */ /* A */ | /* B */ if (a == b) { | if (a != b) { /* ケース1 */ | /* ケース2 */ } else { | } else { /* ケース2 */ | /* ケース1 */ } | }
  • 27. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 例:処理の順番(2) /* どちらがリーダブル? */ /* (ケース1の方が処理が長い) */ /* A */ | /* B */ if (a == b) { | if (a != b) { /* ケース1 */ | /* ケース2 */ /* ... */ | } else { /* ... */ | /* ケース1 */ } else { | /* ... */ /* ケース2 */ | /* ... */ } | }
  • 28. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 例:処理の順番(2) /* B:単純な処理の条件が先 */ /* if/elseを一望しやすい */ /* A */ | /* B */ if (a == b) { | if (a != b) { /* ケース1 */ | /* ケース2 */ /* ... */ | } else { /* ... */ | /* ケース1 */ } else { | /* ... */ /* ケース2 */ | /* ... */ } | }
  • 29. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 指針 否定形は肯定形にして書く if (!debug)よりif (debug)✓ ✓ 単純な処理の条件を先に書く ifとelseを一望できて読みやすい✓ ✓ 関心を引く条件を先に書く✓ 目立つ条件を先に書く✓
  • 30. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 指針:注意 同時に満たせないことがある✓ 自分で優劣を判断すること✓ 優劣は明確になることが多い✓
  • 31. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 判断してみよう if (!url.HasQueryParameter("expand_all")) { response.Render(items); // ... } else { for (int i = 0; i < items.size(); i++) { items[i].Expand(); } // ... }
  • 32. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 !を外して順番を逆に // 関心を引く条件「expand_all」を優先 // (肯定形になったのはおまけ) if (url.HasQueryParameter("expand_all")) { for (int i = 0; i < items.size(); i++) { items[i].Expand(); } // ... } else { response.Render(items); // ... }
  • 33. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.2 まとめ 処理する条件の順番次第で リーダブル度があがる ✓ 指針: 否定形は肯定形にして書く✓ 単純な条件を先に書く✓ 関心がある・目立つ条件を先に書く✓ ✓
  • 34. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.5 関数から早く返す 「ガード節」 public boolean Contains(String str, String substr) { if (str == null || substr == null) // ガード節 return false; if (substr.equals("")) // ガード節 return true; // 大事な処理だけに興味があるなら↑までは無視可能。 // 大事な処理は↓から。 // ... }
  • 35. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.5 ガード節なし public boolean Contains(String str, String substr) { if (str == null || substr == null) { return false; // 異常値 } else { if (substr.equals("")) { return true; // 特別値 } else { // 大事な処理はここ。ネストが深い。 // ... } } }
  • 36. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 7.5 ガード節の効果 以降の処理が単純になる 異常値・特別値を考慮しなくてよい✓ →考える事が減る✓ ✓ ネストが浅くなる →コードの見通しがよくなる✓ ✓ リーダブルコードにつながる!
  • 37. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:ifとreturnの使い方 ifとreturnの使い方 ククログ(2012-03-28) http://www.clear-code.com/blog/2012/3/28.html
  • 38. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:パス 同じ処理でも流れ(パス)は違う if 条件 | return if !条件 サブ処理 | end | サブ処理
  • 39. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:パスとリーダブル パス 処理を実行するときの流れ✓ コードを読むときの流れでもある✓ ✓ 読みやすい流れ →リーダブル!✓ ✓
  • 40. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(1) def add_comment(post, user, text) if post.hidden_from?(user) report_access_error else comment = Comment.create(text) post.add(comment) end end
  • 41. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(1)コメント付き # コメントを追加するメソッドだな! def add_comment(post, user, text) if post.hidden_from?(user) # ユーザーに見えない投稿なら… report_access_error # エラー処理か。ifの後にもなにか処理はあるのかな? else comment = Comment.create(text) post.add(comment) # ユーザーに見えるときだけコメント追加か。 # こうやってコメントを追加するんだな。 end # ifの後にはなにも処理はないんだな。 end
  • 42. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(1)return付き # コメントを追加するメソッドだな! def add_comment(post, user, text) if post.hidden_from?(user) # ユーザーに見えない投稿なら… report_access_error # エラー処理をして、 return # それで終了か。 end # エラー処理が終わったからここからは通常の処理だな。 comment = Comment.create(text) post.add(comment) # こうやってコメントを追加するんだな! end
  • 43. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(1)まとめ 異常系と正常系の扱いを変える✓ 異常系はすぐにreturn エラー処理だけというのをアピール✓ ✓ 正常系はネストしない 正常系の方が重要なコード✓ 重要なコードは見やすい場所に✓ ✓
  • 44. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(2) def prepare_database(path) if not File.exist?(path) return Database.create(path) end Database.open(path) end
  • 45. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(2)コメント付き # データベースを準備するんだな def prepare_database(path) if not File.exist?(path) # なかったら… # 作ってすぐに終了か。あれ、作るのも普通の「準備」なような… return Database.create(path) end # あったら開くのか。これも「準備」だよなぁ。 # なにか特別な意図があるんだろうか… Database.open(path) end
  • 46. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(2)returnなし # データベースを準備するんだな def prepare_database(path) if File.exist?(path) # あったら… Database.open(path) # 開いて else # なかったら… Database.create(path) # 作るのか end end
  • 47. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 番外:例(2)まとめ 正常系同士の扱いを変えない 変えると意図があると勘違いする✓ 「Aの処理は何か特別なのかも…」✓ ✓ なんでもガード節にしない 特別なケースや異常系のときだけ✓ ✓
  • 48. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 他の例 三項演算子✓ ネストを浅くする✓ …✓ (詳細は本を買ってください)✓
  • 49. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 実際の改善にチャレンジ! // 読みやすい制御フローにして投稿・よい投稿に「いいね!」して応援 function positiveIntegerSum(n) { // n以下の正の整数の合計を返す if (0 >= n) { // ヒント: return -1; // エラー // 1. 条件式の並び順 } else { // * 左に変化するもの var total = 0; // * 右に変化しにくいもの for (; n > 0; n--) { // 2. 処理する条件の順番 total += n; // * 肯定形で書く } // * 単純な条件を先に書く return total; // * 関心がある条件を先に書く } // * 目立つ条件を先に書く } // 3. ガード節
  • 50. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 まとめ(1) リーダブルコードとは 変更できるコード✓ バグを見つけられるコード✓ ↑は読む人視点✓ ✓
  • 51. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 まとめ(2) 「読みやすい制御フロー」を 考えた 条件式内の並び順 →左に変化するもの・右に変化しにくいもの✓ ✓ 処理する条件の順番 →肯定形で書く・単純な条件を先に書くなど✓ ✓ ガード節 →特別なケースはすぐにreturn✓ ✓ ✓
  • 52. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 まとめ(3) 実際の改善にチャレンジした 「読む人が理解しやすいか?」を とことん考えたはず ✓ ✓ 行数を短くするよりも、他の 人が理解するのにかかる時間を 短くする。 [「7章 制御フローを読みやすくする p. 89」より引用]
  • 53. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 これから(1) これからも読む人のことを 考えてコードを書こう ✓ 読む人のことを考えるには? 読む経験をたくさん積む✓ たくさんコードを読もう✓ ✓
  • 54. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 これから(2) たくさんコードを読むコツ コードから学ぶ気持ちで読む✓ ×悪いこと探し✓ ○いいこと探し✓ ✓ 読むコード オススメは自分が使っているOSS✓ ↑動作を知っているから読みやすい✓ ✓
  • 55. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 悪いコード 見つけやすい 異質✓ リーダブルじゃない✓ ✓
  • 56. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 よいコード 見つけにくい リーダブルだから✓ すーっと理解できてひっかからない✓ ✓ これからのチャレンジ 意識して見つけよう!✓ ✓
  • 57. リーダブルコードを読み解こう - 7章 制御フローを読みやすくする Powered by Rabbit 2.1.7 これから(3) 「解説」を読む http://www.clear-code.com/blog/2012/6/11.html 本文:個人で リーダブルコードを書く方法 ✓ 解説:チームで リーダブルコードを書く方法 ✓