【他の人】と一緒にプログラムを書くときに注意すると不具合が起きにくい書き方!
プログラムスキルにおいて、仕事をする上で大事なスキルとしてあげられるのが、「人のコードを読む」、というのはよく言われます。
が、これ逆をいうと人に見られても解析されやすい書き方を最初っからしておけば問題無いんですよね・・・。
その中で、私の経験から幾つか書き方の気をつけ方をご提案。
ちなみにこれ、最短のコードでも最速のコードでも何でも無いです。
なーんか不具合が起きた時に他の人がすぐにわかりやすくするためのルールみたいなものだと思ってください
1.++を使わない(例外あり)
2.{}なしのコードを書かない
3.while文は極力避ける
4.引数を明示的にする
5.Get/Set関数の中でメンバー変数を変更しない
6.switch文にdefaultは絶対書く
7.else if文を書いたらelse文を追加する
8.不等号(< or >)は一方通行にしておく
(2015/09/30現在)
と、正直Moden Codingとか色んな書籍の内容に比べるとかなりチープな内容ですが、実際の職場だと、このくらい簡単なことに気をつけてもらってるだけで結構助かったりします
今回は1.++を使わない(例外あり)についてですが、先に例外の方を。
for文ではOK!というか使ってる箇所が多すぎて、利用を避けるほうがわかりにくくなります。
で、++を使わない方がいいという理由ですが、単純にインクリメントされた変数のあり方を気にするリスクを減らすというものです。
例えば、あるカウンターの数値がしきい値を超えた直後の値が欲しいみたいなときに以下のループ文みたいなのを作った時に。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int iCount = 0; int iCheck = 10; for(;;){// 無限ループ if( iCheck < iCount++ ){ // iCount == 12 break; } } iCount = 0; for(;;){// 無限ループ if( iCheck < ++iCount ){ // iCount == 11 break; } } |
どっちもbreakでiCheckを超えた値を返しはしますが、iCount++の方は超えた後に演算が入るため1ループ余分に回ることになってしまいます。
実際に欲しいのは11になるので今回のような場合は下の方の書き方の方が良かったですね!
・・・・・・
ってなるのがすでによくなぁぁぁい!
頭の回転が早い人なんかは1行で表せるからこの方法のほうがいいんでしょうが、プログラム始めたばっかりの人や、
納品物管理してる側からすると、もっとわかりやすく書いたほうがリファクタリングするときも簡単だし、誰から見ても意図が伝わりやすいはずです。
ゲームならたぶん1フレーム変化してしまう判定。これ自体は大したことないですが、アニメーションのつなぎなどでも同じようにしてしまうと
ちょっとカクッとなったりしてなんか微妙な見え方になってしまったりします
なので、私ならこんな感じにします
1 2 3 4 5 6 7 8 9 10 |
int iCount = 0; int iCheck = 10; for(;;){// 無限ループ if( iCheck < iCount ){ // iCount == 11 break; } iCount += 1; } |
こうしておけば、比較直後に加算して、再挑戦している。んで、条件を満たすまで同じことを繰り返している。
というのが明示的に示せます。加算した後の値なのか前の値なのかとか気にするような作りになる時点で可読性が低いのでは無いでしょうか。
また、わざわざ
1 |
iCount += 1; |
としているのですが、これもわざとです。
ゲームでプログラムとかしていると、加算してしきい値をまたいだら何々、みたいな判定はよくあるんですが、
プログラマ「作りましたよー」
企画「ごめーん、さっきのカウントアップするスピード2倍にしてもらえます!」
プログラマ「2倍にしましたよー」
企画「そこのスピードなんですけど、やっぱりキャラクターの速度に依存させるようにしてください。サーセンwww」
みたいなことが良くあります。
こういう時に加算値をすぐに変えれるようにしておいたほうが、後から変更するときもすぐできますし、
他の人が見た時になんだかわからないものになりにくいです。
ちなみに2倍にお願いした時点で、とある新人君が書いてきたコードが
1 2 3 4 5 6 7 8 9 10 |
int iCount = 0; int iCheck = 10; for(;;){// 無限ループ ++iCount; if( iCheck < ++iCount ){ // iCount == 11 break; } } |
++する回数が2回になったから2倍のスピード、ねぇ・・・。うん、まぁやり直しかな・・・
ちなみに見た感じもビミョーなコードですが、結果も変わってしまいますね。
ということで、基本的に文章内になる++は極力避けて書いたほうがいいです。
こういったひっそりしたところに注意するだけでもプログラム意図が伝わりやすかったり、誤解されにくくなります。
ご自身のコードでも、細かい部分ではありますが、わかりにくい部分で判定ミスしているなんてことないか確かめてみてはいかがでしょうか?
ではでは・・・