X



C#, C♯, C#相談室 Part95
■ このスレッドは過去ログ倉庫に格納されています
0601デフォルトの名無しさん
垢版 |
2018/03/31(土) 19:27:52.75ID:xFqugWHj
ユニットテストを意識するようになればメソッドやクラス構成マシになるのに、どうせ単体テストやるしと数百行のメソッド大量生産の俺社
0602デフォルトの名無しさん
垢版 |
2018/03/31(土) 19:38:17.35ID:wdgleLdA
メソッドは原理原則通り20行まで・・・ってのはやりすぎかもしれんけど
全ては関数にわけられるだけわける
1つの関数に2つ以上の機能があれば冗長だとは思う
0603デフォルトの名無しさん
垢版 |
2018/03/31(土) 20:01:38.03ID:FNt76Udy
関心事が1つであるべきだよ
機能数は複数あってもいい
例えば顧客オブジェクトを取得する/作成する/更新する/削除するための顧客リポジトリ
こいつの機能は4つだが関心事は顧客オブジェクトの永続化という1つだけ
0604デフォルトの名無しさん
垢版 |
2018/03/31(土) 20:41:54.64ID:fnj+62QA
>>602
でもやたら関数に分けまくるのもやり過ぎの悪例だからなぁ
一行メソッドのたらい回しとか可読性低すぎて引き継いだとき殺意が湧くし
0605デフォルトの名無しさん
垢版 |
2018/03/31(土) 21:12:12.52ID:FNt76Udy
1行でも意図が明確化するならメソッドにする
C++とかやってきた人なら当たり前の感覚なんだけどね
0606デフォルトの名無しさん
垢版 |
2018/03/31(土) 21:20:51.16ID:FNt76Udy
Expression Bodyのプロパティやメソッドがなぜ導入されたのか
1行のプロパティやメソッドはそれだけ使用頻度が高いってこと
0607デフォルトの名無しさん
垢版 |
2018/03/31(土) 21:50:23.14ID:lRCajebl
バカが書くオブジェクト指向()を舐めるなよ?

あいつら『かめはめ波()』の機能を
か()
め()
は()
め()
波()
にするレベルでバカだからな
0608デフォルトの名無しさん
垢版 |
2018/03/31(土) 21:55:29.44ID:+WsDcfNX
意味を理解しておらず側だけ真似するからそうなる
猿は木の実でも取ってろ
0609デフォルトの名無しさん
垢版 |
2018/03/31(土) 21:57:45.44ID:g9lQ5N9X
独立している機能なら一行でも良いが
一連の塊で動いてる機能を再利用性の欠片もないパーツに切り分ける奴は頭が悪い
しかもその切り分けた関数で他の関数を実行してたらそれはもうただの難読化だ
0610デフォルトの名無しさん
垢版 |
2018/03/31(土) 23:47:58.41ID:U08lgUq5
>>607-609
バカw
0612デフォルトの名無しさん
垢版 |
2018/04/01(日) 07:24:17.48ID:su2Mei6j
>>606
これが答えだよ
Microsoftや達人プログラマ達は1行メソッドの価値を理解して言語仕様まで変えてしまった
それほどまでに重要なものってことだ
一方で雑魚プログラマのお前らは価値を理解できずにぐちぐちと文句を言う
程度の低さを伺えるね
0614デフォルトの名無しさん
垢版 |
2018/04/01(日) 08:32:44.17ID:IPSX8M4/
プログラム構造が見渡せる行数になれば、ソレ以上の細分化は無意味なんだけどね
メソッドの分割は中身を理解しやすくするのが最大の目的で、それを阻害するほど分割したら意味がない
0615デフォルトの名無しさん
垢版 |
2018/04/01(日) 08:45:42.44ID:x6ZL87kc
俺もコメント代わりに分けまくる派
純粋関数で責任が明確なら可読性は上がるよ
0616デフォルトの名無しさん
垢版 |
2018/04/01(日) 08:59:28.91ID:s6sGDINL
一目見たら分かる処理をオレオレ命名で飛び地化
お一人様開発なら良いがチームでやんなよ
0621デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:25:16.65ID:P1fWuhY2
>>614
中身を理解しやすくするのは実装の仕事
メソッド化する最大の目的は実装と意図を分離すること
僕が引用したリンク先でマーティン・ファウラーがわかりやすく説明してくれてるからぜひ読んで欲しい
0622デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:28:59.77ID:s6sGDINL
三行で書かれてるコードならその場でその三行を修正するだけで済むが、
それを三つの関数に分けるとわざわざ別の行までスクロールして修正する作業が三回発生する

