クソコードとは何か

■ このスレッドは過去ログ倉庫に格納されています
2021/01/30(土) 17:33:05.78ID:BjNTZWUI
このスレはクソコードとは何かを考えるスレです。

・親クラスが子クラスに依存する処理を持つコード
例...社員クラスを継承した正社員クラスと派遣社員クラスがあり、社員クラスが正社員クラスの知識を持つ状況

・staticにするべきではないモデルにまでstaticにする人
例...社員クラスのメソッドを全てstaticにしたり、社員クラスにシングルトンパターンに相応するものを適用する人

等、クソコードを見た時に「あっ、これクソコードだ」って認識する根拠を挙げていきましょう。
2021/01/31(日) 19:04:29.63ID:TZSorCef
>>53
よくわかりましたね。正解。
2021/01/31(日) 19:05:57.07ID:JUmaLjMc
>>56
俺の答えが正解っていいたいのか?w

俺が答えを言ってから、後出しで同じだって言うなよwww
2021/01/31(日) 19:09:21.55ID:JUmaLjMc
function getPrice(id) {
const price = clothPrice.filter({ id }).first()
return price
}

これが一行(二行)だから関数にすべきでないとか
中身を直接書けば何やってるかわかるから関数にすべきでないというならば、

tan(数学のタンジェント)関数はなぜ用意されているのでしょうか?

double tan(double x) {
return sin(x) / cos(x);
}

たった一行です。中身を直接書けば何をやってるかわかります。
同じ理屈であれば、不要なはずです。
そういう結論になるはずです。


tanを関数にする理由は明らかですね。最初に言った理由と同じです
「clothPrice.filter({ id }).first()は何やってるの?」という質問が出るのであれば
それを関数にすることで可読性が上がるのです。中で何をやってるかは
意識させないようにするのが正しい設計です。
2021/01/31(日) 19:22:21.34ID:TZSorCef
>>58
だって貴方、>>12でどこもクソコードじゃないって答えたじゃん
2021/01/31(日) 19:24:32.72ID:JUmaLjMc
コードはクソじゃないですが?
出題に書いてないって言うのは、出題がクソという意味ですが?

いい加減諦めたら?w
2021/01/31(日) 19:24:56.89ID:Ti7TRi+9
風呂入ってたら議論が白熱してた
俺どうすればいい?
2021/01/31(日) 19:25:29.66ID:JUmaLjMc
オナニーしてねろ
2021/01/31(日) 19:26:58.02ID:Ti7TRi+9
はい
2021/01/31(日) 19:28:30.31ID:TZSorCef
おかえり
もう、疲れたよパトラッシュ...

ところで、パトラッシュ、答えが知りたいな
2021/01/31(日) 19:30:52.25ID:Ti7TRi+9
てゆーか、答え言っていいの?
一応想定してた回答はあるけど
2021/01/31(日) 19:32:35.81ID:TZSorCef
いいよ!気になる。
2021/01/31(日) 19:34:13.36ID:JUmaLjMc
すでに指摘した点を蒸し返すなよ?
2021/01/31(日) 19:35:02.92ID:JUmaLjMc
せめてデメテルの法則ぐらいはわかった上で発言してくれな
2021/01/31(日) 19:35:18.81ID:Ti7TRi+9
一応俺の想定では>>22が正解
ただ俺はデメテルの法則違反とか知らんから色々勉強になった
一概にこれが正解とは言えないんだなーと
2021/01/31(日) 19:36:30.29ID:Ti7TRi+9
>>70
補足すると関数名ね
getPrice -> getClothPrice
にした方がいいんじゃないかなってこと
2021/01/31(日) 19:37:21.40ID:JUmaLjMc
>>71
それはgetPriceが属するオブジェクトによる
一概にそう言えないし、それは出題に書いてない
2021/01/31(日) 19:37:54.79ID:TZSorCef
>>71
ありがとう。
まぁ、俺も一部、知らんことあったから勉強にはなったよ。
2021/01/31(日) 19:38:59.71ID:Ti7TRi+9
>>72
まぁ思い付きの出題だから、その辺はすまんかった
2021/01/31(日) 19:39:20.06ID:JUmaLjMc
俺は何の勉強にもなってねーなw
2021/01/31(日) 20:18:52.57ID:OeszCOeJ
class Box {
private int h;
private int w;
public int getHeight(){
return this.h;
}
public int getWidth(){
return this.w;
}

public int setHeight(int value) {
this.h = value;
}
public int setWidth(int value){
this.w = value;
}

}

