1: ノチラ ★ 2018/04/27(金) 21:01:14.39 _USER
788index
命名規則に関連するクソコード
クラス名、メソッド名、変数名などのネーミングを誤るとクソコード認定されてしまいます。会社やプロジェクトごとに多少のルールの違いはあるにせよ、どこに行っても漏れなくクソコード認定されてしまうネーミングパターンのご紹介です。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1つのメソッドの長さが数千行にも及ぶような男前なソースコードにバグが混入してしまい、解析及び改修をしなければならなくなった時には絶望するしかありませんね。
以下ソース
https://axia.co.jp/2018-04-27
引用元: http://egg.5ch.net/test/read.cgi/bizplus/1524830474/


2: 名刺は切らしておりまして 2018/04/27(金) 21:12:21.90
プロパティを自分で作れるのを知ったのが
IT土方5年目

3: 名刺は切らしておりまして 2018/04/27(金) 21:13:21.93
今まで見た一番難解だったプログラムは、
GOTO文でデータ部にジャンプして、そのデータ部が実はマシン語だったケース。

8: 名刺は切らしておりまして 2018/04/27(金) 21:30:27.54
>>3
おう、すごいな。
プロテクト外し対策だな。

36: 名刺は切らしておりまして 2018/04/27(金) 22:09:39.97
>>3
Go toは、プログラミング習いたてのときは便利だと思った。

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

そこから全力でオブジェクトのVBに変えた懐かしい思い出。
N88 BASICなんて、誰が分かってくれるのか…

63: 名刺は切らしておりまして 2018/04/27(金) 22:45:02.85
>>3
昔のmaxfanの投稿プログラム並みだな
8bitなら慣れたら読めるぞ

117: 名刺は切らしておりまして 2018/04/28(土) 02:08:08.29
>>3
ウィルスのソースコードかよ

209: 名刺は切らしておりまして 2018/04/28(土) 13:02:59.85
>>117
> >ただし、そのグローバル変数は他関数から全く参照されない。
> デバッグ用じゃね?常に同じメモリ領域を監視すりゃいいわけだし。ロジアナでバス監視も出来る。
> >呼び出し元で戻り値を参照してるが、その値は常に0。
> 正常は0、エラーは負。正常終了しか実装してないから0返してるんだろ。
そんなまともなもんじゃなかったよー。
まぁ、必要性わからずにどっかからか持ってきたんだろうなーと思う。

4: 名刺は切らしておりまして 2018/04/27(金) 21:15:13.35
1行目がGOTO文なBASICプログラム

58: 名刺は切らしておりまして 2018/04/27(金) 22:34:11.08
>>4
0x0000 番地が JMP のマシン語なら普通にある

75: 名刺は切らしておりまして 2018/04/27(金) 23:14:47.49
>>4
Pascal風に先に関数(サブルーチン)書いて、最後にメインルーチンってのが流行ったことはある。

99: 名刺は切らしておりまして 2018/04/28(土) 00:33:39.85
>>4
インタプリタ型BASICで、GOSUBで飛ばすサブルーチンを先頭付近に持っていって、
高速化するテクニック。

100: 名刺は切らしておりまして 2018/04/28(土) 00:36:34.68
>>99
行番号が小さい方が速いとか馬鹿馬鹿しい時代あったなw

118: 名刺は切らしておりまして 2018/04/28(土) 02:11:31.84
>>100
変数名の文字数が少ない方が早いとかもあった気がする

7: 名刺は切らしておりまして 2018/04/27(金) 21:25:52.51
ITドカタの世界なんて知ってもなぁ

9: 名刺は切らしておりまして 2018/04/27(金) 21:30:45.55
>>1
マイクラのjavaソースなんて一発目から該当するけどなw

50: 名刺は切らしておりまして 2018/04/27(金) 22:18:09.83
>>9
難読処理をクソコードって言っちゃう奴

10: 名刺は切らしておりまして 2018/04/27(金) 21:31:23.91
YAMAUCHI

52: 名刺は切らしておりまして 2018/04/27(金) 22:18:46.95
>>10
あの時代にマルチCPUってのが何気に凄かったよな

146: 名刺は切らしておりまして 2018/04/28(土) 07:50:26.83
>>10
タモリのパソコン

156: 名刺は切らしておりまして 2018/04/28(土) 08:55:19.27
>>146
それはYAMAUCHIやなくてもいけるらしいぞ。

13: 名刺は切らしておりまして 2018/04/27(金) 21:45:41.22
昔は日常会話の様にマシン語で会話してるヤツが居たんだが、彼らはどこ行ってしまったんだ?

110: 名刺は切らしておりまして 2018/04/28(土) 01:42:18.71
>>13
おまえ一日中0x90やなーとか

