SlideShare a Scribd company logo
読みやすいコードを書くために
元ネタ:リーダブルコード
目次
1.変数名
2.制御フロー
3.コメント
4.実践
なぜ読みやすいコード書くのか

個人・組織の生産性が上がる

保守性が上がる

いらいらがなくなる

柔軟な開発体制が構築できる
変数に関して
1. わかりやすい名前をつける
2. 定義する位置に気をつける
3. 説明変数を使う
変数に関して
<わかりやすい名前をつける>

抽象的な名前をさける (tmp,ret,val)
$sql => $get_item_info_sql
$retval => $item_info
変数に関して
<命名規則>
PHPの場合
関数名は、小文字・アンダースコアで単語を区切る
ex) get_user_info()
メソッド名は、キャメルケース
ex) getUserInfo()
キャメルケース読みづらい。。。
変数に関して
<汎用的命名規則一覧>
動詞+名詞+(α)がわかりやすい
・〜を取得する => get_~~~~
ex) get_user_name()
・〜を定義する => set or define_~~~~
ex) set_val_for_query()
・〜かどうか => is_~~~~
iex) s_numeric
・結論:開発現場に合わせる
変数に関して
<わかりやすい名前をつける>

右辺を見る前に処理を想像させる
$today = new Datetime ();
$lastdate = new Datetime ('20140927');
$tmp = new Datatime('20140901');
$update = new Datatime('20140922');
$tmp .... ? なにこれ ... ?
変数に関して
<定義する位置に気をつける>
class Hoge ( $hoge ) {
// 郵便番号を取得する処理
$zipcode = xxxxxx; ◀class callされるたびに定義される
人にも機械にも優しくない
============50行===============
($zipcodeって?)
function get_zipcode( $zipcode ) {
..............
$customer_address = get_customer_address( $zipcode );
}
function get_customer_address ( $zipcode ) {
..............
}
変数に関して
<定義する位置に気をつける>
class Hoge ( $hoge ) {
function get_zipcode() {
// 郵便番号を取得する処理 ローカル変数
$zipcode = xxxxxx;
$customer_address = get_customer_address( $zipcode );
return $customer_address;
}
function get_customer_address ( $zipcode ) {
..............
}
変数に関して
<説明変数を使う>

条件式を変数にしておく
// 説明変数
$user_id = get_cutomer_name( $get_customer_sql );
If ( $user_id === NULL ) return false;

関数の引数名で説明する(タイプヒンディング)
  function get_buy_history( array $user_info ) {
   …........
}
$prm, とか, $aryはなにかわかりにくい。
結局呼びだし部分を見なくてはいけなくなる。
制御フローに関して
1. ネストを重ねるのはさける
2. ひとつの関数でひとつの処理
制御フローに関して
<ネストを重ねない>
1.ネストを重ねない
            
制御フローに関して
<ネストを重ねないためには>
・除外ケース(false)から返す
例)会員カードを持っていて、
月に〜円以上の買い物をしていて、
かつ性別・年齢層に応じて
DMを送る処理の場合
制御フローに関して
<ネストを重ねないためには>
・普通に書くと
function send_mail($user_info){
If ($user_info['has_card'] === true
&& $user_info['sum_per_month'] >= 5000 ) {
If ( $user_info['gender'] === 1)
// メール送る処理
}else{
// メール送る処理
}
}
}
制御フローに関して
<ネストを重ねないためには>
読みたくない!!
            
制御フローに関して
<ネストを重ねないためには>
function send_mail($user_info){
// 除外条件先に返す
if ($user_info['has_card'] === false) return false;
if ($user_info['sum_per_month'] < 5000) return false;
If ( $user_info['gender'] === 1)
// メール送る処理
}else{
// メール送る処理
}
}
制御フローに関して
<1つの関数で1つの処理を>
2.1つの関数で1つの処理を
            