俺も出題しよっと
俺は上記、箱クラスを作った
カプセル化もしてるし、インスタンス化もできるし、まさにオブジェクト指向(キリッ)

さて、何が駄目でしょうか

前提...命名規則やインデント等の書き方の問題ではない
考えるべきこと...クラス設計的な問題点を見つけよ
2021/01/31(日) 20:21:04.97ID:OeszCOeJ
初期値書き忘れた
Javaの言語仕様で0が入るって事で
2021/01/31(日) 20:33:10.20ID:JUmaLjMc
>>76
クラスレベルでhやwといった一文字は使うべきではない
座標としての意味のxやyなら問題ないが
2021/01/31(日) 20:34:17.92ID:JUmaLjMc
一文字変数が許されるのは、広くても関数レベル
可能ならそれよりも小さいブロックレベルまで
2021/01/31(日) 20:36:14.99ID:JUmaLjMc
理由は「パッっと見」でクラス全体を見ることは普通は無理だから。
一文字変数は変数名から意図がわからないのでパッっと見でコードも同時に見れることが前提
2021/01/31(日) 20:36:31.43ID:eKqnOz0E
うーん、この
2021/01/31(日) 20:38:19.85ID:OeszCOeJ
問題文に「命名規則は関係ない」って書いてあるのになぁ
2021/01/31(日) 20:39:22.25ID:JUmaLjMc
一文字変数は命名規則ではない
2021/01/31(日) 20:41:27.15ID:OeszCOeJ
脳がバグってるのか?
どうみても...ビジ...面白いから黙っておこう
85デフォルトの名無しさん
垢版 |
2021/01/31(日) 22:12:44.94ID:HlWuf0AU
>>76
hとwを高々保持するのが目的のようなやつをクラスにする必要あるやろかとは思う
あとプライベートにしてアクセッサを用意するのはいかにもなんだけど
これは言うほど嬉しくも無いと結論づけてもういいんじゃないかな
こーいうデータ保持クラスおまえらも山ほど書いてきたと思うけど
嬉しかったことあるかこれ?
結局これを受け入れる側のクラスライブラリとべったりの未来しか見えないし
2021/01/31(日) 22:30:49.34ID:g6MPPGEA
>>85
素晴らしい!正解!!
理由説明も、その通り!

まぁ、解決するとしたら、そもそもこんなクラスを作るなorドメインロジックをしっかり記述しましょうってところか。

オブジェクト指向(キリッ)とか言いつつ、完全にオブジェクト指向の本質を無視したプログラムでした。
2021/01/31(日) 23:07:03.11ID:kFPKIccw
でも教科書にはこういう例しか載っていないんだよな・・・
2021/01/31(日) 23:28:33.14ID:xTcVCzeY
たしかに

Box box = new Box();

box.setHeight(10);
box.getHeight();
box.setWidth(7);

こんなことやってても虚しいなw
せめて

Box box1 = new Box(10, 7);
Box box2 = new Box(10, 5);

if( box1.area() < box2.area() ){}

くらいのことはできてほしいな
あと、コンストラクタで変な値(マイナスとか)を入れたら例外を出すとか