16: 名刺は切らしておりまして 2018/04/27(金) 21:50:49.40
ユニットテストのメソッド名とかに日本語を使うと意外とイイ

19: 名刺は切らしておりまして 2018/04/27(金) 21:54:13.20
>私は新人の時に「yonemura.sh」という名前で自分用に作ったシェルが
>他社に買い取られることになってしまい

おいしいシチュエーションじゃん
仕事回ってくるかもよw

20: 名刺は切らしておりまして 2018/04/27(金) 21:54:26.53
スペルミスは問題ないよ
全てがミスで統一されていれば

213: 名刺は切らしておりまして 2018/04/28(土) 13:16:13.03
>>20
そういう余計なローカルルールを持つこと事態が糞だと気づけよ

22: 名刺は切らしておりまして 2018/04/27(金) 21:57:12.51
これより下にコードを書くな

139: 名刺は切らしておりまして 2018/04/28(土) 06:59:58.95
>>22
忘れられるんだよな。悲しいわ。

24: 名刺は切らしておりまして 2018/04/27(金) 21:57:45.66
creat関数

98: 名刺は切らしておりまして 2018/04/28(土) 00:28:36.97
>>24
ワロタ

205: 名刺は切らしておりまして 2018/04/28(土) 12:49:17.05
>>24
ケン・トンプソン「50年経っても言われるとは思わなかった」

26: 名刺は切らしておりまして 2018/04/27(金) 21:58:54.48
rm -rf .*で全部消えるってほんと?

27: 名刺は切らしておりまして 2018/04/27(金) 21:59:23.43
>>26
ああ、有名な都市伝説ね

41: 名刺は切らしておりまして 2018/04/27(金) 22:13:57.06
>>27
消されて、なんとも言えない叫び声を聴いたことがあるんだが。

30: 名刺は切らしておりまして 2018/04/27(金) 22:05:50.81
虫取り用

if 1=1 then go to 10

44: 名刺は切らしておりまして 2018/04/27(金) 22:14:50.81
>>30
あー、最初につまづくパターンやねー。

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

エクセルでVBA使えりゃ問題ないから、勉強しなくなっちゃって…。

31: 名刺は切らしておりまして 2018/04/27(金) 22:06:16.77
>>1
>「ゲッターでグローバル変数を変更している」
これの意味が解らないんですが、具体的にどういうこと?

48: 名刺は切らしておりまして 2018/04/27(金) 22:17:16.73
>>31
getterって値を参照するための関数(メソッド)と普通は思うじゃん?
値を変更するのはたgetterの挙動として好ましくない

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

要するに設計としてムチャクチャってこと

66: 名刺は切らしておりまして 2018/04/27(金) 22:53:10.83
>>48
レスありがとう
しかし具体的にどういう事態かやはりわからん

122: 名刺は切らしておりまして 2018/04/28(土) 02:41:39.99
>>66
副作用のあるgetter がグローバル変数を触るとこうなる

// a と b は別のインスタンスとする
// どちらも count プロパティをもっている
x = a.count
y = b.count



y = b.count
x = a.count

で、x,y の値が変わる可能性が生じることになる。挙動が全く予測できない。

123: 名刺は切らしておりまして 2018/04/28(土) 02:46:38.04
>>122
それは普通にわかる

118: 名刺は切らしておりまして 2018/04/28(土) 02:11:31.84
>>100
変数名の文字数が少ない方が早いとかもあった気がする

32: 名刺は切らしておりまして 2018/04/27(金) 22:06:18.98
// 残業手当
a01=b02/a01*b0+c02;

35: 名刺は切らしておりまして 2018/04/27(金) 22:08:57.66
例外処理が存在しないプログラム
変数の宣言や、型がなくても何となく動いてくれる大変便利なプログラム

37: 名刺は切らしておりまして 2018/04/27(金) 22:10:03.10
//ループここから
・・・
//ループここから
・・・
//ループここから
・・・
//ループここまで
・・・
//ループここまで
・・・
//ループここまで

なおインデントなし
頭おかしくなるでほんま

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

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

同僚にしたくないのはどっち??

39: 名刺は切らしておりまして 2018/04/27(金) 22:12:44.43
>>38
どっちも

49: 名刺は切らしておりまして 2018/04/27(金) 22:17:46.39
>>38
B君だな。
コードのレビュー担当させるわ。

A君はウィザード級の仕事ができるかが分岐点。

53: 名刺は切らしておりまして 2018/04/27(金) 22:19:08.24
>>49
コンパイラが何をしているのか理解して速度重視に最適化したコードを書いた結果、読みにくくなったなら価値があるな。

42: 名刺は切らしておりまして 2018/04/27(金) 22:14:01.00
秀丸エディタ
サクラエディタ
を使って書いたコード

45: 名刺は切らしておりまして 2018/04/27(金) 22:15:25.72
組み込み系だが
どうせみんな糞コード
綺麗なコードなんて見た事ねーよ

