マジックナンバー

例えば、HTTPのステータスコードについて、 `BAD_REQUEST = 400` みたいな定数を定義して使っているコードは、間違いなく残念なコードです。なぜこんなコードは書かないのか。その理由の一つは、Bad Requestを表すステータスコードの値が400であることが、今後変わることはほぼ絶対にありえない、ということです。(もうひとつは、ステータスコードという概念と値が十分に知られていることです)

うーん,ここは間違いだと思う.

基本的に 「BAD_REQUEST = 400」と書くべきだし,可能なら Type Safe Enumの使用も検討すべき場面だ.使わなくてもそんなに問題ないこともあるけど,「間違いなく残念」と言い切っちゃだめ.たぶん90%くらいは良いコードで,悪いコードは1%もないだろう.


https://b.hatena.ne.jp/entry/s/note.mu/qsona/n/nb971c8fc5976

  • id:otherworld 将来的に変わる可能性があるから定数にするのではなく、名前をつけないと意味不明になるからつける。説明なしに42が出てきたら「生命、宇宙、そして万物についての究極の疑問の答え」だと思う新卒がいるかもしれない
  • id:devorgachem BAD REQUEST とか番号覚えられないマンなので… なお、テキストがあれば思い出せる。なんというか domain name 書くんじゃなくて IP を書けと言われている気分になる
  • id:surume000 部分的に賛成できない。たとえば405(Method Not Allowed)は400ほど有名ではない。じゃあ405だけ定数化して400は定数化しないまま?おれは両方定数化したほうが良いと思う
  • id:marshi javaapacheのhttpclientライブラリには定数定義されてた気がする。ライブラリは別なのかあれも残念コードなのか。定数化するとコードの検索でひっかけやすくなるっていうメリットはあるかな。
  • id:chimerast “設計力の高いシニアなエンジニアがスタートアップ最初期に入っても” これ逆(?)で、不確実だからこそ技術的負債の発生を最小限に抑えるために、設計力の高いエンジニアが初めから入るべきだと思ってる。


  • id:D_first BAD_REQUEST = 400はダメなのか。打ち間違い防止になると思ったんだけど。

間違い防止のため,可読性のために必用だと思う.全ステータスコードを丸暗記してない人は,こんなコードは絶対に書くべきではない.*1

ほんと,ここの部分で間違った例をもってきてるので,この文章全体がとてつもなく胡散臭くなってる.

typo

return 401; 

と書いても,コードは問題なく通ってしまう.後でバグが出て,ここで 401 Unauthorized でないことだけは分かっても,本来なにを返すのが正しかったのかは,これだけでは全く分からない.それが400だと知ってるのは作った本人だけだ.他人に読めないコードはこうやって作られていく.*2


可読性とかデバッグのことも考慮しないのは,良いコードとは言えないのだ.


変わらない定数は即値で書いて良いなら,円周率だって毎回3.141592って書いても良いんだ.そして場所によってTypoがあって3.15になってたり,精度が違う3.141になってたりすれば,発見しにくいバグになる.

400や1024みたいなキリのいい数字だと,偶然他の数値と重なることだってあるかもしれない.

異なる定数を比較して一致してるので間違って TRUE を返すのは,C言語enum型で良くあったバグの一つだ.だからこそTypeSafeEnumが登場したんだ.

良い設計を知るには,過去の失敗パターン,バッドノウハウを知ることも重要だ.

改訂新版 Cプログラミング診断室

改訂新版 Cプログラミング診断室

http://www.pro.or.jp/~fuji/mybooks/cdiag/index.html#mokuji

  • id:nissax 42が駄目な理由を400が駄目な理由にも適用できて微妙。BAD_REQUESTは400よりも良いよ。被検索性も高い。

それもあった.

かりにBAD REQUESTまわりの挙動がおかしいと分かったとき,関連するコードを探すのにgrepIDEのコマンド一つで検索できるのと,400どころか1400や4000なんかにもマッチして振り回されるのとでは雲泥の差.

さらにこれが元号が「M,T,S,H」の一文字だったりすると,ほんとにもう.

*1:そしてそんな人は滅多にいない.記憶力は有限なのだ.他のもっと有意義なことに使うべき.

*2:こういう糞コードの解読作業をやらされたことは数知れず.