どちらが効率的で生産性が高いのか普通なら考えるまでもなく分かることだが、自意識過剰なバカには分からないのかも知れない
何せ自分のことを『達人』とか思い込んでるレベルのバカだし
0623デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:33:48.86ID:su2Mei6j
>>620
コードで表現していることを関数名で抽象化するんだよ
抽象化はプログラミングをする上で最上級に重要な概念だけどどうもIQが凡人以下だと理解できないらしい
物事を理解するにはその内容に応じた知能がどうしても必要になる
凡人が数学者や物理学者に成れない
難しい概念がわからないという感覚は人としてどうしようもないものなんだ
だからこのスレにも抽象化がわからない人が居てもおかしくはない
0624デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:36:24.52ID:fxgoPYx5
>>622
場合によるんじゃないかな?
その一行が何度も出てくるなら関数化したほうが修正が楽

何百回修正するか
一回修正するか
0625デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:38:21.16ID:su2Mei6j
>>622
そのコードがなんのためにあるのかということを考える作業が3回も発生する

そのコードを変えて他に影響がないか確かめる作業が3回も発生する

同じことを他の場所でしていないか確かめる作業が3回も発生する

酷い無駄だ
0626デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:39:10.89ID:fxgoPYx5
関数化で抽象化はされる

抽象化された関数で何をやってるか詳しく関数名に入れると無意味なことになることもある
むずかしいよね
0627デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:40:28.60ID:s6sGDINL
bool IsEmpty() => this.Length == 0;

このレベルの実装であれば何も文句はないが、大半はそうじゃないのが現実
0628デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:40:36.80ID:x6ZL87kc
適切な直行化ができてれば、一連の処理の流れに関わる多数の関数を一緒に修正するなんてことはそうあるものではない
その程度のスキルレベルなら分け過ぎはよくないのは同意する
0629デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:42:35.89ID:fxgoPYx5
もともと一行関数だったものが徐々に成長していくこともある
でも呼び出し元のコードは変わらない
ロジックが変わってないからね
これは大変素晴らしいことだと思う
0630デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:46:33.53ID:x6ZL87kc
十分に責任の明確化ができている関数は中身を見る必要が無くなる
不要になって消すことはあっても中身を弄ることはめったにない
この名前でこの引数を受け取るならこの結果が返るのが当然、と思えるのが正しい関数だ
0632デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:52:46.42ID:qsRAuR+m
>>631
そのレベルの現場ならCOBOLみたいにMOVE羅列してる方マシだね
世の中そういうところばかりではないから文句があるならさっさと転職しろ
0633デフォルトの名無しさん
垢版 |
2018/04/01(日) 09:54:39.84ID:fxgoPYx5
コードを書いてる時点で将来をすべて予見できるような素晴らしい環境にいるならいいけど
大体はそんなことはない

仕様を考えたのが他人であろうと自分であろうと
0634デフォルトの名無しさん
垢版 |
2018/04/01(日) 10:25:24.90ID:EnMpGyAP
>>631
範囲を扱うアルゴリズムに使わせる目的で使うイディオムだよ
こうしておけばプリミティブの数値も数値っぽい型(例えば巨大整数クラス)も同じように扱える
ようするにただのストラテジだな
0635デフォルトの名無しさん
垢版 |
2018/04/01(日) 10:45:43.34ID:EnMpGyAP
まあ正直C#で>>631は無意味とは言わないまでも違和感あるけどな
>>631もC#だけでなくc++とか経験してみるとこういう短い関数の真価を理解できるんじゃないかな
0636デフォルトの名無しさん
垢版 |
2018/04/01(日) 11:56:21.61ID:T3P5Wj+0
巨大整数とか仕様にカスリもしない未来を妄想して複雑化して「これがシンプルなんだよ!」と強弁するとかアホの典型だな
グループ開発の経験もない無職かよ
0638デフォルトの名無しさん
垢版 |
2018/04/01(日) 12:12:43.78ID:qPjZABJK
最初から無駄に俺様カスタマイズしたがるのはこじらせたC++erによくあるYAGNIだね
そして、Incrementの例のように基礎的な部分には異常に拘るくせに普通のアプリケーションコード部分は巨大なメソッドを生産する奴が多い
その割にはポインタ演算は大好きで、配列操作になるとウッキウキしてクソ低レベルなアスタリスクと++だらけのコードを垂れ流す
そういう連中だよ
0640デフォルトの名無しさん
垢版 |
2018/04/01(日) 12:42:38.07ID:5IsFylKp
ふらっとも伸びているようだし承認欲求に飢えているアホどもが暴れているのか
0643デフォルトの名無しさん
垢版 |
2018/04/01(日) 13:07:10.47ID:wUP/Qru9
どんな面白い問題で盛り上がってるのかと思ったらしょうもな。