教科書はまだ未開拓なところがあるからしゃーない
最近の学生がどんな教科書を読んでるかは知らないけど
89デフォルトの名無しさん
垢版 |
2021/01/31(日) 23:28:37.40ID:HlWuf0AU
実装ありきでそれに対するアクセッサという順にしか考えないし
実装ではなくてインタフェースに対してプログラミングするとかも分かってない
インタフェースを設計する上で見るべきところに思考がフォーカスされてない
C#はプロパティがあって簡潔で嬉しい!これでアクセッサ書き放題ぐへへってなもん
9089
垢版 |
2021/01/31(日) 23:29:48.84ID:HlWuf0AU
あ、流れ読んでなかった
>>89はどれに対するレスじゃなくて雑感ね
2021/01/31(日) 23:32:30.66ID:JUmaLjMc
ふう。やれやれ

アクセッサにするのは将来の拡張性のためだろ
Javaであればプロパティが存在しないから
そうしないとインターフェース互換性を保ったまま
継承することができない。

言われてコードを書いてるだけで、その理由を知らないんだな
2021/01/31(日) 23:37:56.79ID:JUmaLjMc
自分か継承をしたことがないからって
クソコードというのはコードの話をしてない
自分の経験の話になっている
2021/01/31(日) 23:39:23.18ID:xTcVCzeY
大丈夫?ID真っ赤だぞ
2021/01/31(日) 23:45:54.87ID:JUmaLjMc
IDが赤くなるのはレスが多いからなだけだぞ?
それ以外に意味はない
2021/02/02(火) 07:34:00.26ID:Tpt4JRkR
クラス利用者の事を考えずに実装したクラスは全部クソコード説
2021/02/02(火) 14:23:08.30ID:bhwRAjFJ
お前の書いたのは全てクソコード説
2021/02/02(火) 14:38:58.03ID:o3/qhRLn
てめえのもな
2021/02/02(火) 15:05:56.95ID:dfd6YEEl
>>96
このスレで語られている内容を理解できない96はクソコードしか書けないニート説
2021/02/02(火) 15:18:13.00ID:mk8gJgM8
>>11
コードの良し悪しは用途と仕様が不明確ならまともな判断はできないから
どちらもわからない状態じゃコーディングプラクティスの指摘だけになる

- clothPriceはどっからやってくるの? それでいいの?
- idを指定して複数の値が返されるようなデータ構造を使うべきなの?
- filter(id).first()よりfind(id)のほうがいいのでは?
- clothPriceが1000万件になっても問題ない?
- 俺の知ってるJavaScriptでは({ id })とは書けないけど?
- .first()はどこにどういう仕様で定義されてるの?
- idに対応する値がclothPriceに存在しなかった場合にどうなるの?
- テストコードも一緒に出してね
2021/02/02(火) 16:23:17.93ID:F8EiZmWN
>>99
書いてないことをいちいち質問したらきりがない
タブの数は2でいいの?とかまででてくるだろ

それらの質問は「問題ない」として扱えば
クソコードではないという答えが正しい
2021/02/02(火) 18:40:58.39ID:dfd6YEEl
お前ら(>>26 >>99)、国語の問題で「告白された○○君はなぜ顔を赤らめたのですか」と問われたら、「そんなのどこにも書いて無い!!もしかしたら唐辛子ガムを噛んでいたら予想以上に辛くて顔を真っ赤にしただけかもしれないだろ!!!」とか真顔で言い出しそうだな。

なんなんだこのスレは
2021/02/02(火) 18:53:57.65ID:7of77oce
>>101
国語の問題と科学の問題は分けて考えないといけない
実際、顔を赤らめた理由は風邪だったかもしれないわけだ
2021/02/02(火) 19:17:56.91ID:dfd6YEEl
ここまで詭弁が病気を疑うレベル
論理学が発展しそうだ
2021/02/02(火) 19:18:09.01ID:dfd6YEEl
ここまで詭弁が酷いと病気を疑うレベル
論理学が発展しそうだ
2021/02/02(火) 19:20:12.00ID:j1AIfgcw
>>103
そんな滅茶苦茶な日本語を書くほど興奮してるのか?何が導火線に火を着けたんだw
2021/02/02(火) 19:27:02.71ID:ReeT4XGv
>>102
アスペ死ね
2021/02/02(火) 19:33:33.22ID:NnSaCayY
さあ盛り上がって参りました
108デフォルトの名無しさん
垢版 |
2021/02/02(火) 20:57:02.78ID:LnwudBv/
脳にコロナが沢山います
2021/02/02(火) 21:30:20.78ID:IyiGSAGP
>>11はせっかくお題を出してくれたんだから建設的に行こうや
あら探ししてても成長が無いぞ

