X



【IT】本当にあった怖いプログラム(クソコード事例集)
■ このスレッドは過去ログ倉庫に格納されています
0001ノチラ ★
垢版 |
2018/04/27(金) 21:01:14.39ID:CAP_USER
命名規則に関連するクソコード
クラス名、メソッド名、変数名などのネーミングを誤るとクソコード認定されてしまいます。会社やプロジェクトごとに多少のルールの違いはあるにせよ、どこに行っても漏れなくクソコード認定されてしまうネーミングパターンのご紹介です。

ネーミングが「記号+番号」
クラス名や変数名はわかりやすい名称にしましょう。ネーミングを見て内容を推測できるようになっていることが重要です。「記号+番号」ではそれを見るだけでは何のプログラムであるかを推測することは不可能です。

ネーミングに日本語、英語、ローマ字が混在
プロジェクトによってクラス名や変数名のネーミングルールは異なりますので、何がダメだというわけではありませんが、自由すぎるネーミングを行うのはやめましょう。きちんとプロジェクトでルールを統一することは重要です。

またにクラス名や変数名に日本語を使用することは言語仕様上可能とはなっておりますが、アルファベットを使うことが慣習となっていることと、日本語だとIDEの補完機能がうまく機能しないことがあって非効率化の原因となりますので、避けた方が無難です。

ネーミングにスペルミスがある
ネーミングでスペルミスがあると、後でソースコードから文字列で該当箇所を検索する時に検索にヒットせず、改修漏れの原因にもなります。正しいスペルと間違ったスペルが混在していたりするともう最悪です。スペルミスのないように気をつけましょう。

ネーミングに個人名が使われている
ネーミングはプログラムの中身がわかるような名前にするという観点からも、プログラムの中に自分の名前にすることは適切ではないのでやめましょう。

またソースコードレビューの時に思いがけず恥ずかしい思いをすることになるかもしれません。私は新人の時に「yonemura.sh」という名前で自分用に作ったシェルが他社に買い取られることになってしまい、他の会社のエンジニア20名くらいの前で「よねむらシェルとは・・・」と説明会で大きな声で読み上げるはめになって大変恥ずかしい思いをしたことがあります。

個人で使うプログラムでもプログラムの中身を表した無難なネーミングにしておくことを強くお勧めします。

ネーミングに番号やアルファベットの連番が使われている
クラスや変数のネーミングに、1からの連番やaからの連番を使うと、クラスや変数の中身を推測することが不可能になってしまうのでやめましょう。こういうことをすると後でそのプログラムをメンテナンスする人に、一々プログラムの処理を細かく解析することを強いることとなり、「このクソコード書いたやつまじで氏ね」と言われてしまいますのでやめましょう。

可読性に関連するクソコード
プログラムは後でメンテナンスするためにも、読みやすく書くことが非常に重要です。処理の内容だけ見ると読みやすくても読みにくくても実行される内容は同じかもしれませんが、読みやすいソースコードは改修の工数を下げますし、バグが混入するリスクも下げてくれます。

ネストが異様に深い
ソースコードの中にネストが何重にもなっている箇所があると可読性を下げてしまいます。ネストを何重まで許可するかはプロジェクトによって異なりますが、個人的には3重か4重くらいまでにおさまるようにコーディングするよう心がけていました。

これとセットで「1行の文字数は80文字まで」みたいなコーディング規約があるとさらにカオスな感じになってきます。ネストが10階層+1行80文字までとか、考えただけでも嫌になりますね。

インデントがずれている
今どきエディタが良い感じにインデントしてくれるのに、まさかインデントがずれているソースコードなんて存在しないと信じたいところですが、昔作られたソースコードだとそういう化石みたいなクソコードにお目にかかることはあるようですね。

カッコの閉じ位置のインデントがズレていたりすると、著しく可読性を下げますし、コードの解析を誤るリスクも増えてしまいます。こういうことをすると漏れなくクソコード認定されてしまうでしょう。

