概要
@rana_kualu さんの記事に触発されて、
自分が今まで見かけたなかでもヤバめのクソ コードについて書いてみる。
(元記事)
・これまで見た中で最も汚いソースコード - Qiita
https://qiita.com/rana_kualu/items/2f3c40642836c11f5ddc
クソ コード
① typedef
typedef void coid;
typedef void boid;
キーボードを見ると [c] [v] [b] が並んでいる。
即ちこれは、 タイプミスを型名の再定義でカバー しているというもの。
流石にコレは プログラムではない、と思った。
② マイナス1万
変数名はとりあえず適当。
$date0 = '20201122'; //画面からYYYYMMDDで文字列が来る
$date1 = $date0 -10000;
$year = substr($date1, 0, 4);
$month = substr($date1, 4, 2);
$day = substr($date1, 6, 2);
なんだこの1万を引いている処理は・・・。
(当時の)同僚が保守中の仕組みからこのコード見つけ、一緒に悩んだ。
日付系処理では1万はキリが悪い。。。
幸いにも書いた輩が隣に居たので直接聞いてみた。
1年前を計算している
なるほど!
書き直せ!
幸いにも書いた輩が高校から友人(同級生)だったので、とりあえず殴った。
日付操作は日付操作用の関数がちゃんとあるので、それを使いましょう。
(と言うか、私は静的型畑の人間なので、動的型変換の使い方にも膝が震えた。)
③ たこいかぱにっく
boolean checkNumber (str) {
boolean isNumber = !NumberUtils.isNumber(str);
if(isNumber) {
//エラーメッセージ処理処理
}
return !isNumber;
}
ツッコミどころ
- 変数名が明らかに嘘をついている
- 結局この関数は、また反転して戻している
- じゃぁそもそも反転していた理由は何???
論理値(真偽値)がめちゃくちゃである。
<記載内容を削除しました>
論理値は非常に混乱しやすいので、扱いには本当に注意が必要。
私は、ポジティブな方を真、ネガティブな方を偽になる様に心がけている。
④ (追記) includeのチカラ!
@fujitanozomu さんのサンプルコード を見ていてなんとなく思い出したので追記します
int tbl[] = {
#include <list.csv>
};
こ、、、こんな使い方。。。
コンパイルのプロセスを理解しているからこその荒業!?
って思いました。
プログラミング言語において、マクロ文化は基本悪法になりましたねー・・・。
(一部の機能は後発の言語でも残っていますが)
以上
クソコードを書かない様に日々精進したいものです。
追記① 2020/06/21(日)
思ったより閲覧数が多くてビビっています。
ちょっと角が立つ部分はプライベートで問題になりそうなので、
一部記載を消しました。
追記② 2020/06/21(日)
④を追記しました。
つい思い出してしまったもので(苦笑)
追記③ 2020/06/22(日)
@sakuro さんより情報を頂きました。
元々includeされることを想定されているファイル フォーマットがある様です。
・XPM - Wikipedia
https://ja.wikipedia.org/wiki/XPM
XPMはそれ自体がC言語のソースコードの体を成している様です。