Togetter/min.tを安心してお使い頂くためのガイドラインを公開しました。

「パパの書くプログラムってif文すごく少ないね」 → 「よく気がついたな。if文をあまり書かないよう設計すると皆に喜ばれるぞ」

小学生に読ませたい図鑑「クソコード」 _(:3 」∠ )_
515
ミノ駆動 @MinoDriven

昨日ゲームプログラミングしてる最中 うちの子「パパの書くプログラムってif文すごく少ないね」 僕「よく気が付いたな。同じ動きのコードでも何も考えずに書くとif文だらけで読みにくくなるんだ。if文をあまり書かないよう設計すると皆に喜ばれるぞ」 とインプットしておいた。

2020-02-25 11:48:13
ミノ駆動 @MinoDriven

@fijii_2001rin ありがとうごぜぇます。 Game Maker Studioやマインクラフトのコマンドブロックでスクリプトを書いたりしているので多少理解できるようになってきてるかもです。

2020-02-25 12:13:35
たかやまひろゆき🐻 @kssfilo

if文減らす派の英才教育 プログラムの可読性と言うよりは 必要テスト量を減らせるというのが大きいよな twitter.com/minodriven/sta…

2020-02-25 17:59:41
ミノ駆動 @MinoDriven

こういうのに陥ったらITエンジニアとして「詰み」の状態。 pic.twitter.com/fYt7LelJ2V

2018-01-20 16:48:34
拡大
拡大
ばりとん📛なんでもつくるエンジニア @dd0125

@MinoDriven 「パパの書くプログラムってif文すごく少ないね」 このセリフが言えるだけですごく優秀なお子さんな感じがしますね・・! 親子プログラミング楽しそうでいいですね🤗

2020-02-26 10:13:40
nPonta@たぬき @nPonta_Tanuki

@MinoDriven はじめましてー。 コードの複雑度は、ありったけ下げたいですよね。 書籍のリーダブルコードとコードリーディングも、そのうちちゃんと読まないと、と思うこの頃です。

2020-02-26 07:40:22
ぐちもん @guchimon99

子ども優秀。 他人のコード見てその人の思考を読むことがプログラマには求められるのです。 「月が綺麗ですね」から「好意」を感じろ! twitter.com/minodriven/sta…

2020-02-26 12:13:27
STB a.k.a. さとまる @stb_nissie

俺も条件分岐は可能な限り減らしたいけど、稀にレビューで「if文を書け」と言われる。大体は「読みにくい」からと言われるんだが、あまり納得はできない。 twitter.com/minodriven/sta…

2020-02-25 22:53:43
すこれ @scholasticus16

@MinoDriven いやがらせしたいときにはgotoだらけにするんだぞ

2020-02-26 21:14:05
ミノ駆動 @MinoDriven

ちなみにプログラミングしてたのはこのゲーム用のプラグインのことね。今制作中のバグ退治RPGバグハンター2。 twitter.com/MinoDriven/sta…

2020-02-25 20:11:29
那月 @RNatsuki365

@MinoDriven 昔Perlで演算子使いまくって後から読み返せない呪文が出来上がった苦い思い出

2020-02-25 18:18:16
にゃる @5MVQB7xL6PCw9e1

@MinoDriven 解析でもpythonを使う場合、ライブラリのみでどうやって解決するかが動作の速さを担保する要素になりますから、共通した話題なのかなと思いました。

2020-02-26 00:56:59
終焉の太陽☀ @sforest1975

@MinoDriven 何歳か知らないけど そんなことに興味を持つ子供って素晴らしい

2020-02-25 15:49:19
ミノ駆動 @MinoDriven

@cero_t 本人も将来プラグラマになりたいと言うてますし、親子で設計に強くなれればいいなあと思ってます。

2020-02-25 14:29:19
ミノ駆動 @MinoDriven

ちなみにこれ「三項演算子使いまくってif文減らしました!!」って話じゃないよ。 interfaceで抽象化したりhashで区分オブジェクト実現したり、コレクションクラスを作ってリスト処理を隔離&単純化するなど、設計で解決するという話だよ。

2020-02-25 15:01:38
ミノ駆動 @MinoDriven

@nPonta_Tanuki コードの複雑度を下げる設計は、増田亨氏の「現場で役立つシステム設計の原則」がオススメです。 amazon.co.jp/dp/477419087X

2020-02-26 07:51:29
Arichika TANIGUCHI ♻ @arichika

この本の話ですが、とてもよかったですよ。その上で、現場の複雑怪奇な仕様と、どう戦うかの話で盛り上がれるといいですな。 『現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法』 amazon.co.jp/dp/477419087X/

2017-07-14 11:07:25
増田 亨. @masuda220

Amazonの売れ筋ランキングで急上昇した。 このツイートの影響かな? twitter.com/MinoDriven/sta…

2020-02-26 14:59:38

コメント

