26
読みやすいコードを書くために 元ネタ:リーダブルコード

リーダブルコード勉強会

Embed Size (px)

Citation preview

Page 1: リーダブルコード勉強会

読みやすいコードを書くために

元ネタ:リーダブルコード

Page 2: リーダブルコード勉強会

目次

1.変数名2.制御フロー3.コメント4.実践

Page 3: リーダブルコード勉強会

なぜ読みやすいコード書くのか

個人・組織の生産性が上がる 保守性が上がる いらいらがなくなる 柔軟な開発体制が構築できる

Page 4: リーダブルコード勉強会

変数に関して

1. わかりやすい名前をつける2. 定義する位置に気をつける3. 説明変数を使う

Page 5: リーダブルコード勉強会

変数に関して<わかりやすい名前をつける>

抽象的な名前をさける (tmp,ret,val)

$sql => $get_item_info_sql$retval => $item_info

Page 6: リーダブルコード勉強会

変数に関して<命名規則>

PHPの場合

関数名は、小文字・アンダースコアで単語を区切る ex) get_user_info()

メソッド名は、キャメルケース ex) getUserInfo()

キャメルケース読みづらい。。。

Page 7: リーダブルコード勉強会

変数に関して<汎用的命名規則一覧>

動詞+名詞+(α)がわかりやすい

・〜を取得する => get_~~~~ ex) get_user_name()

・〜を定義する => set or define_~~~~ ex) set_val_for_query()

・〜かどうか => is_~~~~ iex) s_numeric

・結論:開発現場に合わせる

Page 8: リーダブルコード勉強会

変数に関して<わかりやすい名前をつける>

右辺を見る前に処理を想像させる

$today = new Datetime ();$lastdate = new Datetime ('20140927');$tmp = new Datatime('20140901');$update = new Datatime('20140922');

$tmp .... ? なにこれ ... ?

Page 9: リーダブルコード勉強会

変数に関して<定義する位置に気をつける>

class Hoge ( $hoge ) {// 郵便番号を取得する処理$zipcode = xxxxxx; ◀class callされるたびに定義される

人にも機械にも優しくない============50行===============

($zipcodeって?)function get_zipcode( $zipcode ) {

..............$customer_address = get_customer_address( $zipcode );

}

function get_customer_address ( $zipcode ) {..............

}

Page 10: リーダブルコード勉強会

変数に関して<定義する位置に気をつける>

class Hoge ( $hoge ) {

function get_zipcode() {// 郵便番号を取得する処理 ローカル変数$zipcode = xxxxxx;$customer_address = get_customer_address( $zipcode );

return $customer_address; }

function get_customer_address ( $zipcode ) {..............

}

Page 11: リーダブルコード勉強会

変数に関して<説明変数を使う>

条件式を変数にしておく// 説明変数

$user_id = get_cutomer_name( $get_customer_sql ); If ( $user_id === NULL ) return false;

関数の引数名で説明する(タイプヒンディング)  function get_buy_history( array $user_info ) {   …........

}

$prm, とか, $aryはなにかわかりにくい。結局呼びだし部分を見なくてはいけなくなる。

Page 12: リーダブルコード勉強会

制御フローに関して

1. ネストを重ねるのはさける2. ひとつの関数でひとつの処理

Page 13: リーダブルコード勉強会

制御フローに関して<ネストを重ねない>

1.ネストを重ねない            

Page 14: リーダブルコード勉強会

制御フローに関して<ネストを重ねないためには>

・除外ケース(false)から返す

例)会員カードを持っていて、月に〜円以上の買い物をしていて、かつ性別・年齢層に応じてDMを送る処理の場合

Page 15: リーダブルコード勉強会

制御フローに関して<ネストを重ねないためには>・普通に書くと

function send_mail($user_info){If ($user_info['has_card'] === true

&& $user_info['sum_per_month'] >= 5000 ) {If ( $user_info['gender'] === 1)

// メール送る処理}else{

// メール送る処理}

}}

Page 16: リーダブルコード勉強会

制御フローに関して<ネストを重ねないためには>

読みたくない!!

            

Page 17: リーダブルコード勉強会

制御フローに関して<ネストを重ねないためには>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{// メール送る処理

}}

Page 18: リーダブルコード勉強会

制御フローに関して<1つの関数で1つの処理を>

2.1つの関数で1つの処理を            

Page 19: リーダブルコード勉強会

制御フローに関して<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{// メール送る処理

}}

Page 20: リーダブルコード勉強会

制御フローに関して<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{// メール送る処理

}}

Page 21: リーダブルコード勉強会

制御フローに関して<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);

}}

Page 22: リーダブルコード勉強会

制御フローに関して<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);

}}

Page 23: リーダブルコード勉強会

制御フローに関して<1つの関数で1つの処理を>

function send_mail_to_male($user_info){// メール文章を取得$text = text_for_male($user_info);// レコメンドする商品取得$recommend_item = get_recommend_item($user_info) ;…........

}

1つの関数に2つの処理がありますね。。。

Page 24: リーダブルコード勉強会

コメントに関して

1. コメントは簡潔に最小限に2.感じたことはメモ感覚で残す3. プログラミングするまえに、 制御フローを説明できるようにする

Page 25: リーダブルコード勉強会

コメントに関して<感じたことはメモ感覚で残す>

 ・コーディングの感覚残しておく

// ぶっちゃけコピペしました   $date_diff = $now_date>diff( $ship_date );

// ここテストケース通すの大変だったIf ( $data_diff->format('%d') ) {

….....}

Page 26: リーダブルコード勉強会

コメントに関して<フローを言葉にしてから書く>

 ・仕様書読んで、処理毎に言葉にして書く// シリアルナンバー取得する処理function get_serial_num($cutomer_id) {

// DBからシリアルナンバー取得// 重複がないかチェックする// 下3桁がXXXの場合はフラグ付与

}

・どこまで出来たかが把握できる