Upload
takuya-yamamoto
View
734
Download
0
Embed Size (px)
Citation preview
読みやすいコードを書くために
元ネタ:リーダブルコード
目次
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の場合はフラグ付与
}
・どこまで出来たかが把握できる