(1) 道具が多すぎる道具箱は使いづらい

からと言って

(2) 短すぎるメソッドは「無駄な道具」である

などと言えるわけがない。
そうである場合もない場合もあるに決まってる。

こんなくだらない話でよく盛り上がれるな
0644デフォルトの名無しさん
垢版 |
2018/04/01(日) 13:16:23.13ID:Q3bP29mI
>>643
だから無駄な道具を乱造して散らかす奴が悪いんだろ?
いくら「これが正しい!」と喚いてもゴミ屋敷をスマートとは言えんわ
0645デフォルトの名無しさん
垢版 |
2018/04/01(日) 13:24:59.02ID:EnMpGyAP
なんかずれてんな
いやわざとか?

みんな「1行コードはクール」
みんな「いや害悪だ」

>>631「1行コードにはこんな意味不明な頭悪いコードが実在するんだぜぇ」

>>634「いやーそれはストラテジでしょ。普通のコードだよ」

あほ「巨大整数ガー!ゴミ屋敷ガー!」

途中から明後日の方向に向かってんだよ
一例に過剰反応バカが湧いてきたあたりからね
0646デフォルトの名無しさん
垢版 |
2018/04/01(日) 13:28:56.88ID:IPSX8M4/
一つ言えるのは、一行コードをセンスが無いやつが書くとゴミクズになるってことだな
まあ何行でもゴミと言えるかもしれんが、一行のゴミはメンテする時腹が立つ
0647デフォルトの名無しさん
垢版 |
2018/04/01(日) 13:30:25.54ID:EnMpGyAP
1行メソッドの利点を理解できないアホが逆ギレしてるだけのパターンもあるということは忘れないで
0648デフォルトの名無しさん
垢版 |
2018/04/01(日) 14:14:15.06ID:tywMjCxA
一行のゴミにも何か利点はあるはずだと頑なに改めようとしない>>647なのであった

マジでゴミ屋敷の主だな
0649デフォルトの名無しさん
垢版 |
2018/04/01(日) 14:20:30.29ID:G1/6VWB7
>>645はstrategyも理解してないアホの子だから許してあげて
ただのラッパーを戦略と勘違いしてるなんて、きっと今年の春から働き始める新人だから
0650デフォルトの名無しさん
垢版 |
2018/04/01(日) 14:28:00.99ID:tywMjCxA
上司「なんでこのインクリメントを関数に分けてんの?」

新人「様々な型に対応する為のストラテジです!巨大整数などにも対応できます!」