1つのメソッドが異様に長い
たまに1つのメソッドが異様に長いソースコードにお目にかかることがあります。私の個人的な感想だと某国にオフショア開発に出されてウミガメのように日本に帰ってきたソースコードにそういうメソッド分割の概念が消失してしまったかのようなソースコードが多いように思います。

1つのメソッドの長さが数千行にも及ぶような男前なソースコードにバグが混入してしまい、解析及び改修をしなければならなくなった時には絶望するしかありませんね。
以下ソース
https://axia.co.jp/2018-04-27
0003名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:13:21.93ID:qtGcbreb
今まで見た一番難解だったプログラムは、
GOTO文でデータ部にジャンプして、そのデータ部が実はマシン語だったケース。
0005名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:17:02.59ID:trQaZcj7
10 50ニイケ
0006名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:24:25.51ID:AIR+AZtA
メンテナンスなんてしなければいいじゃない320
0009名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:30:45.55ID:rfgO5YV4
>>1
マイクラのjavaソースなんて一発目から該当するけどなw
0011名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:31:56.80ID:uRrJsrIr
漢なら数万行のスパゲッティ!
0012名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:44:04.73ID:7z4yfUSZ
本文よりもコメントの方がやばいなw
0013名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:45:41.22ID:X0lCWYqx
昔は日常会話の様にマシン語で会話してるヤツが居たんだが、彼らはどこ行ってしまったんだ?
0014名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:45:56.93ID:CE1gZRxj
おかしいな〜、変だな〜、こわいな〜
0015名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:48:59.26ID:3Lb6XxPG
クソコードじゃない

ウンコードっていうんだよw
0016名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:50:49.40ID:3Lb6XxPG
ユニットテストのメソッド名とかに日本語を使うと意外とイイ
0018名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:52:21.74ID:UqO3ZrDx
氏通とかNTTとかひたちとかああいうところが一発目から該当するな
そういう話を聞いただけだがそうだろうな
0019名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:54:13.20ID:CX7M9vnn
>私は新人の時に「yonemura.sh」という名前で自分用に作ったシェルが
>他社に買い取られることになってしまい

おいしいシチュエーションじゃん
仕事回ってくるかもよw
0020名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:54:26.53ID:3Lb6XxPG
スペルミスは問題ないよ
全てがミスで統一されていれば
0021名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:55:28.37ID:bipmPmmw
if(a){while(a){}}
0025名刺は切らしておりまして
垢版 |
2018/04/27(金) 21:58:27.45ID:GCbjsfRh
1行目のコメントに「触るな!!!」と書かれている
0029名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:03:41.61ID:sfHmltPT
//よく分からないけどこれで動く
0030名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:05:50.81ID:9EBCJdt2
虫取り用

if 1=1 then go to 10
0031名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:06:16.77ID:bipmPmmw
>>1
>「ゲッターでグローバル変数を変更している」
これの意味が解らないんですが、具体的にどういうこと?
0033名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:07:00.24ID:V6Hm029K
初期化と言いつつメインの処理が半分ぐらい入ってたりとか
勝手に余計な事してたりするのが一番困る
0034名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:07:08.00ID:MGZShJ1Y
ヌルポ
0035名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:08:57.66ID:SPGoPAJs
例外処理が存在しないプログラム
変数の宣言や、型がなくても何となく動いてくれる大変便利なプログラム
0036名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:09:39.97ID:o0svj3fu
>>3
Go toは、プログラミング習いたてのときは便利だと思った。

実際に機械制御でGo to使った先輩のプログラムで、実験装置壊しかけて偉い目にあった。

そこから全力でオブジェクトのVBに変えた懐かしい思い出。
N88 BASICなんて、誰が分かってくれるのか…
0037名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:10:03.10ID:sfHmltPT
//ループここから
・・・
//ループここから
・・・
//ループここから
・・・
//ループここまで
・・・
//ループここまで
・・・
//ループここまで

