大阪で(ry

明治時代の大阪の活気を再び!

大阪の皮を被った、技術メモと開発日記。

IT総合

見やすいコードの心がけてる事

久しぶりに問題解決ネタとかメモ書き以外の事も書いてみたいと思います
と言ってもこれもメモ書きに近いようなもんだと思いますけど・・・

サンプルコードとか見てるとよく思うんです
。o(これをコピペしているエンジニアの方も多いんだろうな)

そしてこのコピペ元のコードはと言うと
多くの場合は実運用を想定していないから適当なものになってるんですよ
ただ、コピペしたからって、このコードをちゃんと整形してれば問題はないと思われますがね・・・

さて、実験用とかを除いて私がちゃんと作る上でこころがけてるコードの書き方をちょっと紹介します
これは初めてエンジニアとして仕事をさせて貰った時にベテランの方から色々と教わった書き方が多いです
なお、PHPを前提として書いてますが悪しからず

Step1
returnを活用しよう!
PHPでプラグラムを終了させる命令は2つあります
exitとdieです
早速脱線ですが、これって違いは?→どうやらないようです、お互いのエイリアスってところでしょうか
ただ、違った意味でもう1つあります
メソッド、もしくはクラス内でメソッドを用いる場合にはreturnが使えます
returnって値を返す奴でしょ?と私も思ってましたが
そのメソッドを終わらせる事が出来るので、途中で処理を終わらせるテクニックとして使えるんだよ
と教わりました
後でこの事も書きますが、例えばif文
elseとか出来れば書きたくないですよね?

if($result == "fail!") return false;

とまぁ、こんな感じで一行で済ませる事が出来るわけです

Step2
elseはあまり使いたくない!

$hoge = getData();
if($hoge == 1)
{
 echo 'Success!';
}else{
 echo 'Failed!';
}

こんなコードを書くじゃないですか
値が1なら成功でなんか続きの処理とかをかくわけです
その以外なら失敗とみなす
そしたらStep1の事でもっとスマートに書けるわけですよ

$hoge = getData();
if($hoge != 1) return false;
echo 'Success!';

$hogeの値が1以外ならその時点で終了しています
1なら処理を続行して成功と出すわけなんです
elseを用いて長々と書くよりは見やすくなります

Step3
三項演算子を使おうよ!
returnだと処理を止めてしまうよね?
値によって変数に代入する内容を変えたい場合は?
三項演算子なんです!
サンプルコード紹介ではあまり使われてないように思います

$hoge = getData();
$result = $hoge == 1 ? "Success!" : "Failed!";

こんな風にifを使わないで書けるところがいいですね
更に見やすく

$hoge = getData();
$result = $hoge == 1 ? 
      'Success!' : 
      'Failed!';

なーんて書くことも可能
ただ、三項演算子はifでやるより遅くなるそうです
使い分けでしょうか?

ここまではベテランエンジニアに教えてもらったテクニックです
続いて、私が日頃思ってるのは・・・

Step4
elseを多用するならswitchがいい
1から10までの値があり、それに対して処理方法も変わる場合があると思います
そしたら条件判断処理をどう書けばいいのでしょうか?

if($hoge == 1)
{
 echo '1';
}elseif($hoge == 2){
 echo '2';
}elseif...
.....
}

うわぁぁぁ・・・止めてほしい・・・
ならばこう書いた方がいいかも

switch($hoge)
{
 case 1:
  echo '1';
  break;
 case 2:
  echo '2';
  break;
}

まだ見やすいかなと思うんですよ
そもそもこんなに多種な条件を出してしまうフロー設計には出来る限りしたくないところ・・・

Step5
可変変数ってもっと可能性あるよね?
可変変数ってのは変数の値を変数名に割り当てる事のできる便利な方法です
なんですが・・・あのり使ってるところを見かけない・・・
例えば連想配列の展開時に全ての値に何かの処理を加えたいと思います
配列をキー名は変数にして展開するだけならextract関数が使えます

$ary = ['hello' => 'world!'];
extract($ary)
echo $hello;

world!って出るんですよ
そこで、上の方からこんな要求が出ます
上司「値を全部大文字にして欲しい」
キー名が全てDBのカラムと関連付けあるとしてどうやって書くでしょうか?
連想配列から連想配列でって手段は今の多数派ですかね?

$ary = ['hello' => 'world!', 'that' => 'is a pen', 'pen' => 'pineapple', 'apple' => 'pineapple'];
foreach($ary as $key => $val)
{
 $data[$key] = strtoupper($val);
}

後でINSERT INTO … $data[‘hello’]なんて書くんです
けど・・・!

$ary = ['hello' => 'world!', 'that' => 'is a pen', 'pen' => 'pineapple', 'apple' => 'pineapple'];
foreach($ary as $key => $val)
{
 $$key = strtoupper($val);
}

こんな風に書けば・・・
$helloという変数が作成されて、その値がWORLDになるわけなんです
配列が用意されていれば、DB処理に入るまでに3行でDB用のデータを様子出来るんですよ
連想配列を入れ直して処理するか、可変変数として処理するかは皆様方の判断にお任せしますが
私は可変変数の方が好きなんです・・・

Step6
複数の変数に同一値を代入
これは知られてる方法かもしれませんが
$helloの中の変数を$againと$feelingに入れたいとします
すると大抵は・・・

$hello = 'world';
$again = $hello;
$feeling = $hello;

この様に代入に2行の追加措置が必要になります
けど、こんな方法が使えるんです

<?php
$hello = 'world';
$again = $feeling = $hello;

たった一行で一度に$againと$feeliingの2つの変数に代入出来るわけなんです
これって2つだけ?いいえ!

<?php
$hello = 'world';
$again = $feeling = $heart = $hello;

と、3つでもいいし、もっともっとたくさんの変数に一度に代入出来ます
何回も$helloを書かなくていい分、労力コストは下がりますね

まぁ・・・とりあえずはこんなところです・・・