54: 名刺は切らしておりまして 2018/04/27(金) 22:20:33.62
YAGNI、DRY、早期リターンとかの簡単な用語すら聞いた事のない人が書いたコード・・・

59: 名刺は切らしておりまして 2018/04/27(金) 22:36:24.81
ネーミングに自分の好きなアイドル名が使われている

62: 名刺は切らしておりまして 2018/04/27(金) 22:42:20.12
英語に翻訳して、それを4、5個分繋げて長い変数にしている。

64: 名刺は切らしておりまして 2018/04/27(金) 22:45:18.01
if文を全て三項演算子で済ます。

68: 名刺は切らしておりまして 2018/04/27(金) 22:54:56.50
>>64
三項演算子便利?だろ:はぁなめてんのか?しめんぞ:勘弁してやる

94: 名刺は切らしておりまして 2018/04/28(土) 00:08:54.56
>>68
3項演算子は ALGOL の時代から、最近では Swift まで、言語仕様にずっと
採用されているコンパクトな記法ですなあ。
3項演算子には何故かアンチがいて、ネストした分かりにくい例を出して来て
「ほーら、分かりにくいだろー」とかいうんだけど、そんな書き方しなけりゃ
いいだけじゃん。
シンプルに使えば3項演算子最高だぜ。

70: 名刺は切らしておりまして 2018/04/27(金) 23:00:49.83
// 2018.4.27 変更ここから


// 2018.4.27 変更ここまで

71: 名刺は切らしておりまして 2018/04/27(金) 23:03:20.52
push cs
push ip
retf

こういうの、裸で書くな

73: 名刺は切らしておりまして 2018/04/27(金) 23:09:50.55
無名関数をネストしてるやつ氏ね

76: 名刺は切らしておりまして 2018/04/27(金) 23:16:43.20
始まりカッコから
閉じカッコの間が、
ストックフォーム
20ページという
Basicの大作。

誰かがソース直してて
カッコの位置を間違えて
崩壊した。

79: 名刺は切らしておりまして 2018/04/27(金) 23:22:17.52
構造体を知らない人あるいは構造体が無い処理系で
テーブルの要素に名前をつけるために
テーブル名+連番 あるいは テーブル名+バイトオフセット という変数名がつけられてしまうことがある

昔々名前付きCOMMONというのが有ると聞いたことがある

81: 名刺は切らしておりまして 2018/04/27(金) 23:23:39.40
副作用のある getter(カウントしたりキャッシュしたり初回に何かしたり)なんかは普通にあるし、最新の言語ではそれをサポートする構文があるくらいだよ。
使う側からは完全に隠蔽されるからグローバルうんぬんの話とは違うけれど。

126: 名刺は切らしておりまして 2018/04/28(土) 03:15:26.61
>>81
確かにそうだな
俺もキャッシュでよくやる
っていうかキャッシュ以外はまずやらんかな

でもGetterでグローバル変数ってのが余りにも突拍子ないからようわからんです
色々説明してる人もいるけど、そんな変態コード

82: 名刺は切らしておりまして 2018/04/27(金) 23:25:30.24
承認ルート関連の変数、root って文字で表現していて、呆れたことがある。
route だろうに。

127: 名刺は切らしておりまして 2018/04/28(土) 03:19:29.21
>>82
それもrouteの読み方はルートじゃなくてラウトってオチ

84: 名刺は切らしておりまして 2018/04/27(金) 23:27:42.30
どっかのN○○とかいう会社の規約や実際のコーディングが、アンチパターンだらけで、今時よくこんなものを売りつけているなと感心したことがある。コードだけじゃなくRDBの物理名も可読性最悪のロット番号名だらけだし。
システムを買う客の立場からみても全く付加価値にならない作業を大量にさせる減点主義ネチネチ系のマイクロマネジメントだったが、プロジェクトはしっかりと炎上してたし。
SIの頂点ってショボイんだろうなと偏見と先入観を持っていたが、その通りだった。
次の東芝はここだろう。

86: 名刺は切らしておりまして 2018/04/27(金) 23:34:26.78
10 beep
20 goto 10

87: 名刺は切らしておりまして 2018/04/27(金) 23:36:34.84
万里の長城のような超大作SQLを文字列連結で組み立て

152: 名刺は切らしておりまして 2018/04/28(土) 08:19:31.85
>>87

昔、VB6のシステムで、DAOだかRDOの制限のSQLのクエリの文字数の制限(32,767バイト)をオーバーさせた
奴を知っている。どうやったらそんな長いクエリができるのかと。

159: 名刺は切らしておりまして 2018/04/28(土) 09:22:34.04
>>152
帳票だとありうるかもしれん
銀行系だと死ぬほどテーブル連結する