制御フローに関して
<1つの関数で1つの処理を>
・除外の判定とメール送る処理
function send_mail($user_info){
// 除外条件先に返す
if ($user_info['has_card'] === false) return false;
if ($user_info['sum_per_month'] < 5000) return false;
If ( $user_info['gender'] === 1){
// メール送る処理
}else{
// メール送る処理
}
}
制御フローに関して
<1つの関数で1つの処理を>
・除外の判定とメール送る処理
function send_mail($user_info){
// 除外条件先に返す
if ($user_info['has_card'] === false) return false;
if ($user_info['sum_per_month'] < 5000) return false;
If ( $user_info['gender'] === 1){
// メール送る処理
}else{
// メール送る処理
}
}
制御フローに関して
<1つの関数で1つの処理を>
・除外の判定とメール送る処理
function send_mail($user_info){
// 除外条件先に返す
if ($user_info['has_card'] === false) return false;
if ($user_info['sum_per_month'] < 5000) return false;
If ( $user_info['gender'] === 1){
$this->send_mail_to_male($user_info);
}else{
$this->send_mail_to_female($user_info);
}
}
制御フローに関して
<1つの関数で1つの処理を>
・除外の判定とメール送る処理
function send_mail($user_info){
// 除外条件先に返す
if ($user_info['has_card'] === false) return false;
if ($user_info['sum_per_month'] < 5000) return false;
If ( $user_info['gender'] === 1){
$this->send_mail_to_male($user_info);
}else{
$this->send_mail_to_female($user_info);
}
}
制御フローに関して
<1つの関数で1つの処理を>
function send_mail_to_male($user_info){
// メール文章を取得
$text = text_for_male($user_info);
// レコメンドする商品取得
$recommend_item = get_recommend_item($user_info) ;
…........
}
1つの関数に2つの処理がありますね。。。
コメントに関して
1. コメントは簡潔に最小限に
2. 感じたことはメモ感覚で残す
3. プログラミングするまえに、
制御フローを説明できるようにする
コメントに関して
<感じたことはメモ感覚で残す>
 ・コーディングの感覚残しておく
// ぶっちゃけコピペしました
   $date_diff = $now_date>diff( $ship_date );
// ここテストケース通すの大変だった
If ( $data_diff->format('%d') ) {
….....
}
コメントに関して
<フローを言葉にしてから書く>
 ・仕様書読んで、処理毎に言葉にして書く
// シリアルナンバー取得する処理
function get_serial_num($cutomer_id) {
// DBからシリアルナンバー取得
// 重複がないかチェックする
// 下3桁がXXXの場合はフラグ付与
}
・どこまで出来たかが把握できる

More Related Content

What's hot

後期第六回ネットワークチーム講座資料
後期第六回ネットワークチーム講座資料後期第六回ネットワークチーム講座資料
後期第六回ネットワークチーム講座資料
densan_teacher
 
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
Insight Technology, Inc.
 
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについてAndroidの通信周りのコーディングについて
Androidの通信周りのコーディングについてShoichi Takagi
 
Racc でおてがる構文解析
Racc でおてがる構文解析Racc でおてがる構文解析
Racc でおてがる構文解析
morphine57
 
URIやTEXTをBEAMするアプリを作ったよ!
URIやTEXTをBEAMするアプリを作ったよ!URIやTEXTをBEAMするアプリを作ったよ!
URIやTEXTをBEAMするアプリを作ったよ!
treby
 
次世代DaoフレームワークDoma
次世代DaoフレームワークDoma次世代DaoフレームワークDoma
次世代DaoフレームワークDomaToshihiro Nakamura
 
Beam利用アプリ紹介+関連技術ネタ
Beam利用アプリ紹介+関連技術ネタBeam利用アプリ紹介+関連技術ネタ
Beam利用アプリ紹介+関連技術ネタ
Kenichi Kambara
 
DeclarativeSql
DeclarativeSqlDeclarativeSql
DeclarativeSql
Takaaki Suzuki
 
Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010
Hiro Yoshioka
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
 
コードで感じるKotlin入門
コードで感じるKotlin入門コードで感じるKotlin入門
コードで感じるKotlin入門
iPride Co., Ltd.
 
ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計
kaminashi
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
Yoshio Hanawa
 
Project coin
Project coinProject coin
勉強会 - 6
勉強会 - 6勉強会 - 6
勉強会 - 6
KenjiYamasaki5
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方
Sho Shimauchi
 
Pgunconf neo4j fdw
Pgunconf neo4j fdwPgunconf neo4j fdw
Pgunconf neo4j fdw
Toshi Harada
 
S2dao Seminar in tripodworks
S2dao Seminar in tripodworksS2dao Seminar in tripodworks
S2dao Seminar in tripodworkstripodworks
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト
bsdhack
 
データベースのお話
データベースのお話データベースのお話
データベースのお話
Hidekazu Tanaka
 

What's hot (20)

後期第六回ネットワークチーム講座資料
後期第六回ネットワークチーム講座資料後期第六回ネットワークチーム講座資料
後期第六回ネットワークチーム講座資料
 
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう  by SRA OSS, Inc. 日本支社 高塚遥
[db tech showcase Tokyo 2014] B26: PostgreSQLを拡張してみよう by SRA OSS, Inc. 日本支社 高塚遥
 
Androidの通信周りのコーディングについて
Androidの通信周りのコーディングについてAndroidの通信周りのコーディングについて
Androidの通信周りのコーディングについて
 