> getPrice(id)

IDから価格を引くようなことするんなら
DBMS側で全部管理しておいて
コード上にはDM操作API(※)の操作のみがあるほうがスッキリすると思う
※例えばJavaで言ったらJDBC呼び出し

> clothPrice

あとこれ
fooPrice, barPriceってどんどん増えてきそうだけど大丈夫か?って思う
データの中身を区別したあとのものを変数に入れるのが不気味
クエリのパラメータ側にあったほうが自然に思える

なるべく細かくないものから指摘した
2021/02/02(火) 21:31:10.75ID:IyiGSAGP
訂正
×DM操作API
○DB操作API
2021/02/02(火) 22:08:39.45ID:mk8gJgM8
>>109
毎回DB読まなくてもいいようにマスタデータをメモリ上にロードしてるのかもしれない

const makeCloth = function(repository) {
const clothPrice = repository.load(…)
return {
getPrice(id) {
const price = clothPrice.find(id)
return price
}
}
}

const Cloth = makeCloth(repository)
Cloth.getPrice(id)
112デフォルトの名無しさん
垢版 |
2021/02/03(水) 00:29:01.19ID:2d6hEoKZ
明示的にポインタ型で変数宣言したらauto&にしろって指摘受けたけど型推論にメリットってあるのか
聞くのも面倒だから言う通りに修正したけど
2021/02/03(水) 07:53:29.40ID:WEM0wpGD
自分の場合、型推論は
var x = 何か
var y = x
var z = y
var a = z
...
「何か」の部分に扱う型の決定を委ねたい場合に使う
でも、「何か」に任せたら不具合になりかねない場合は使わない
114デフォルトの名無しさん
垢版 |
2021/02/03(水) 17:47:38.43ID:cEj1fKgU
>>111
流石にそれは問題文の課題解釈
115デフォルトの名無しさん
垢版 |
2021/02/04(木) 13:52:50.53ID:xGlwnT6u
クソコードは存在しない。
クソプログラマがいるだけだ。
116デフォルトの名無しさん
垢版 |
2021/02/04(木) 15:37:08.26ID:DKUfS2zw
前件否定
詭弁スレかなここは
2021/02/04(木) 15:40:28.24ID:9Y9XT+dm
クソプログラマが書いたコードがクソコード
118デフォルトの名無しさん
垢版 |
2021/02/04(木) 16:11:03.81ID:xGlwnT6u
普通のコードを解釈と言う名の詭弁で棄損している
ケチを付けるためだけに延々と持論を展開したりな
すると普通のコードがゴミというレッテルを貼られる

そりゃあそうだ、そいつはアラを見つけて如何にしてレッテルを貼り付けるかだけに終始してるからだ
だからそいつには「ゴミ化」の手法がある
2021/02/04(木) 17:51:50.18ID:JCtgNhXu
すごいドヤ顔してそう
2021/02/04(木) 18:10:05.67ID:cLYP9bxd
>>118が何を言ってるのか理解できない
121デフォルトの名無しさん
垢版 |
2021/02/04(木) 18:17:16.95ID:DKUfS2zw
詭弁の特徴のガイドライン(ム板拡張版)
・理解できる事を理解できないフリをして論点をずらす
例)sin関数を使って計算してください→sinって何?w罪?w

・議題を否定して論点をずらす
例)アンパンマンは何故、バイキンマンに勝つのか→アンパンマンなんて存在しねーよバーカバーカ

