プログラムって、実行して失敗して、それを直して初めてスキルとして少しだけワンランクレベルがあがることができる、経験蓄積型であるということをよく理解している、ユゲタです。
なので、プログラミングを一朝一夕に習得するのって、絶対にできないし、実際に手を動かさずに、動画を見たり人の作ったプログラムを眺めているだけでは、絶対に何も上達しないというのが、特徴でもあります。
ということは、プログラミングは、「書けば書くほど上達する」というという考え方に行き着くと思いますが、その通りなんですね。
もちろん、タイピングの速さというだけではなく、人のプログラムをコピペするのではなく、自分のタイピングで打ち込んでみるという根気も、このスキルアップに大きく関係してきます。
そんななか、プログラミング歴15年以上になろうかというベテランの粋に達していると自負していたユゲタですが、この度初歩的なトラブルに見舞われてしまったので、
その内容をご紹介。
繰り返し文の中のcontinue処理でのトラブル
まず、PHPで、次のようなシンプルな繰り返し文を実行してみます。
<?php
for($i=0; $i<10; $i++){
echo $i.",";
}
> 0,1,2,3,4,5,6,7,8,9,
想像どおりの表示がされて、何の問題もないのですが、
この繰り返し処理で、ある数値の場合の時に、処理をスキップさせたいと思い、switch文でその処理を書いてみました。
<?php
for($i=0; $i<10; $i++){
switch($i){
case 2:
case 4:
continue;
break;
}
echo $i.",";
}
2と4の値の時に、continueさせて、echoをスキップさせてみようとしました。
これを実行した結果は、
Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in index.php on line 7
> 0,1,2,3,4,5,6,7,8,9,
このようなエラーがでました。
さらに、実行結果も正常にechoがスキップされていません。
どうやら、これは、「switch内でcontinueを使うのは、NG」というグランドルールが合ったようですね。
PHPのバージョン5xぐらいまでは、エラーは出ずに想像道理の処理ができていたようですが、7xバージョンから、エラー(warning)対象になってしまったようです。
でも、次のように書くと、正常に処理されます。
continueに、どの階層の処理をするか、値をつけてあげるという記述で、下位互換に対応しているようです。
<?php
for($i=0; $i<10; $i++){
switch($i){
case 2:
case 4:
continue 2;
break;
}
echo $i.",";
}
> 0,1,3,5,6,7,8,9,
Javascriptでもやってみる
まずは、基本のループが確認できる処理をHTMLで記述
<script>
let str = "";
for(let i=0; i<10; i++){
str += i+",";
}
console.log(str);
</script>
> 0,1,2,3,4,5,6,7,8,9,
コンソール画面に、想定の結果が表示されました。
次に、switch-continueを書いてみます。
<script>
let str = "";
for(let i=0; i<10; i++){
switch(i){
case 2:
case 4:
continue;
break;
}
str += i+",";
}
console.log(str);
</script>
> 0,1,3,5,6,7,8,9,
あらあら、errorやwarningなど一切出ずに、正常に分岐してcontinueすることができました。
結論、オレのコーディングルール
php7xで、switch内でのcontinueを無作為に使うことがwarning対象になったということを知らなかったユゲタが調査不足だったのですが、
continueの記述が、値がつけられるという他の言語と扱い方が変わってしまったということで、
そのルールに従うぐらいなら、switch文の中でcontinueを使用しないというグランドルールを作ったほうが、別言語との互換性が保たれるように感じました。
この辺のルールは、携わる仕事やチームに依存する場合もあるし、プログラミングする人それぞれのルールなので、ユゲタ的ルールが絶対というワケではないので、
この記事を読んでいる人それぞれが、自己判断で処理してもらうといいかと思います。
まあ、言語ごとの、同じ命令文なのに、こうしたちょっとした違いって、まあまあいくつかありますからね。
そういうことを覚えていくというのも、プログラミングスキルだし、そうした複数の言語を誤って使わないように、自分ルールを作っていくのも、
重要なプログラミングスキルであると感じた今回の実験でした。
さあ、気持ちをswitchさせて、continueしていきましょう!!
0 件のコメント:
コメントを投稿