白鷺 @helsigh 2020年2月27日
個人的には何やってるかなんでやってるかわかればif文多くてもいいよ…
112
autopen @autopen10 2020年2月27日
switch!goto!三項演算子!
24
Я Чайка  @CatMellanie 2020年2月27日
Swiftだから、Optional bindingのifは避けて通れないんだ・・・ 一応guard文は積極的に使ってるけど
4
エリ・エリ・レマ・サンバディトゥナイ @mtoaki 2020年2月27日
else ifでこんがらかるところはswitch文にするけども。
14
SAKURA87@多摩丁督 @Sakura87_net 2020年2月27日
そういえば2~3行を数回程度のループならループを使わずにその回数分書いた方が高速だっていうノウハウは今でも有効なんだろうか。賢いコンパイラだとコンパイラがやってくれそうだけど。
6
うの @uniquis 2020年2月27日
自分はまずネストを減らすようにしてるな
23
prad_bitt @pradbitt42 2020年2月27日
autopen10 関数の戻り値の名前の関数をeval!
2
Denullpo S. Hammerson @denullpo 2020年2月27日
三項演算子嵐とか、forやらwhileやらの条件が呪文とかより、if並べる方がいいに決まっちょるし、判定用の関数にまとめとくともっといい
39
たかみん/りんと @r_takamine 2020年2月27日
if (conditionA && conditionB && (conditionC || conditionD) && isConditionE(value) && conditionF)
16
Denullpo S. Hammerson @denullpo 2020年2月27日
んで、switch忌避教ってのもあるよなー それでif〜else嵐になってんの
12
こまごめ太郎 @katsudon_oniku 2020年2月27日
わけのわからないこだわりのせいで拡張や移植が困難になるコードが完成する。
22
ダムゼミ山 @darude_yama 2020年2月27日
これはif松…真か偽かわかんねえなこれ
83
たし @punimuchiya 2020年2月27日
よし、異なる処理は全部実装クラスを分けてDIしよう→10万行の設定ファイルが完成!
7
ですの @_desuno_ 2020年2月27日
最近はコンパイラやら実行環境やらが勝手に色々やって最適化が面倒で読みやすけりゃいいじゃん教に入信した
27
K.Yanagisawa @K_Yana47 2020年2月27日
少ないと言えるって事は多いを知っているということになるが、そんな"比べる相手"がいる環境なのか? 嘘松率高いな。言いたいことに子供を出汁に使っているだけにしか。
35
kusano @t_kusano 2020年2月27日
golangだとif文は避けて通れないけど、pythonならだいぶ削減できるイメージ(X if cond else Yみたいのはif文に入れないw)。言語仕様に依存するね。
1
kusano @t_kusano 2020年2月27日
そりゃそうとコードレビューで謎の勢力に謎改悪を要求されることってよくあるよね。戦うの面倒だから言う通りしてるけどさ。品質とか知ったことか金だけもらうよ。
12
jk @jk_1976 2020年2月27日
一般論としてif少ないのがいいってことは言えないと思うが‥ネストしまくりはともかく COBOLぐらいしか知らないから、言語によってはそうなのかもしれんけどねえ
7
ユドリィ|とどろき @ndac_todoroki 2020年2月27日
if文書かずにパターンマッチを使いましょうね
1
ちいさいおおかみ〜クリアカード編〜 @siu_long 2020年2月27日
分岐が少なくなるよりも、分岐条件がはっきりした上で最適相当数あるのは許せるよなぁ…。
0
frisky @friskymonpetit 2020年2月27日
「if文を減らす」は条件分岐を減らす、ではなくてif演算子とか continue, break, return とかを使うことでネストを減らすことを言ってるのではないかなぁ…それとも宣言型言語とか多態で切り替えろって話なのかな…三項演算子は可読性を落とすし、ARMには条件付き実行というのがあるけどそういう話じゃないよねこれ。
3
CD @cleardice 2020年2月27日
慣れないうちは条件分岐多用しがちなのわかる(カルネージハートのチップを思い出しながら)
0
キケリキー @KIKERIKI17 2020年2月27日
やぁ、if文を減らしたいみんなのヒーロー「break X」だっ!switchを抜けつつforも抜けたい?その時は唱えるんだ「break 2」。更に上位のループも抜けてしまいたい?そんなときは「break 3」いくつでも抜けられて、便利だぞっ!!
5
Tadashi @tadashifx 2020年2月27日
この子は頭良さそうなので大丈夫だとは思うのだけれど…時々、妙なこだわりを持って読みにくくしちゃう輩がいるので困る。
1
たるたる @heporap 2020年2月27日
if( A.has(x) ){} else if( A.has(Y) ){} else if( A.has(Z) ){} .........
2
Tadashi @tadashifx 2020年2月27日
tadashifx (本題とはまず関係ないどうでもいい話ではあるが…HDLだと吐かれるものが想像しやすいので私はifやcaseは大好きである)
2
たるたる @heporap 2020年2月27日
自分がやってる対策はネストを減らすくらいかなあ。ネストが増えれば関数にまとめる。(ifの数は変わらないが可読性だけ変わる)
1
たるたる @heporap 2020年2月27日
三項演算子はそこまで可読性が悪いとは思えないけど、、、慣れ?
12
キケリキー @KIKERIKI17 2020年2月27日
技術レベル的にクソコードを書いてしまうのと、設計でクソコードが約束されるのは別の話だからなぁ。そういうのごっちゃに話すべきではないんだけどなぁ。まとめでも「設計」の本がオススメされてて、うーんって思うところはある。
1
エリ・エリ・レマ・サンバディトゥナイ @mtoaki 2020年2月27日
BASICにはif文しかなかったから、Cでswitch文にふれた時なんて便利なものがあるんだ!!!!と感動したな。
11
或見 @alimicrow 2020年2月27日
KIKERIKI17 同じ技術を持っていたと仮定して、考え方を変えるだけで良いものができる可能性があるからじゃないですかね。そういうのを総合して技術力ということにはなるんでしょうけれども。
8
nbtnk @nbtnk 2020年2月27日
昔のインタプリタBASICだと処理速度稼ぐ目的もあった、結果論理演算だらけになる。まぁ、プログラム言語のifは可愛いもので、真の敵はセル関数……
0
spin_out @spin_over 2020年2月27日
プログラムレベルの話だと、何でも使いどころと的確なコメント。きちんとした関数化。要件的にフラグとかモードとか使う場合でも、定数化とコメントで可読性は変わる。
3
胡桃澤 奈波 @nowkogami 2020年2月27日
switch は break で途中抜けする構造はケアレスミスの原因になって悪だと思う。そもそもだけど関数の中の行数が増えることのほうが悪影響がでかい。
3
あごにー @Agony_01 2020年2月27日
三項演算子、自分もそんなに嫌いではないのだがやってることはif文と同じだから、別にわざわざ三項演算子を選ぶ必要がないかなぁ・・・っていう。ただ、if文の数がどうこうっていう部分に意識をもっていってほしくないかなとは思うな。ちゃんと意味を持ってクラス分け・関数分けしていくと結果的にif文が減るって思った方がいいと思うわ。
4
【わちゃっとピンボールDLよろしく勇気!】ねねっとテックダイナー @nenet_techdiner 2020年2月27日
勉強がてらに読んでて小学館の『クソコード』Amazonで探しちゃったじゃねーかw(実話)
0
転倒小心 @tentousho 2020年2月27日
職業プログラマーの方々の普段のお仕事の様子を知らないのでアレなんですけども、プログラミングってひとりで一つのプログラムをガーッとやると思ってたので分業するとか大人数で一つにあたるとかの様子が全く想像つかないです。多分その想像が付かない部分で必要な思考のお話なんでしょうねこれ
8
mmm1969mmm @mmm1969mmm 2020年2月27日
オレ ifスクナイ ウレシクナイ オレ ワカリヤスイ ウレシイ
19
Hacchi @2mocccck 2020年2月27日
三項演算子自体はそこまで悪さしないけど三項演算子のネストはガチで見づらいから滅びてほしい
35
らるふ/ 積みゲ消化中 @ai_raw01 2020年2月27日
1行毎に書けとは言わないから何やってるか分かるコメント書いてくれ
8
せんたく @senn_taku 2020年2月27日
r_takamine conditionABEF && conditionCorDみたいなまとめ方しか思い浮かばぬ…勉強しなきゃ…
0
せんたく @senn_taku 2020年2月27日
牛乳があったら買ってきて。卵があったら6個お願い
10
sake @sake_ne_ku 2020年2月27日
細かいテクニックとかよりも、やってることが明確でシンプルで、上から下へ読みやすいコードにして欲しい ほんとに
10
K.Yanagisawa @K_Yana47 2020年2月27日
たいしたコメントが付いてるわけでもないのに結構喜んでるような元コメ主の言動からすれば、その程度の"ネタ"なんだろうと知れる。<さて、反応は如何に?
1
lion @lion55571 2020年2月27日
サイクロマティック複雑度が10未満ならいいんじゃない?
0
SAKURA87@多摩丁督 @Sakura87_net 2020年2月27日
heporap 「a>0?c:b」くらいの短い三項演算子ならifより可読性上がりそうだけど「a>0&&b<c||c!=x.Length?e:e>0?...」みたいに無理矢理三項演算子で1行で書こうとしたものは嫌われやすく、三項演算子を覚えたての人はやりやすいから、三項演算子NGってそこそこあるんだとこの前なんかのまとめで見た。
15
クリスセドン @sedooooooon 2020年2月27日
とりあえず動いてるからヨシ!
1
シロネコ @straypas 2020年2月27日
単一責任の原則とかドメイン駆動設計とかを十分に理解してるとif文は驚くほど少なくなる。設計に無駄が少ないとifは少なくなる。設計に無駄がないってことは、コードの調査や修正がすごく簡単に出来るってこと。つまり、機能追加や修正が短時間で終わる。この手の理解度高い人って普通のプログラマの数倍の速度で開発できるんだわ
30
つら @tsuramisan 2020年2月27日
だって0か1だし(´・ω・`)
0
spin_out @spin_over 2020年2月27日
三項演算子が嫌われるのは昔のステップ数(行数)=金だった時代の名残ではないかとも。まあ確かに三項演算子のネストは見難い。
0
點面悪鬼百之助 @x743 2020年2月27日
条件分岐を少なくしたいのであればまず仕様書から修正してくれ
2
あごにー @Agony_01 2020年2月27日
r_takamine 多分それはisCondition()関数で外出しして、途中if文でReturnさせる設計にした方がよさそうではあるが、isConditionE(value)配下で変な処理をしていないことが条件ですね・・・
6
aitsuki @aitsuki2 2020年2月27日
ベン図かんがえると単純化できたりする話では
1
鶴島 亀島 @craneturtle 2020年2月27日
プログラム分からないわたしが読ませてもらいました。 遅ればせながらこれから学習するキッカケにしたいです。
0
cocoon @cocoonP 2020年2月27日
mtoaki ON <EXPR> GOSUB とかあったと思います
1
さく @sakuro 2020年2月27日
polymorphism で条件判定そのものがコードに出てこないようにする話じゃないの?
7
エリ・エリ・レマ・サンバディトゥナイ @mtoaki 2020年2月27日
cocoonP 見たことも聞いたこともない…と思ったけどN88とMSX-BASIC Ver2にはあるみたいだな。見た感じ前処理が必要っぽくてif文並べた方がマシに思えるけどどうなんだろ。
0
@wanwanbawbaw 2020年2月27日
某表計算ソフトで1セルにif文38行に渡って書いたときはなにか違う書き方で短くできればと思ったけど。if goto文が好きな私でも心折れた
3
たし @punimuchiya 2020年2月27日
straypas DDDもある程度の規模の開発でパフォーマンスにも気を使うとそこまで生産性の差は出ないと思うよ。永続化のことを考えずORマッパーでゴリった結果速度が全然出なくて、チューニングのためにクエリ書き倒して結局ぐちゃぐちゃになった案件を知っている
6
cocoon @cocoonP 2020年2月27日
mtoaki 普通のCASE文っぽく使いたければ面倒くさい(前提の条件を定義する部分がそれぞれ離れているなら多少は有効かも?)ですが、ジョイスティック入力による分岐とかで使われてたケースがよくありますね。
1
COPっぽい何か @hiro_cop 2020年2月27日
wanwanbawbaw セル内にそんなにif入れたら処理できなくならないかなぁ。そこまで長くなったらVBAに逃げたほうが良い気がする…
1
100ten @100tenbot 2020年2月27日
こういうのは嘘松って言わないの?
9
キタムラシステム @kitasys 2020年2月27日
「パパの書く始末書って枚数少ないね」「よく気がついたね。こういうのはあまり書く事態にならないほうが喜ばれるんだ」
12
rambda @rambda2 2020年2月27日
hiro_cop 名前である程度は対処可能ではある
0
愚民Artane.🦀@日本こそ表現関連の人権の最先端社会。後、コロナは風邪じゃない@経験者は語る @Artanejp 2020年2月27日
ロジックとしてシンプルにした方がバグは仕込みにくく、それはif文の多さとは無関係だよ(´・ω・`)
8
愚民Artane.🦀@日本こそ表現関連の人権の最先端社会。後、コロナは風邪じゃない@経験者は語る @Artanejp 2020年2月27日
Sakura87_net ループ展開は自動化されてますよ。どちらかと言うと、SIMD命令利用するように誘導するのが大事になってきてますね。
3
愚民Artane.🦀@日本こそ表現関連の人権の最先端社会。後、コロナは風邪じゃない@経験者は語る @Artanejp 2020年2月27日
後、スタックに積む回数減らすことかな(例えばインライン展開やABI選択段階のなにかや)
0
高瀬玲/タカセアキラ_清楚過ぎて天使系ビッチ🤔 @takaseakira 2020年2月27日
とりあえずコメントだけは真面目に書かないと 他の人どころか未来の自分も苦しめる事になる グエー
6
Γ∂ρ!§ @lapis_nul 2020年2月27日
senn_taku 「何で牛乳6個買ってきたんだよ」『お前が卵があったらって言ったからだろ。だったらもっと厳密な仕様を言えよ無能が』
9
順三朗 @junzabroP 2020年2月27日
3重以上のifのネスト、5以上連続するif〜elseは悪い文明!
0
たるたる @heporap 2020年2月27日
Sakura87_net 2mocccck 条件部分が長い三項演算子は見づらいですね。 私は (a<5)? 'x': (a<10)? 'y': 'z' みたいなのはちょくちょく書きます。(必ず括弧を書くのとスペース区切りをつけます。)
0
ビーフジャーキー @_beafJerky 2020年2月27日
ブコメでもはてブでもdddや抽象化の文脈って一発でわからずに他の構文のテクニックの話してるのあかんな
10
たるたる @heporap 2020年2月27日
condition/expressionやCSSセレクタ、正規表現を書き換えることでifの数が減ることはあるけど、コメントで例を書ける物でもない。
0
k9cycle @__hage 2020年2月27日
オブジェクト指向だったら分岐はインスタンス生成時に行ってあとは多態でなんとかするとか、パターンマッチのある言語だったらそっちを使うとか字面上の条件分岐を減らす手段が用意されている言語はありますね。あとリテラルに辞書のある言語だったらswitchを単なるテーブルルックアップにしちゃうとかね。最近分岐もループ(こっちはeach, map, reduce, flatmap等を駆使する)も直接書くことはあまりなくなりました。
9
せんたく @senn_taku 2020年2月27日
lapis_nul 牛乳があったら6個買ってきて。
0
takatakattata @takatakattata1 2020年2月27日
プログラマーを自称してるわりにはあまりにも前提がなさすぎて、彼の見やすいコードとやらがどんなものなのかちゃんと伝わってないのでは。
1
nekora2520 @nekora2520 2020年2月27日
if文の是非はともかくとして、会話が嘘松臭過ぎる…。
2
いそむら忘久@とまや工務店 @i8o 2020年2月27日
ネストは少なく、ならわかるけど。単純にif文が少ないのって変数チェックがガバガバでろくでもないコードという印象だわさ
0
フローライト @FluoRiteTW 2020年2月27日
深淵のように深い深いネストを喰らえ!
0
Urushibara @tsuji_pneuma 2020年2月27日
40 I$=INKEY$:X=X-(I$="1"OR I$="4"OR I$="7")*(X>0)+(I$="3"OR I$="6"OR I$="9")*(X<100):Y=Y-(I$="1"OR I$="2"OR I$="3")*(Y>0)+(I$="7OR I$="8"OR I$="9")*(Y<40):PUTSPRITE X,Y,"PLANE",COLOR:GOTO40 昔のMSXとかで使われていたIF使わないマルチステートメントで高速化するという技。何やってるかわかったら偉い
5
ねや @AriaSub 2020年2月27日
設計で解決する話であって、全く同じ設計で組む人によって分岐が減るなんて事ありえないから・・・ ×IF文を減らすテクニックがある ○正しく設計すればIF文の出番がない モデリング設計とそれを表現しやすいOOPのはずなのに、 日本のPGは手続き型設計をOOPのルールで書こうとするからおかしくなる
23
kartis56 @kartis56 2020年2月27日
言語自体の仕様でどうしようもなく見ずらいLISPというのがあって…
1
Lotus @Lotus19810101 2020年2月27日
えっ今日は三項演算子の中に三項演算子を書いてもいいのか!
3
YF @annex38 2020年2月27日
プログラムをダンプするとIBMの文字がスペースで浮き出る仕込みをして他社との著作権侵害裁判に勝った話が好きだ
3
kusano @t_kusano 2020年2月27日
tsuji_pneuma PC8001ユーザのオレには楽勝。「入力が1, 4, 7かつX>0ならX--、3, 6, 9かつX<100ならX++、1, 2, 3かつY>0ならY--、7, 8, 9かつY<40ならY++して、座標(X, Y)にスプライトを表示してループせよ」ところでINSTRを使えばもうちょっと短くなるんじゃ?
0
@wanwanbawbaw 2020年2月27日
hiro_cop VBA使えない表計算ソフトがありましてですね…構文が独特なので1から覚えないと使えないマクロ構文というのはどうも…
1
Off Black @OffBlack1 2020年2月27日
if文やfor文に渡す前に、grepとかfindするなりで条件をある程度絞ってから…と説明するけどいまいちふに落ちない顔の奴に、不安覚えつつ設計書を書かせたら、インデックスマル無視全レコード検索始まってた絶望。
2
KPCG10 @KPCG10 2020年2月27日
if 文を減らす前に「なぜその値で比較しているのか」が解るようプログラミングする(定数なら define や enum 等、関連する数字をまとめる)とか、さらに言えばこまめにコメントを入れるほうが大事。
4
たかつき @taka4tsuki 2020年2月27日
判定関数を切ってCC値を減らすとかそういう話っしょ。
0
たかつき @taka4tsuki 2020年2月27日
taka4tsuki 循環的複雑度(サイクロマティックコンプレキシティ、CC)
1
HAJIME Fukuna / 福名 一 @f97one 2020年2月27日
このお子さん、才能の片鱗を感じる....
0
Cook🐿⚡🦜生還しました。後遺症なし!詳細はピン留め @CookDrake 2020年2月27日
算術IF GOTOの塊みたいなサブルーチン群を一週間位かかって逆フロー起こしたことを思い出した。
1
こんがり @YXLZo0xhqmKWiVx 2020年2月27日
switchも三項演算子も大好物
0
Akihiro @Dynabook 2020年2月27日
この子、LexerやParserのソースみたら泣き出すんじゃないか? まあ冗談はさて置き、オブジェクト指向だのデザインパターンだのと言った高レベルな考えを適用できない領域は存在するわけで、IF文が多いのは悪みたいな決めつけは好きではないかな ただ思考を停止しだらだらと深いネストのIF分はシネ
8
わんだらぁ @StellaInerrans 2020年2月27日
処理の粒度を揃えることを意識したら、コードは自然と読み易くなる。
1
ゆうき @F001Yuki 2020年2月27日
コンパイラが優秀になってきたのでコンパイルしてマシン語比較したら同じだったという話を聞いて以来三項演算子使うのやめた思い出。その後ifの代わりに全部計算式で処理するのをやった。処理速度が上がって確かな手応えを感じた。数日後に改めて見たとき、可読性が息をしていなくて自分のやったことは正しかったのか悩む。いつしか「戦わないのが最強の武力」みたいなところに向かって歩き出す。ifは少ない方がいいってのは、使わないことを考えるのではなく、使うことを考えるのだった…
12
m232796 @m232796 2020年2月28日
そうはいうがビット演算やマスクを駆使しだすとそれはそれで可読性が恐ろしく落ちる。 ビット演算の魔術とか黒魔術とかパックド演算って呼ばれるやつ。 想像つかない人のために例示すると「lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xd0000001u)」(from Wikipedia)みたいなのを何重にも複雑にしたような奴ね。
2
かじ @micking_bird 2020年2月28日
自分、小学生の時自由研究でサイコロを複数回振って各目の確率を計算するプログラムを父の友人に頼み込ん作ってもらったけど、正直何書いてあるのか全く理解できなかったし、それが理解できるようになったのは結構後だぞ。
1
navyfox @navyfox 2020年2月28日
x743 aitsuki2 ベン図や真理値表はカルノー図を活用すると上手い具合に単純化できたりしますけど、仕様書が日本語の「○○の場合、△△する」の羅列で書かれてると今度は仕様とコードが一致してるのかわかりにくくなるのでまずは仕様書をどうにかしろって話になってきますね…。
2
後藤寿庵 @juangotoh 2020年2月28日
ifを増やすなとか、goto使うなみたいのは、なぜなのかを考えず盲従するとかえってえらいことになる。三項演算子なんて場合によっては逆にわかりにくいコードになりかねないし。
8
想 詩拓@文芸サークル『文机』 @sou_sitaku 2020年2月28日
if分こそがプログラムの真骨頂だと思うので、無闇に減らそうとすると良くないと思う。同じような判断をまとめてモジュール化してif文を減らすと言うのなら分からないでもない。
3
想 詩拓@文芸サークル『文机』 @sou_sitaku 2020年2月28日
pokka80 【if else】は言語によって違ってくるので確かに書こうと思うたびに調べ直すイメージがある。
1
RGB000 @19666_61 2020年2月28日
そもそも皆さん何の言語の話してるんですかね。言語によりませんか?減らす増やすも目安わからないし。多いっていっても画面いっぱいのif-elseif-elseなのか、そこそこなのか
3
RGB000 @19666_61 2020年2月28日
ifよりもネストをなんとかしろ
0
ひろじ @kondohi 2020年2月28日
「ifを使うな」→「三項演算子を使え」って、まさかジョークでなくてマジで主張してるの?
0
ミノ駆動 @MinoDriven 2020年2月28日
ツイ主です、こんにちは。皆さん凄いこと書かれていますね。さて、本件ツイの下記リプにあるように、interfaceや区分オブジェクト、コレクションクラス等で設計することで分岐実装自体を低減するものです。三項演算子など構文レベルの解決手段ではなく、設計です。下記リプがこのまとめ記事に載らなかったことが残念でなりません。 https://twitter.com/MinoDriven/status/1232183853705334784
26
alan smithy @alansmithy2010 2020年2月28日
なんでswitch文がクソなの?と思ったら配列なりDBなりで済む事をやっとんのか...
1
alan smithy @alansmithy2010 2020年2月28日
内容はC言語だが割とどの言語でも普遍的な参考→ http://www.pro.or.jp/~fuji/mybooks/cdiag/
0
alan smithy @alansmithy2010 2020年2月28日
r_takamine if (! conditionA) { return ; }みたいにバラせばネストが深くならず可読性は上がる
1
こんがり @YXLZo0xhqmKWiVx 2020年2月28日
ネタとして扱いやすく抽象化されてたからですかね・・・ class 設計 extends 本ツイ class ネスト extends 本ツイ class 代替 extends 本ツイ
0
alan smithy @alansmithy2010 2020年2月28日
ryunosinfx ウンコとウンコードは似ている。こどもは喜ぶが成長はしない
0
M @kyoryu2020live 2020年2月28日
サムネの図鑑ホントに売って欲しい
0
白鷺 @helsigh 2020年2月28日
tentousho 分業することもなくはないけど一番の問題は引き継ぎです!同じ人が!同じものを延々担当するわけではないので!何やってるかわからないソースにぶちあたるとうあああ!ってなります!誰が見ても恥ずかしいソースにならないように心がけていますが、これがなかなかね…
5
spin_out @spin_over 2020年2月28日
alansmithy2010 業務系だとそもそもDBからのデータ抽出時にオミットするものの話してるでいいんかね。
0
ビーフジャーキー @_beafJerky 2020年2月28日
まとめ方が悪いから逆に炙り出されてちょうどいいんだけど、「これ一関数レベルの綺麗さの話じゃねぇな」ってまずスッと思ってほしいのはちょっとある
23
吉村英崇@もうすぐ定期 _(:3 」∠ )_ @Count_Down_000 2020年2月28日
MinoDriven さま、マトメ作成者です。対応いたしました。遅くなって申し訳ありませんでした
0
IT土方 @s_takepon 2020年2月28日
10年ぐらい前だけどある現場でクラスに組み込んで条件分岐を整理したら読みにくいって駄目出しくらった記憶が・・・ 未だにオブジェクト指向は害悪と言い張る、そういう人たち探せば残ってそう
1
Cook🐿⚡🦜生還しました。後遺症なし!詳細はピン留め @CookDrake 2020年2月28日
CookDrake 書き忘れ。あのときしみじみ、後でメンテする人絡みてわかりやすいフローにするって大事だなって思ったんだ。
1
シロネコ @straypas 2020年2月28日
punimuchiya 新機能追加や機能修正するときに、どれだけ早く修正箇所を特定して書き換えることが出来るかの手法なので。ハイパフォーマンスに対応するのとはまた違うかと。なんか、DDDでパフォーマンスがでないは、そもそも設計の切り方が悪かったとか別の理由もありそうな気がするけど
0
愚民Artane.🦀@日本こそ表現関連の人権の最先端社会。後、コロナは風邪じゃない@経験者は語る @Artanejp 2020年2月28日
ビットマスクでの判定って、ケチケチやるにはいいんだけど、予想外のバグを仕込みやすい…ビット操作した時点でbool型などの別変数を判定ステートように乗っけるようにするのが多いです。
0
ツルギ🍁👒🌹 @TsurugiSaver 2020年2月28日
helsigh 先代がクソソース書いてたら、理由つけて直したくなるよね……(安易に直すと、デバッグがしんどくなるので注意)
0
愚民Artane.🦀@日本こそ表現関連の人権の最先端社会。後、コロナは風邪じゃない@経験者は語る @Artanejp 2020年2月28日
MinoDriven hashは重複が怖いけど、使えるところでは使うといいですよね。速度と「綺麗さ」のバランスが取りやすい。
0
優魚 @e_kuma3 2020年2月28日
ifを隠蔽しろ見せるなって話だと理解したが、なんかコメ欄ではifを使うなって話になってて狂気を感じる。
7
ねや @AriaSub 2020年2月28日
×IF文減らせ △IF文隠せ ○処理分岐を減らせ ◎分岐以外で表現しよう 論外:IF以外の構文や演算で代用 IFが減るのは結果だから、目的じゃないから。
17
たし @punimuchiya 2020年2月28日
straypas 設計の切り方というよりは根本的なRDBとの相性が悪さが原因だと思う。RDBでリポジトリパターンを貫いてパフォーマンス出すのを設計の妙でやるのは結構無理なんじゃないかなぁ。かと言ってOODB使うとなると別方向に拡張性がなくなるし
3
VitzRsTurbo @VitzRsTurbo 2020年2月28日
mtoaki on gotoとon gosub使いまくって、ifのないプログラム書いた事があります。もう遥か昔、高校生の時ですが。
1
VitzRsTurbo @VitzRsTurbo 2020年2月28日
今だとアセンブラと格闘することもあるのでcmp test で条件ジャンプも結構あったり。
3
AB! @AiwasAb 2020年2月28日
プログラムには流派が存在してもおかしくない時代になったんだな C表千家とか
0
ねや @AriaSub 2020年2月28日
具体的に例示しようとすると案外文字数足り無いな でも、せっかく書いたのでぺたり ダメな例 fnc f(obj){ switch(obj.type){ case "tri":print(obj.x*obj.y/2) case "sq":print(obj.x*obj.y) } } cls obj { var type,x,y }
0
ねや @AriaSub 2020年2月28日
んでコレが少しだけマシな例 fnc f(obj){ print(obj.area()) } if obj { var x,y fnc area() } cls tri if obj{ fnc area(){return x*y/2} } cls sq if obj{ fnc area(){return x*y} }
1
prad_bitt @pradbitt42 2020年2月28日
punimuchiya データ設計がうまくできるとKVSでうまく回せると思うけどね。
0
たし @punimuchiya 2020年2月28日
pradbitt42 トランザクション制御をやってくれないから使いどころは限られる気がする
0
しろうと @sirouto 2020年2月28日
「Prolog」という言語で書けば、IF文はゼロで済む……が、そういう構文レベルではなく、設計レベルの話だろう。インターフェイスで抽象化と言ってるし、紹介されてる増田亨氏の書籍もOOP(DDD)の本だ。それを踏まえた上で、「IF文を減らせ」という言い方だと違和感がある。多重ネストは機械的に減らしてもいいが。ドメインに沿った正しい設計をすると、単なる「分類のためのIF」は、ポリモーフィズムに置換され、結果的に「IF文が減る」。つまり、正しく設計すると、変更しやすくなる。それが本筋のOOPだろう。
1
しろうと @sirouto 2020年2月28日
コメ欄やはてブに、「IF文は減らせても、仕様の状態分岐は変わらない(から同じ)」みたいな批判がある。が、これは的外れ。そもそも、IF文の「数」だけではなく、「位置」の問題も大きい。IF文やFOR文のような手続き的な構文は、なるべく下層のレイヤに書き、上層のレイヤはそれを利用する。つまり、上層部は抽象化した設計にする。と、上層部のIF文を減らせるし、「IF文の【変更】回数」が少ないから、変更しやすくなる。この長期的な「変更容易性」がOOPで書くメリット。逆に短期の書き捨てなら、こだわらなくていい。
4
NISHITANI Masaki @nishitani 2020年2月28日
punimuchiya そこを原始的にアプリ設計で頑張るわけよ。ステートレスで冪等なAPIの組み合わせで。
0
ジェイムスン @Jameson_1992 2020年2月28日
リファクタリング対象のコード、妙にif文が多いと思ったら構文以前に場合分けがちゃんとできてなくて実質的に同じ意味の判定を重複してやってるとかあった 根本的な設計をまず考えたほうがいいと思う(そんなレベルの話かは知らない)
0
m232796 @m232796 2020年3月1日
ArtanejpArtanejp それはビットマスクじゃなくてビットフィールドな気がしますが・・・ そのへん使うだけでは条件分岐を減らせるわけじゃないですね。 m232796で書いたマスクってのは「分岐の代わりにマスク変数を作り、if内の処理をマスクにより無効化できる形で外に出す」などを意図してのものです。こんな感じ→ https://ideone.com/qrj6GX 読みにくい・・・
0
しろうと @sirouto 2020年3月4日
[c7450062] 「書ける」というのは、その通りです。が、「懐かしいマイナー言語」だから、Prologはもう用済みとは、私は考えていません。関数型言語のパターンマッチと、Prologの「ユニフィケーション」は違う。Prologは「論理型」なので、「双方向性」を持ちます。足し算の述語で引き算できたりとか。それでなぜ、Prologかといえば、エリックエバンスのDDD本でも言及していたから。DDDはOOPに限らないし(論理型でも可能)、抽象化された上位レイヤーでは、宣言的な記述スタイルが理想。
0
しろうと @sirouto 2020年3月4日
[c7452744] 十年以上前から「これからは関数型の時代」と言われ続けてきたけど、プログラミング言語の人気ランキング上位を見ると、オブジェクト指向のパラダイムが今もほぼ入ってますよね? 「Python」にしろ、「JavaScript」にしろ。「GO」自体は、関数型というより、手続き型言語ですよね。開発者のケントンプソンの意図から、「C/C++」の後継言語だろうし。「技法を取り入れた」といっても、関数型ユーザは、「For文を書きたくない」「関数型の書き方(mapとか)がもっと欲しい」ようだし。
1
たかみん/りんと @r_takamine 2020年3月5日
r_takamine 改めてコメント見にきたらこれにいくつか返信もらってたみたいなんですけど、あの、if文を少なくした方がいいとかそれ以前の問題のやつがあるんですよ^^ っていうのを脊髄反射で書き込んだだけなんですごめんなさい。実際のコードはもっとぐっちゃぐちゃなんで下手に直すこともできないやつなんですお察しください…
0
PentliumEE @7GHz 2020年3月5日
この御子息は前の会社にいたスタティックおじさんをすでに超えてる。
0
しろうと @sirouto 2020年3月7日
[c7462712] ソフトバンクの「ペッパー君」に、Prologが使われてるのも有名な例ですね。あと、関数型言語(の技法)が流行というなら、論理型のPrologも注目されてもいいと思います。というのも、関数型だと参照透過性を維持するために、変数の再代入をするなと言いますが、Prologは「自由変数」なので、そもそも代入すらしません。また、処理の「並列性」は関数型以上にあって、Prologに影響されたErlangが並行処理に強いのは知られています。という訳で、意外と現代でも有用な部分はあります。
0
しろうと @sirouto 2020年3月7日
[c7462853] どこから「OOP」で、どこから「古典的OOP」なのか、その境界が私からよく見えないのですが、要は「C++」の「多重継承」(や継承の多用)が境界線ですか? それならたとえば、「Ruby」もOOP言語で、単一継承かつ「ミックスイン」もあるからいいんですかね? それに、新言語の「Rust」や「Scala」などは、マルチパラダイムでOOPも入っています。Rustがクラスベースじゃなくても、「JavaScript」はプロトタイプベースのOOPなので、OOP自体の否定ではないでしょう。
1
キケリキー @KIKERIKI17 2020年4月29日
今更書くのも何だが、設計レベルできちんと書いた(と設定した)ソースを子供が見たら、言うことは「何やってるかわからない(オブジェクトの設計を知らんから)」の方が先で、「if文すくないねー」じゃないよな。
0
empty @headless4_x 2020年5月3日
if文が少ないけれども、論理式で処理というとんでもなく読みづらいソースは多い
0
マヨイアメ @KeiCwp 2020年5月3日
whileでPCクラッシュさせたことならある……。
0
例のあれ @n_and_a_dad 2020年5月27日
半端な嘘松でイキられてもなあ
2
きゃっつ(Kats)⊿ @grayengineer 2020年5月27日
if文いっさい使わずに全部三項演算子使ってたら笑える
0
下町のOSSAN @SITAMACHI_OYAJI 2020年6月6日
wanwanbawbaw ブラック職場での時限爆弾としてそういうセルを仕込んでおくのもアリかも(笑)。ナイスアイデアです!
0
@wanwanbawbaw 2020年8月3日
SITAMACHI_OYAJI なおその類似セルが1シートに70個埋め込まれています(マクロもあるのでi3第2世代ではクソ重い)
0
結城あすか @pixytale 2020年8月16日
大事なのは構造がわかりやすく、論理をできるだけ単純にすること。つい最近も「if文は関数内に数個まで、三項演算子は禁止」とかいうクソ機械的なコーディング規約見て頭を抱えた。それ以外にもANSI-C以前のC言語の作法を頑なに踏襲してたり、オブジェクト指向の欠片もないような関数規則等でガチガチで、PC叩き壊したくなった。
1
C_CLPS @C_CLPS 2020年9月18日
ゲーマー「一番処理早いやつで」
0
不具合さん @tunagaranaisup 2020年10月15日
switch文をif文で置き換えられるから絶対に実装しないといい出したpythonの悪口はそこまでだ
0
Neruchi @Neruchi4 2020年10月17日
guard, switch, 3項演算で置き換えるみたいな話めっちゃ出るやん。 ちゃうやん。ポリモフィズムでifを減らさなきゃ。
0
アルビレオ@炙りカルビ @albireo_B 2021年1月17日
三項演算子は「データなしだったら0とする」みたいに正常処理とそうじゃないときをまとめるのはいいけど、本質的に分岐処理なので「AだったらXの処理、AじゃなければYの処理」みたいになると「どちらか一方しか実行されない複数の処理を一つの行に書く」ことになるためネストしてなくてもわかりにくくなる。二項目と三項目の両方が「定数や変数をそのまま返すような単純なもの」ではなくなったら避けた方がいいよ
0