何というか無能な働き者って言葉がしっくり来るな
たぶんこいつは誰からも理解されずに五月病患って数ヶ月で退職するわ
0651デフォルトの名無しさん
垢版 |
2018/04/01(日) 14:39:00.26ID:yKN9r4eJ
インクリメントの(多相じゃなくて正しい意味での)ストラテジって何だろうね
++とInterlocked.Incrementを切り替えるとか?
エイプリルフールネタにもならんな
0654デフォルトの名無しさん
垢版 |
2018/04/01(日) 15:13:55.41ID:WEVo4Vkx
ゆとり世代はなんでも揃ってるところからスタートだから楽でいいよな
iteratorの実装なんて考えたことすらないんだろう
羨ましいよ
0656デフォルトの名無しさん
垢版 |
2018/04/01(日) 17:15:29.85ID:4YlUj4T1
>>650
何で巨大整数に対応する必要ない状況を前提としてるの?
対応すべきという状況を前提とした途端に真逆の結論になると思うけど
0658デフォルトの名無しさん
垢版 |
2018/04/01(日) 17:45:28.27ID:Ek+Kt6QK
巨大整数対応を勝手に仕様上あり得ないことにしている点
「○○にも対応できるように」の○○に巨大整数を入れるのはあくまで一例であり他にも山ほどあり得る点
この辺りが問題かな
言われた通りの物を納品すればいい所謂IT土方系の環境なら問題にならないんだろうけど
0659デフォルトの名無しさん
垢版 |
2018/04/01(日) 17:47:21.74ID:Aa3HndXz
>>656
対応すべきという状況を前提にしたとしても、>>650の新人がストラテジパターンを誤解している阿呆であるという結論は覆らない
>>631を型ごとに用意するのは一般にはパラメータ多相、あるいは単にオーバーロードと呼ぶんだよ
0660659
垢版 |
2018/04/01(日) 17:49:35.48ID:Aa3HndXz
すまん訂正
パラメータ多相じゃなくてアドホック多相だな
0661デフォルトの名無しさん
垢版 |
2018/04/01(日) 17:49:42.89ID:Ca3RLpqD
この手のっていつも「自分の前提」の元に議論初めてかみ合わないんだから止めとけよ
ネタが下らないことだし、そんなことにこだわるしかやることないのかよ
0662デフォルトの名無しさん
垢版 |
2018/04/01(日) 17:53:38.19ID:8TyNtssw
int型をBigInt型に切り替える必要が生じたとして、
型宣言から書き直さないといけないのにインクリメントを分離しておいて何が効率化できたというのかと
そもそもオブジェクト指向に則ればその型自体にインクリメントを備えるだろっていう

現実に設計したこともない新人が本の知識で言ってるだけだなこりゃ
0663デフォルトの名無しさん
垢版 |
2018/04/01(日) 18:21:49.73ID:8TyNtssw
正しい設計
INum num = new Num()
// INum num = new BigNum() ←クラス名を変えるだけ
num++ ←機能は型で規格化されてるので変更無用

間違った設計
Num num = new Num()
// BigNum num = new BigNum() ←型から変える必要がある
Increment(ref num) ←何これ?

void Increment(ref Num n) 処理
void Increment(ref BigNum n) 処理
↑型の数だけオーバーロードする必要がある
0665デフォルトの名無しさん
垢版 |
2018/04/01(日) 19:40:56.03ID:WEVo4Vkx
>>660
はぁ? どう見てもストラテジだろカス

void func<T>(T mi, T mx, FuncObj<T> increment) {
for(T i = mi; ! i.Equals(mx); increment.Exec(i)) {
//
}
}

class BigIntIncrent : FuncObj<BigInt> {
public Exec(ref BigInt x) {
x = x.Add(1);
}
}
0666デフォルトの名無しさん
垢版 |
2018/04/01(日) 19:44:56.66ID:WEVo4Vkx
>>663
なんでBigIntのソースが手元にある前提なんだよ
まあ素人は標準のパッケージ以外を持ってきて使うなんて経験はないのかもしれんから間違えても仕方がないか
君素人っぽいし
0667デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:02:44.23ID:c1epJvM3
>>665
惜しい。一旦クールダウンしてよく考えよう。
同じ入力(コンテキスト)に対して複数のStrategyを定義し、状況によって使い分けるのがStrategyパターンだ。
一方incrementの場合、実装は入力の型に応じて一意に決まるだろ?「同じ入力」に対して複数の実装があるわけじゃない。
そういう、引数の型に応じて静的に実装を選択するのを一般に「多相」という。
特に、君のコードは関数型言語で型クラスと呼ばれるものに近い。ググってみると勉強になるよ。
0668デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:08:31.72ID:WEVo4Vkx
>>667
1つ飛ばしでイテレートしたい場合とか同じ型でも幾らでもバリエーションは考えられるわけだがわかんねえだろうな用意されたもの使うだけのゆとりには
0670デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:13:25.61ID:WEVo4Vkx
>>669
あらゆる物事に対してそれを理解するために必要な知能の下限が存在する
これって1つの真理だと思うのよ
0671デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:20:07.28ID:PinoCRrg
>>670
funcって何?
funcObjって何?
miって何?
mxって何?
Execって何?どういう機能?
BigIntでAdd?コレクションなん?