なおインデントなし
頭おかしくなるでほんま
0038名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:11:46.44ID:lCBOv6HT
A君: とにかくコードが汚くて読みづらい。注意しても「動けば何でもいい」と言ってきれいに書こうという気持ちさえない。

B君: とにかくコードがきれいで読みやすい。同僚の書くコードに対して「そんな書き方じゃダメ」と言って細かく注意して指導してくる。

同僚にしたくないのはどっち??
0040
垢版 |
2018/04/27(金) 22:13:37.72ID:ctcQh0Tr
 日本語コボルを演習した重いで。
0042名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:14:01.00ID:3Lb6XxPG
秀丸エディタ
サクラエディタ
を使って書いたコード
0043名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:14:48.26ID:yJhj+/6i
記事の文章が読みにくい
0044名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:14:50.81ID:o0svj3fu
>>30
あー、最初につまづくパターンやねー。

でも、今の子って、最初からオブジェクト指向なの?
それすら死語なのかね?

エクセルでVBA使えりゃ問題ないから、勉強しなくなっちゃって…。
0046名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:16:40.07ID:ja8lHTmO
値切る相手には糞コード書いてメンテで稼ぐ作戦だろ
0048名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:17:16.73ID:SkldR2qv
>>31
getterって値を参照するための関数(メソッド)と普通は思うじゃん?
値を変更するのはたgetterの挙動として好ましくない

またgetterやsetterはそもそもその変数に直接アクセスされるのが好ましくないから使うテクニック
グローバル変数ならgetterやsetterを使わなくてもいじり放題じゃん?
カプセル化してこそgetterやsetterには意義がある

要するに設計としてムチャクチャってこと
0050名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:18:09.83ID:Os5ufWBT
>>9
難読処理をクソコードって言っちゃう奴
0051名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:18:25.57ID:3Lb6XxPG
>>31
「副作用のあるgetter」の事かと

グローバル変数がどうとか説明の方がセンスがない
0052名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:18:46.95ID:OM4J6rz6
>>10
あの時代にマルチCPUってのが何気に凄かったよな
0053名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:19:08.24ID:03j96pSE
>>49
コンパイラが何をしているのか理解して速度重視に最適化したコードを書いた結果、読みにくくなったなら価値があるな。
0054名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:20:33.62ID:3Lb6XxPG
YAGNI、DRY、早期リターンとかの簡単な用語すら聞いた事のない人が書いたコード・・・
0055名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:23:59.13ID:7tOb4o3s
アップデート時の一時ファイルは、デバイスごと消去しませう
0056名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:29:06.66ID:Os5ufWBT
>>31
コマンドとクエリの分離原則は守ってほしい
切実に
まじで
0057名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:33:12.52ID:ckuDMDPo
> 11
スパゲッティは、現代的なIDEで見ると意外と追いやすい
一番追いづらいのは、意識高い系が書いたコード
ここになぜそのパターンをここに当てはめた?
ただただデザインパターンを使いたいだけの奴が多すぎる
0058名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:34:11.08ID:NHwfVjvw
>>4
0x0000 番地が JMP のマシン語なら普通にある
0059名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:36:24.81ID:cVMy5Ye6
ネーミングに自分の好きなアイドル名が使われている
0062名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:42:20.12ID:cVMy5Ye6
英語に翻訳して、それを4、5個分繋げて長い変数にしている。
0063名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:45:02.85ID:w3SB7mzJ
>>3
昔のmaxfanの投稿プログラム並みだな
8bitなら慣れたら読めるぞ
0064名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:45:18.01ID:cVMy5Ye6
if文を全て三項演算子で済ます。
0065名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:51:46.82ID:JJAxp3hF
>>1
> 命名規則に関連するクソコード


> またにクラス名や変数名に日本語を使用することは言語仕様上可能とはなっておりますが、アルファベットを使うことが慣習となっていることと、日本語だとIDEの補完機能がうまく機能しないことがあって非効率化の原因となりますので、避けた方が無難です。