222: 名刺は切らしておりまして 2018/04/28(土) 14:02:24.67
>>152
昔の俺だ
更新内容を項目(セル?)単位じゃなく、レコード(行)単位でやってた

カンマ一つ忘れただけで地獄見たから、速攻で直したけど

90: 名刺は切らしておりまして 2018/04/27(金) 23:46:56.20
提供されたコードが逆Cコンパイラーの結果

97: 名刺は切らしておりまして 2018/04/28(土) 00:23:43.80
低レベルの分かりにくいものを抽象化隠蔽化することで発展してきた今時の言語で、わざわざ状態をビットで管理しようとする先祖帰りオジサン

101: 名刺は切らしておりまして 2018/04/28(土) 00:40:27.18
状態と振る舞いが全カイチンになっていて、外のクラスから破壊的操作が呼び出し可能なクラスを知識不足で作成する人、分かっているのに事無かれ追随で作成する人。

102: 名刺は切らしておりまして 2018/04/28(土) 00:58:58.48
型推論は言語仕様そのものがクソ。

104: 名刺は切らしておりまして 2018/04/28(土) 01:03:41.11
C#で戻り値を使わず全部refで処理してる
理解に苦しむ

105: 名刺は切らしておりまして 2018/04/28(土) 01:10:44.20
>>104
cでポインター慣れしてる人の書きがちなコード
若しくはリソース少ない中での最適化コード(リソース少ないとこでC#はそもそも使わんか)

107: 名刺は切らしておりまして 2018/04/28(土) 01:29:08.84
DRY(Dont Repeat Yet)ってRailsの概念のひとつで、
個人的にはこんなの当たり前にやるもんだと思ってたけど
モノシリックなプログラムが好きな人間がいるな。

あれなんなの?

あと、MVCフレームワークで、コントローラが異様に長いプログラムって
結構巷にあふれている気がする

119: 名刺は切らしておりまして 2018/04/28(土) 02:13:11.58
>>107
流石に最近はそういうのは見ない気が理由は主に2つですね。
1つは多くのMVCフレームワークではMの部分に自由度を持たせてありまして、
作るものや利用するライブラリに合わせて自分たちで設計してねとなっているからでしょうね(;^_^A・・・
そういう状況でMの責務が分かってない人たちが作るとロジックをあれこれCに実装しちゃうわけです。
Mを実装しなくてもプログラム自体は動きますからね。Cからデータアクセスとか余裕な感じで(;^_^A・・・
後からその機能をAPI化しようとしても難しくなったり。

2つめは1とも関連するのですが新規開発時にスモールスタートの低予算でとにかく動くものを作らねばならなかったとかです(;^_^A
予算的にCIなど考慮したことのないプログラマーしか呼べない状況で開発されたとかです。
チャチャっと最低限の設計だけでもすれば良いものを元受けがスキル不足でその作業が必要な意味を理解できなかったり。

125: 名刺は切らしておりまして 2018/04/28(土) 03:07:35.94
>>107
Don't Repeat Yourself
でしょ
たぶんしってるけどふと間違ったのだと思うけど

108: 名刺は切らしておりまして 2018/04/28(土) 01:38:55.11
C言語だが…

その1
20個グローバル変数に代入しまくりの4000行の関数。
ただし、そのグローバル変数は他関数から全く参照されない。
呼び出し元で戻り値を参照してるが、その値は常に0。
完全に冗長なゴミ。

その2
実装意図がわからない、謎の値補正関数。
その処理を通ると使用と微妙に異なる値を出力する。
50行程度だがロジックの意図がわからない。
コメントを信じるなら、実装者は他部署の管理職。
試しにコメントアウトしたところ過去製品で原因不明といわれていた4個の不具合が解消。
ゴミというか悪性腫瘍。

118: 名刺は切らしておりまして 2018/04/28(土) 02:11:31.84
>>108
>20個グローバル変数に代入しまくりの4000行の関数。
>ただし、そのグローバル変数は他関数から全く参照されない。
デバッグ用じゃね?常に同じメモリ領域を監視すりゃいいわけだし。ロジアナでバス監視も出来る。
>呼び出し元で戻り値を参照してるが、その値は常に0。
正常は0、エラーは負。正常終了しか実装してないから0返してるんだろ。

142: 名刺は切らしておりまして 2018/04/28(土) 07:18:34.00
>>108
その4つはなおったが他に不具合を発生させたかもね

209: 名刺は切らしておりまして 2018/04/28(土) 13:02:59.85
>>142
単体、結合、システム全てのテストを通ったからOKよ。
(それまでは粒度の粗いシステムテストしかされてなかった…)

112: 名刺は切らしておりまして 2018/04/28(土) 01:52:18.54
C言語の開発者が「create」ってスペルミスしたのがそのまま使われてる

スポンサード リンク