パッと見ただけでこれだけ疑問が湧くんだが、
プログラマ百人に聞いたら百人が死ねって返すレベルのクソだぞこれ
命名だけでバレる実力なら無理して書くなよ
0672デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:22:40.27ID:c1epJvM3
>>668
そうだね。確かに君の言う通りだ。
じゃあ君はなぜ>>665でわざわざジェネリックを使ったのかな?
>>665を見た殆どの人は、型に応じて++の実装を切り替えたいのだろうと思うだろうね。それを君はストラテジだと言っている。
このままでは誤解してしまう人もいるだろうから指摘したんだよ。
君自身はもしかしたら本当は正しく理解してたのかもしれないけど、衆目に晒すにはあまりにも不適切なレスだ。
0673デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:25:32.72ID:WEVo4Vkx
文脈読めない、中心になってる話題を理解して枝葉末節を気にしない、っての実践するにもある程度の知能が必要なんだろうなー
そういうの苦手な人ってミーティングの時とか相当鬱陶しがられてると思うから注意したほうがいいよ
0675デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:30:19.04ID:Aa3HndXz
>>673
悪いけど、文脈を読んだら>>665のコードは100人中100人が型++を切り替えようとしてるのだろうと解釈すると思うぞw
0677デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:40:22.21ID:WEVo4Vkx
>>672
ジェネリックかどうかは関係ない話だろ
この例も仮にスクリプト言語だったら型引数は無くても動作する
たまたま型の指定が必要な言語を例に使ったからジェネリックになっているだけ
しかしそのエッセンス自体は何も変わってない
まずはそこを理解しよう
0678デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:54:39.80ID:G1/6VWB7
>>665を読むとこいつうちにいた新人より頭悪い気がする
ストラテジとか言いながらやってることが関数型だし
これでデザパタのつもりなら学校通い直すのを勧める
0679デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:55:42.47ID:WEVo4Vkx
ここでいうエッセンスというのは
* 処理の一部を外部から与えることによってアルゴリズムを交換可能にするテクニックをストラテジーパターンと言う
* ストラテジーはしばしばインクリメント処理のように非常に小さな処理になることがある
* その一例が>>631であり>>631馬鹿げたコードでもなんでもなく実用的なコードの断片である
という3点のことな
0680デフォルトの名無しさん
垢版 |
2018/04/01(日) 20:59:08.51ID:WEVo4Vkx
>>678
λや関数オブジェクトがサポートされる言語では暗黙的にストラテジーの考え方が利用されている
そうと意識してないだけだ
ちょうどいい時期だ上司に頼んでお前も新人研修受けてこい
0681デフォルトの名無しさん
垢版 |
2018/04/01(日) 21:00:23.18ID:GxluVQTa
何も見せてなければ何とでも言えたろうが、
>>665を見せてしまったらもう無理だな
レベルの低さが露呈してるから言い訳にもならない

正直>>665を見たあとだと>>631が優秀に見えるくらいだし
0684デフォルトの名無しさん
垢版 |
2018/04/01(日) 21:11:29.38ID:G1/6VWB7
そもそも関数の細分化は可読性を損ねるって話なのに、
抽象的で省略しまくりの名前付けてる時点でな
設計に口出すのは十年早いと思うわ
0685デフォルトの名無しさん
垢版 |
2018/04/01(日) 21:17:25.87ID:GxluVQTa
どうでも良いが>>665をよく見るとこいつrefの使い方すら知らないど素人くさいな
値次第でループバグ起こす構造だしこんなコード実務で仕込まれたら俺ならテロ認定する
0687デフォルトの名無しさん
垢版 |
2018/04/01(日) 21:24:13.70ID:GxluVQTa
本気で書いたコード貶されたら

「あれは手抜きだからw」と言い出す

まあリアルにいるよな
0690デフォルトの名無しさん
垢版 |
2018/04/04(水) 16:05:17.38ID:h/TS8w43
stringが参照型ってことはさ

string str;
void Reset() => str = "";

とするより

string str;
string None = "";
void Reset() => str = None;

と生成済みのテキストを使い回した方が効率良いの?
0694デフォルトの名無しさん
垢版 |
2018/04/04(水) 20:17:49.55ID:dY0QYfwJ
>>690 変わらないと思われ

string Func0(){return "test";}
string Func1(){return "test";}
string Func2(){return "te"+"st";}
string Func3(){return "TEST".ToLower();}

string a=Func1(), b=Func2();
Console.WriteLine(Object.ReferenceEquals(a,b));
■ このスレッドは過去ログ倉庫に格納されています

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