もう、この8bitや16bit時代からの悪習はやめろ!
んな事言ってるから、いつまでたってもユニコード対応しない糞処理系が生き残るんだぞ!!!!

> 可読性に関連するクソコード

可読性あげたいなら、ガンガン日本語つかえ!

> インデントがずれている
> 今どきエディタが良い感じにインデントしてくれるのに、

アホ見たいにtabとスペース混在のインデントかける糞統合環境があって
その中で見てる分には問題ないのに
他のエディタで見たときに崩れるんだ!
0066名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:53:10.83ID:bipmPmmw
>>48
>>51
>>56
レスありがとう
しかし具体的にどういう事態かやはりわからん
0067名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:54:42.32ID:HZFT8iVN
永遠のぬるぽ
0069名刺は切らしておりまして
垢版 |
2018/04/27(金) 22:56:11.04ID:eIeJV1qp
>>1
インデントなんて井出が「フォーマット」か何かで直してくれるじゃん
0071名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:03:20.52ID:eXpxrjDG
push cs
push ip
retf

こういうの、裸で書くな
0072名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:05:01.95ID:5GdE7idV
>>1
うんコードスレ定期的に立つね
悲しいことに今もまた世界のどこかで糞の金字塔が作られているんだろうね
0073名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:09:50.55ID:9kjdVHB3
無名関数をネストしてるやつ氏ね
0074名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:10:02.02ID:+JOcC+8i
ライブラリーの関数名がsnake_caseだとかっこわるい
0075名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:14:47.49ID:263TKDwb
>>4
Pascal風に先に関数(サブルーチン)書いて、最後にメインルーチンってのが流行ったことはある。
0076名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:16:43.20ID:B31+ua5W
始まりカッコから
閉じカッコの間が、
ストックフォーム
20ページという
Basicの大作。

誰かがソース直してて
カッコの位置を間違えて
崩壊した。
0077名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:21:26.77ID:P0i0pJKU
1行ごとにコメントを入れるプログラム。ある意味くそコード。
0078名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:22:04.23ID:B31+ua5W
クレーンのアーム制御に、
別のアームの干渉を避け
るようにサブルーチン
追加してもらったら、
ぶつからない代わりに、
工場の壁に穴が開いた。
0079名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:22:17.52ID:mnIBPvpe
構造体を知らない人あるいは構造体が無い処理系で
テーブルの要素に名前をつけるために
テーブル名+連番 あるいは テーブル名+バイトオフセット という変数名がつけられてしまうことがある

昔々名前付きCOMMONというのが有ると聞いたことがある
0080名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:23:11.93ID:B31+ua5W
クレーンのアーム制御に、
別のアームの干渉を避け
るようにサブルーチン
追加してもらったら、
ぶつからない代わりに、
工場の壁に穴が開いた。
0081名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:23:39.40ID:PfJiLEUj
副作用のある getter(カウントしたりキャッシュしたり初回に何かしたり)なんかは普通にあるし、最新の言語ではそれをサポートする構文があるくらいだよ。
使う側からは完全に隠蔽されるからグローバルうんぬんの話とは違うけれど。
0082名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:25:30.24ID:ASvsl7AC
承認ルート関連の変数、root って文字で表現していて、呆れたことがある。
route だろうに。
0083名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:27:33.40ID:cVMy5Ye6
画像処理機能をSimulinkで作って動かして、コーディング終わったってうそぶく。
0084名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:27:42.30ID:qV+WN/ky
どっかのN○○とかいう会社の規約や実際のコーディングが、アンチパターンだらけで、今時よくこんなものを売りつけているなと感心したことがある。コードだけじゃなくRDBの物理名も可読性最悪のロット番号名だらけだし。
システムを買う客の立場からみても全く付加価値にならない作業を大量にさせる減点主義ネチネチ系のマイクロマネジメントだったが、プロジェクトはしっかりと炎上してたし。
SIの頂点ってショボイんだろうなと偏見と先入観を持っていたが、その通りだった。
次の東芝はここだろう。
0086名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:34:26.78ID:6Ulfbok5
10 beep
20 goto 10
0088名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:38:30.76ID:nmxFBhwK
>>1
>ネーミングが「記号+番号」