・直感と感覚を否定し、理由が言えなければ事実ではないと決めつける
例)地震が怖かった→なんで地震が怖かったの?理由が言えないのなら怖いなんて嘘だ

このスレみてたら、こんなのが思い浮かんだ
議論をもとに戻す前に、二度とこんな書き込みすんなと警告しとく
2021/02/04(木) 18:29:41.03ID:MbXlwikG
詭弁て>>115>>118みたいなやつだろ
2021/02/04(木) 18:30:42.54ID:7BpvnZAj
>>121
> 詭弁の特徴のガイドライン(ム板拡張版)

自分で勝手にオレオレルール作るなよw
124デフォルトの名無しさん
垢版 |
2021/02/04(木) 18:32:23.89ID:DKUfS2zw
>>120
俺も理解できん
2021/02/04(木) 18:34:52.95ID:r1rgzoeR
クソスレ上げんなカス
2021/02/04(木) 18:46:14.74ID:qhstqCrC
>>121
sin関数のくだり(>>43)は質問の仕方が悪かっただけでしょ
2021/02/04(木) 18:52:47.96ID:9Y9XT+dm
ム板拡張版www
2021/02/04(木) 19:04:30.45ID:7BpvnZAj
sin関数のくだりは、明らかにMathオブジェクトだとわかるものを持ってきて
それと同一視させようとしてるから、>>43がアホなだけ
2021/02/04(木) 19:56:09.47ID:plfmR7iV
ム板拡張版ってw
まぁ、時々、該当しそうな人を見かけるけどさw

それはさておき、酷いと感じるコードって

・仕様変更の度に膨大なプログラム変更の工数がかかるコード(人件費が無駄にかかる)
・全く品質の保証されないコード(保証するためのテストにかかる人件費が非現実的な価格になる)

これを満たしているコード全てじゃない?
これを満たすコードを分析していけば、答えが見つかりそう
2021/02/05(金) 18:13:08.64ID:7P5D6x+s
class Rest{
ログインメソッド
ユーザー情報取得メソッド
位置情報送信メソッド
位置情報送信成功通知メソッド
位置情報送信失敗通知メソッド
位置情報以外の情報送信成功通知メソッド
位置情報以外の情報送信失敗通知メソッド
HTTPエラー通知メソッド
private変数のgetterメソッド※全て定義
}

転職前の会社で見つけたAndroidクソコード
こんなコードを渡された時は転職を決意した
2021/02/05(金) 20:09:09.32ID:LvAfdZdW
位置情報送信メソッド

位置情報送信成功通知メソッド

どういう関係なの? 後者は前者に渡されるコールバック関数?
132デフォルトの名無しさん
垢版 |
2021/02/05(金) 20:30:02.05ID:sQbQrry7
位置情報とか必要な時だけは渡すが、終わったら絶対にアプリを落とすようにしてる
2021/02/05(金) 20:59:57.01ID:ywW/HyXt
>>130
1つのクラスでバックエンドAPIのスタブをまとめてるだけなら別にクソコードじゃない
134130
垢版 |
2021/02/06(土) 00:28:38.26ID:rZdEmaWa
>>131
後者は前者を呼んだ後、HTTPレスポンスが返ると引数に渡された関数型が呼ばれる