Racc でおてがる構文解析
Racc でおてがる構文解析Racc でおてがる構文解析
Racc でおてがる構文解析
 
URIやTEXTをBEAMするアプリを作ったよ!
URIやTEXTをBEAMするアプリを作ったよ!URIやTEXTをBEAMするアプリを作ったよ!
URIやTEXTをBEAMするアプリを作ったよ!
 
次世代DaoフレームワークDoma
次世代DaoフレームワークDoma次世代DaoフレームワークDoma
次世代DaoフレームワークDoma
 
Beam利用アプリ紹介+関連技術ネタ
Beam利用アプリ紹介+関連技術ネタBeam利用アプリ紹介+関連技術ネタ
Beam利用アプリ紹介+関連技術ネタ
 
DeclarativeSql
DeclarativeSqlDeclarativeSql
DeclarativeSql
 
Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010Sourcecode Reading Workshop2010
Sourcecode Reading Workshop2010
 
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
 
コードで感じるKotlin入門
コードで感じるKotlin入門コードで感じるKotlin入門
コードで感じるKotlin入門
 
ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
Project coin
Project coinProject coin
Project coin
 
勉強会 - 6
勉強会 - 6勉強会 - 6
勉強会 - 6
 
使い捨て python コードの書き方
使い捨て python コードの書き方使い捨て python コードの書き方
使い捨て python コードの書き方
 
Pgunconf neo4j fdw
Pgunconf neo4j fdwPgunconf neo4j fdw
Pgunconf neo4j fdw
 
S2dao Seminar in tripodworks
S2dao Seminar in tripodworksS2dao Seminar in tripodworks
S2dao Seminar in tripodworks
 
仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト仕事で使えるシェルスクリプト
仕事で使えるシェルスクリプト
 
データベースのお話
データベースのお話データベースのお話
データベースのお話
 

Similar to リーダブルコード勉強会

Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Takuya Matsunaga
 
5分で分かる名前空間とオートロード
5分で分かる名前空間とオートロード5分で分かる名前空間とオートロード
5分で分かる名前空間とオートロード
K Holy
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1kenjis
 
Rの初歩: 4. 関数とプログラミング
Rの初歩: 4. 関数とプログラミングRの初歩: 4. 関数とプログラミング
Rの初歩: 4. 関数とプログラミング
Teiko Suzuki
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会
Yuji Otani
 
20180123 power shell
20180123 power shell20180123 power shell
20180123 power shell
Trainocate Japan, Ltd.
 
はじめてのPowerShell
はじめてのPowerShellはじめてのPowerShell
はじめてのPowerShell
Trainocate Japan, Ltd.
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
kenjis
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
kenjis
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JPCERT Coordination Center
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
Soudai Sone
 
20091030cakephphandson 02
20091030cakephphandson 0220091030cakephphandson 02
20091030cakephphandson 02Yusuke Ando
 
C#coding guideline その2_20130325
C#coding guideline その2_20130325C#coding guideline その2_20130325
C#coding guideline その2_20130325Yoshihisa Ozaki
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to Objects
Fumitaka Yamada
 

Similar to リーダブルコード勉強会 (17)

Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
 
5分で分かる名前空間とオートロード
5分で分かる名前空間とオートロード5分で分かる名前空間とオートロード
5分で分かる名前空間とオートロード
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
Rの初歩: 4. 関数とプログラミング
Rの初歩: 4. 関数とプログラミングRの初歩: 4. 関数とプログラミング
Rの初歩: 4. 関数とプログラミング
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会
 
20180123 power shell
20180123 power shell20180123 power shell
20180123 power shell
 
はじめてのPowerShell
はじめてのPowerShellはじめてのPowerShell
はじめてのPowerShell
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
Php5.4
Php5.4Php5.4
Php5.4
 
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
JRE標準ライブラリの脆弱性事例を理解する (AtomicReferenceArrayクラス と Type Confusion)
 
知って得する標準関数の使い方
知って得する標準関数の使い方知って得する標準関数の使い方
知って得する標準関数の使い方
 
20091030cakephphandson 02
20091030cakephphandson 0220091030cakephphandson 02
20091030cakephphandson 02
 
C#coding guideline その2_20130325
C#coding guideline その2_20130325C#coding guideline その2_20130325
C#coding guideline その2_20130325
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48Effective Java 輪読会 項目45-48
Effective Java 輪読会 項目45-48
 
C#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to ObjectsC#を始めたばかりの人へのLINQ to Objects
C#を始めたばかりの人へのLINQ to Objects
 

リーダブルコード勉強会