これはわざと解析されにくいように、難読化してるんじゃね?
0089名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:45:38.30ID:4lsvK5ll
WordPressの主要なクラスの
WP_Queryってのが4000行あって噴いた
0090名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:46:56.20ID:+JOcC+8i
提供されたコードが逆Cコンパイラーの結果
0091名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:48:52.34ID:sIz/bibO
ラムダ覚えたての人が、酔って書くドデカイ、ネストしまくってる辺り一面のラムダ。
しかも遅延評価機能を持っていることの良さをことごとく潰していて処理が遅くなっているというオマケ付き。
0092名刺は切らしておりまして
垢版 |
2018/04/27(金) 23:52:04.98ID:yvIc6vNN
>>31
グローバル定義した『どこからでも参照&変更できる』変数を、何らかの理由で
ゲッター(値を参照する専用のメソッドみたいなもの)経由取得にしているのに、
何回かの改修を経た結果か、ゲッター中で参照だけじゃなくて変更してるってこと。

というか、変更されたくないグローバル変数は定義の時点でReadOnlyにするとか、
矛盾した物言いになるけど、グローバル変数は隠蔽して、ゲッターとかだけ公開するとか、
設計の時点で色々やりようがある気はする。

ちなみに過去みた中で一番恐いプログラムは六次元配列でメモリ確保していた謎コード。
しかも、書いた本人は理解しているらしくちゃんと動くところが恐い。
0093名刺は切らしておりまして
垢版 |
2018/04/28(土) 00:07:22.23ID:WkQmbHJ7
>>1
クソコードってこういうレベルじゃないから
0094名刺は切らしておりまして
垢版 |
2018/04/28(土) 00:08:54.56ID:IQ443Wmg
>>68
3項演算子は ALGOL の時代から、最近では Swift まで、言語仕様にずっと
採用されているコンパクトな記法ですなあ。
3項演算子には何故かアンチがいて、ネストした分かりにくい例を出して来て
「ほーら、分かりにくいだろー」とかいうんだけど、そんな書き方しなけりゃ
いいだけじゃん。
シンプルに使えば3項演算子最高だぜ。
0095名刺は切らしておりまして
垢版 |
2018/04/28(土) 00:14:35.92ID:K0egFwTd
昔の友人が関数名とかに
oneechannnooppai とかつけるやついたなぁ・・・・
0096名刺は切らしておりまして
垢版 |
2018/04/28(土) 00:16:27.93ID:ea/bqUmV
プロパティ読み込みでデバイス初期化するのはやめて

つか使う側では単なる変数アクセスにしか見えないのに秒単位で待つとかありえん
0097名刺は切らしておりまして
垢版 |
2018/04/28(土) 00:23:43.80ID:Hgf6ZlsB
低レベルの分かりにくいものを抽象化隠蔽化することで発展してきた今時の言語で、わざわざ状態をビットで管理しようとする先祖帰りオジサン
0098名刺は切らしておりまして
垢版 |
2018/04/28(土) 00:28:36.97ID:lgEpxK2j
>>24
ワロタ
0099名刺は切らしておりまして
垢版 |
2018/04/28(土) 00:33:39.85ID:7z+dj0w6
>>4
インタプリタ型BASICで、GOSUBで飛ばすサブルーチンを先頭付近に持っていって、
高速化するテクニック。
0100名刺は切らしておりまして
垢版 |
2018/04/28(土) 00:36:34.68ID:WXw+c5H7
>>92
抽象化が目的なんだから
意味合いがget なら、関数のなかでステータス設定等の更新しててもいい
set get =変数の更新参照でなくても良い
対象は共有メモリでもグローバル変数でもいい

>>99
行番号が小さい方が速いとか馬鹿馬鹿しい時代あったなw
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況