前者の結果を非同期で受け取るイメージ
2021/02/06(土) 13:51:42.40ID:F35+hfeS
クソコードというよりウンコードだろ
2021/02/06(土) 13:59:02.77ID:OoUbdqRB
unicode(ウンコード)
2021/02/09(火) 17:43:42.15ID:oXbJA4gd
httpレスポンス(Json)に1個、新しい項目を追加したらプログラムの書き直しが20箇所近くで発生してワロタ
無駄なラッパーによる地獄の変更作業
2021/02/10(水) 03:51:43.35ID:YKvIUGd6
ほほwww
2021/02/10(水) 23:05:34.63ID:PXY5WDG2
1万行のメソッド
巻物のような一本モノシーケンスで途中の幾多のエラーチェックの度にいろんなフラグを立てまくり、最終的に最後の行まで到達してから関数冒頭で行なったエラーチェック結果を参照、結局エラーでしたで終了
しかもユーティリティクラスのメソッド
2021/02/11(木) 12:29:17.94ID:QNzWdO78
頭の悪い人がMVVM
2021/02/11(木) 16:13:15.21ID:20fgad/C
皆、通る道は同じなんだな
142デフォルトの名無しさん
垢版 |
2021/02/12(金) 00:11:29.55ID:jyO5hUn0
テストコードって必要?
2021/02/12(金) 00:17:10.35ID:tz+82o+A
テストコードがないプロジェクトなんて見たことないレベル
まともにメンテナンスが続いてるソフトで探してみ
2021/02/12(金) 01:50:17.30ID:yHZydEd8
会社コードならテスト無いの山ほどある
145デフォルトの名無しさん
垢版 |
2021/02/12(金) 07:51:11.85ID:kUMRCn77
自社開発のパッケージ製品作ってんだけどテストコードって書いたことないんだよね
自分自身の学習コストはともかくメンバーの学習コストが怖くてね
2021/02/12(金) 08:29:33.79ID:tz+82o+A
メンバーのせいにするな。お前より優秀だろ。
2021/02/12(金) 12:30:09.75ID:qfo2XcRz
>>142
ちょっと前までテストコードの無い会社で働いてたけど、地獄だったよ

詳細設計の妥当性確認ができない点がヤバイ
上司やリーダーに単体テストをしていないことの危険性を説明したが...テストコード書いてもどうせ無駄になる的な事を言ってた

そもそも、そのテストコードが些細な変更で無駄になるような設計をしている事がマズイのだが...そこには触れてほしくないみたいな感じだったよ

地獄の住人は地獄しか知らない
逆に、テストコードを書く会社の人達も地獄を知らない
148デフォルトの名無しさん
垢版 |
2021/02/12(金) 22:53:23.25ID:jyO5hUn0
でもなー単体テストの品質はどこで保証されるん?
テストコードもコードレビューするんけ?
2021/02/12(金) 23:11:03.49ID:0z7QwFq3
>>148
当たり前だろ。
2021/02/12(金) 23:12:24.97ID:P801lvm7
業務によらね?
頻繁に仕様が変わっちまうのに変えるのが悪いって言われてもね
それで金もらってんだし悪いもクソもないんだよ3日後には変更履歴がすだれみたいに色付いてるのに
のんびりテストコードなんて書いてたって無意味は無意味だろ
2021/02/12(金) 23:13:45.01ID:0z7QwFq3
だいたいテストコードに限らずレビューするだろ


手動のテストでもレビューしなければ

お前何のテストした?
これらのテストをしました。スクショがテストした証拠です
いや、テストしたかどうかじゃなくて、そのテスト内容は問題ないのか?
しりません。テストしました。信じてください

ってなるやろが?
2021/02/12(金) 23:14:36.71ID:0z7QwFq3
>>150
仕様が頻繁に変わるからテストしてません
でリリースするつもり?
アホなの?
2021/02/12(金) 23:15:27.50ID:jxDcSv/l
ひょっとしてテスト項目レビューとかしたことないのか?
2021/02/12(金) 23:15:50.20ID:P801lvm7
テストコード書いたからOKとはならんよな
重要なのは仕様から見たテストコードが適切かどうかであって書きゃいいってもんじゃない
2021/02/12(金) 23:17:20.91ID:P801lvm7
>>152
いや別にテストコードなんか時間かかるやん
デバッガの計算後の値をエクセルにコピペするだけでええやん
2021/02/12(金) 23:19:19.72ID:v8f20fWB
>>152
まあ、あるんじゃね?
うちも大学の研究室に納めるやつとかはバグあったらごめんね、連絡くれたら直すから
なんて契約のものもあるし
まあ向こうに直せるぐらいの能力持ってる人いるけど
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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