X



なぜ「staticおじさん」は叩かれたのか?
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2019/02/08(金) 15:18:48.58ID:pS5scTjj
staticおじさん(読み:すたてぃっくおじさん)とは、2010年に@ITに「実はオブジェクト指向ってしっくりこないんです![1]」
と投稿して炎上したおじさんのことである。

staticおじさんが爆誕した2010年ごろのIT土方界隈ではJavaを中心としたオブジェクト指向が主流であり
「なんでもかんでもオブジェクト指向」という風潮があった。

このためstaticおじさんは多勢に無勢でボロクソに叩かれる結果となり、さらにはプログラミングそのものの
話を飛び出してオブジェクト指向推進派による学歴差別などに発展したすえに無事炎上した。

それからわずか数年後、staticおじさんの主張に「極力static変数は使わない」「関数ポインタを多用する」
というコーディング規約を加えた「関数型プログラミング」がJavaScript界隈を中心に爆発的に流行し、
その流れに乗るかたちでこれら規約を半ば強制する仕様の「関数型プログラミング言語」も多数登場するなど
世界的に一大ブームになった。

ちなみにstaticおじさんの主張と非常に酷似したものが、staticおじさんの登場より遥か昔、インターネットを
支える中核技術である「IP」のRFC(仕様書)にも「階層化の有害性」として書かれていたりする。
また、海外でも同様の主張を面白おかしく書いた「Bjarne Stroustrup インタビュー」なる怪文書が出回り、
こちらも大炎上した。

https://monobook.org/wiki/%E3%82%B9%E3%82%BF%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E3%81%8A%E3%81%98%E3%81%95%E3%82%93
0004デフォルトの名無しさん
垢版 |
2019/02/08(金) 15:25:03.48ID:W/Hntm+n
staticおじさんの主張と関数型プログラミングは全く関係ない
関数型プログラミングはstatic変数なんか使わない
0006デフォルトの名無しさん
垢版 |
2019/02/08(金) 15:35:53.11ID:a1Tp9aO/
>>4
それは純粋関数型
0007デフォルトの名無しさん
垢版 |
2019/02/08(金) 15:36:51.43ID:QZ4Uj/ZC
あの時期はjavaもそうだがrubyも悪い
0009デフォルトの名無しさん
垢版 |
2019/02/08(金) 15:38:40.76ID:rNz0EA76
VBまでオブジェクト指向になってたからな。
底辺はそれが正しいと洗脳されてた。
0011デフォルトの名無しさん
垢版 |
2019/02/08(金) 15:39:58.76ID:VPgD7UHh
いまでも関数型が理解できない奴が大半でTypeScriptみたいなトランスコード言語が次々出てきてるからな
0012デフォルトの名無しさん
垢版 |
2019/02/08(金) 15:40:51.42ID:SGtVqYU9
@ITまわりは高学歴しか自慢できることが無い奴ばかりだったのが問題
0013デフォルトの名無しさん
垢版 |
2019/02/08(金) 15:53:40.70ID:XuHrBl4g
あれ完全に洗脳だよな
0015デフォルトの名無しさん
垢版 |
2019/02/08(金) 18:39:16.63ID:W/Hntm+n
>>6
だからなに?

> staticおじさんの主張と関数型プログラミングは全く関係ない
> 関数型プログラミングはstatic変数なんか使わない

この2つに対して、なにか否定したいなら
その理由を言えば?
0016デフォルトの名無しさん
垢版 |
2019/02/08(金) 18:39:54.29ID:W/Hntm+n
>>5
> リーダブルコードにも極力staticにした方がいいって書いてあったな
書いてないよ。
0018デフォルトの名無しさん
垢版 |
2019/02/08(金) 19:21:27.21ID:wNOXgeyf
>>16
うっかり騙されるとこやったわ。
0019デフォルトの名無しさん
垢版 |
2019/02/08(金) 21:28:02.60ID:g73JWU9E
static女子高生なら叩かれなかった。諸悪の根源は彼がおじさんだったことであって彼の主張自体は何の間違いもない。
0021デフォルトの名無しさん
垢版 |
2019/02/08(金) 23:43:27.29ID:g73JWU9E
>>16
make as many methods static as possible.
0024デフォルトの名無しさん
垢版 |
2019/02/09(土) 00:12:10.95ID:1GMUh/vL
オブジェクト指向おじさんはIDEないと追うのが絶望的なソースにしまくるからタチが悪い
0025デフォルトの名無しさん
垢版 |
2019/02/09(土) 00:28:00.76ID:O4yJeWlE
オブジェクト指向3本柱マンのうちカプセル化が最も有害だと思う。
取りうる状態の組み合わせ爆発でまともな動作保証なんて出来ないだろ。
0027デフォルトの名無しさん
垢版 |
2019/02/09(土) 01:01:16.24ID:qNFZDICU
そもそも関数型言語という言い方も誤解を招く要因
関数を型として扱えますよ何言ってんのと返されるだけ
0028デフォルトの名無しさん
垢版 |
2019/02/09(土) 01:19:36.90ID:wvYgqGa/
>>27
0030デフォルトの名無しさん
垢版 |
2019/02/09(土) 07:09:44.77ID:EhJ/kkED
>>27
正確には関数を型安全な値として扱えますよ
0031デフォルトの名無しさん
垢版 |
2019/02/09(土) 08:02:23.63ID:NDas405z
>>25
「階層化の有害性」ってやつだな
0033デフォルトの名無しさん
垢版 |
2019/02/09(土) 22:22:51.11ID:zy9w8qc8
staticおじさんは叩かれるけどDIでシングルトン保持するのは許される風潮があるよね
0039デフォルトの名無しさん
垢版 |
2019/02/10(日) 09:58:53.14ID:ALObnpoM
おれあんまりこだわりないよ。
メソッドの先頭で全変数宣言
宣言した変数は直ちに初期値を代入
中途return禁止
ぐらいかな
0041デフォルトの名無しさん
垢版 |
2019/02/10(日) 11:35:02.24ID:Ix0Ul5tp
中途return禁止とか言ってる奴はだいたい手段と目的を履き違えている
わざわざフラグ立てるくらいなら中途returnの方がマシ
中途returnが良くないと言われるのは処理順に依存した状態を持っていることになるからで、その代わりにフラグを使っても何も解決しない
0043デフォルトの名無しさん
垢版 |
2019/02/10(日) 11:55:13.97ID:LJxziodv
関数抜けるときの必須処理が多い場合は中途リターンせずにgoto使って、それ以外は中途リターンかな。
0046デフォルトの名無しさん
垢版 |
2019/02/10(日) 12:19:54.47ID:Q/s8Bwot
実装できないことはないだろうけど再帰使った方がはるかに見通しが良くなるケースは多々あるだろうな
0047デフォルトの名無しさん
垢版 |
2019/02/10(日) 12:26:47.02ID:O8DkeQeo
あるフォルダ以下のフォルダ、ファイルを一覧表示とか再帰が便利だけどな
無くても余裕で作れるけど
0048デフォルトの名無しさん
垢版 |
2019/02/10(日) 12:28:37.10ID:rK2pFdNZ
再帰使ったことないな。どんな時に使いたくなる?
呼び出し側で管理できるようにして繰り返し呼ぶ方がコードから処理がイメージしやすくていい気がするんだが。
まあコード量が少なくなるのと謎の美しさは感じるけど。
0051デフォルトの名無しさん
垢版 |
2019/02/10(日) 12:31:26.00ID:cscIJSF5
末尾再起最適化を言語が保証してるのは前提として、いちいち末尾再起にするためにガチャガチャ汚ならしく変形するのが無常過ぎる。
例えばフィボナッチなんかは普通に再起書けば定義がそのまま動いているようでとても美しい。
メモ化入れてもそこまで汚くはならない。
しかし末尾再起のために変形すると一気に定義から離れる。
読むとき頭で変換しながら読むことになる。
ちっとも美しくない。
それなら最初からループで書いたほうが万が一にもスタック溢れないんだからいいわ。
0054デフォルトの名無しさん
垢版 |
2019/02/10(日) 12:40:20.34ID:Q/s8Bwot
この再帰の話、全員が想定してる言語や状況が違いすぎて絶対に話がまとまらないやつだなw
0057デフォルトの名無しさん
垢版 |
2019/02/10(日) 13:33:45.38ID:n6QJeawT
再帰は階層構造を扱う時はほぼ必須だと思うけど、逆にそれ以外の用途はあまり思いつかない
0059デフォルトの名無しさん
垢版 |
2019/02/10(日) 14:53:51.09ID:BEjmBSJ8
ループは再帰の糖衣構文だから何でも再帰で書けるんだけど
再帰構造を扱うとき以外は普通にループしたほうがいい、ってかそうでないと糖衣に包んだ意味がない
0060デフォルトの名無しさん
垢版 |
2019/02/10(日) 15:05:17.60ID:tULdsfrx
>>51
それすごくわかる
末尾再帰のために人間が頑張るのは違うと思う
0063デフォルトの名無しさん
垢版 |
2019/02/10(日) 18:43:05.58ID:h0ljrL+B
1. ループは速い
2. 再帰にすると遅い
3. 末尾再帰になっていて処理系が対応していれば、
内部的にループに変換するので1と同じ速度になる
0065デフォルトの名無しさん
垢版 |
2019/02/11(月) 10:51:41.00ID:vMTyjZUq
データ構造そのものが再帰構造になってるなら大人しく再帰を使う
せっかく階層を持ってるのに全部並列に並べてループ回してたら余計なコードが死ぬほど増えて何もいいことない
それ以外で使ったことはないし使おうと思ったこともない
0066デフォルトの名無しさん
垢版 |
2019/02/11(月) 12:10:58.33ID:27p6nxD6
別にデータ構造に振り回される必要ないと思うけどな。ループで処理した方が見通しよければそれでいい。まあコードが死ぬほど増えるなら避けた方がいいだろうけど。
0067デフォルトの名無しさん
垢版 |
2019/02/11(月) 12:57:42.78ID:yN+iMh1T
データ構造に振り回される
0068デフォルトの名無しさん
垢版 |
2019/02/11(月) 12:58:12.86ID:yN+iMh1T
www
0072デフォルトの名無しさん
垢版 |
2019/02/11(月) 14:11:53.79ID:K/18SmCD
別に一般的な意見では?以下関数プログラミング実践入門より引用:

再帰関数は、物事を数学的に捉えた定義通りに書けることが多いためわかりやすいのですが、Haskellに慣れてくると直接的に再帰関数を書くのは避けるようになっていきます。
それは、再帰関数は便利であるのと同じくらい、危険でもあるからです。
停止しない再帰関数をうっかり書いてしまうこともあるでしょう。

とくに再帰関数を直接書くということは、時に必要となるものの、アセンブラを直接書くような低級な行為と認識されます。
データの構造に依存し、それを気にしたプログラミングを要求されるからです。
理想的にはデータの構造を気にせずに、全体に丸々変換をかけられるような関数だけを組み合わせて望む処理を書きたいのです。

そのために、再帰関数を直接利用せずにどうするかというと、次節で説明する高階関数をうまく利用するようになっていきます。

リストなど多くの再帰的に定義されたデータ構造に対しては、それを便利に利用するための計算パターンが用意されており、それらの計算パターンは高階関数として与えられています。
自分で再帰を書くのではなく、再帰部分は高階関数がやってくれるようになっています。
0073デフォルトの名無しさん
垢版 |
2019/02/11(月) 14:30:20.19ID:vMTyjZUq
そもそもこのスレではみんなの想定する「再帰」という言葉の定義からして違いそうなのは伝わってくる
0076デフォルトの名無しさん
垢版 |
2019/02/11(月) 16:08:34.92ID:wLhY3x2i
>>72
これも当てはまる

ループ処理は、物事を数学的に捉えた定義通りに書けることが多いためわかりやすいのですが、Haskellに慣れてくると直接的にループ処理を書くのは避けるようになっていきます。
それは、ループ処理は便利であるのと同じくらい、危険でもあるからです。
停止しないループ処理をうっかり書いてしまうこともあるでしょう。

とくにループ処理を直接書くということは、時に必要となるものの、アセンブラを直接書くような低級な行為と認識されます。
データの構造に依存し、それを気にしたプログラミングを要求されるからです。
理想的にはデータの構造を気にせずに、全体に丸々変換をかけられるような関数だけを組み合わせて望む処理を書きたいのです。

そのために、ループ処理を直接利用せずにどうするかというと、次節で説明する高階関数をうまく利用するようになっていきます。

リストなど多くのループ処理に定義されたデータ構造に対しては、それを便利に利用するための計算パターンが用意されており、それらの計算パターンは高階関数として与えられています。
自分でループを書くのではなく、ループは高階関数がやってくれるようになっています。
0077デフォルトの名無しさん
垢版 |
2019/02/11(月) 16:33:22.35ID:K/18SmCD
>>76
雑すぎる…
> ループ処理は、物事を数学的に捉えた定義通りに書けることが多いため

数学の教科書読み直せw

> Haskellに慣れてくると直接的にループ処理を書くのは避けるようになっていきます。

Haskellはそもそもループ書けないぞw
0078デフォルトの名無しさん
垢版 |
2019/02/11(月) 18:40:51.77ID:iZFjFd14
再帰する関数の定義がばっちりと決まってて動かしようがないならそっちに吸い寄せられて書くけど
漏れがありそうな場合は再帰は使わない

普通のAPIで仕様的に再帰とは指定されてこないしね…(来たら死ねと思うわ)
0079デフォルトの名無しさん
垢版 |
2019/02/12(火) 01:14:01.84ID:aNPhUqtm
関数型なんかは結局書ける奴が少ない
それでは業務はこなしきれない
それが解らない奴はただのアホです
自分は凄い事が出来ますよ〜
って自慢したいだけ
0081デフォルトの名無しさん
垢版 |
2019/02/12(火) 01:29:37.44ID:xM7yD0R2
そんなことないだろ。別に数学のすごい理論完璧に把握してなきゃ関数型書けないって訳でもないし。
OOP真理教の経典暗記のほうがよほど辛い。
慣れてないだけ。難しいと思い込んでるだけ。
0082デフォルトの名無しさん
垢版 |
2019/02/12(火) 10:14:15.57ID:1dJfHHkV
ネタにマジレスかもしれないが、
未だにこんなこと言ってるバカいるんだな。
今、誰でも名前知ってる大企業から受託案件受けてるけど、
一番チェックされるのは「オブジェクト指向設計になっているか」だぞ。

上でも出てるけど、staticおじさんの主張と関数型言語は何の関係もない。
関数型言語の本質は参照透過性。
「public static宣言した共有変数」なんて、
参照透過性を妨げる最たるものだろwww
0083デフォルトの名無しさん
垢版 |
2019/02/12(火) 10:26:36.21ID:wp1a6nq7
そのオブジェクト指向もできないのが多すぎるから問題なんだよな
オブジェクトが分かってないからデザインパターンなんてもんも理解できるわけもない
つまり話は巡り巡ってstaticおじさんにたどり着くわけだ
オブジェクト指向もできなければ関数型でもないただのウンコード量産機がstaticおじさん
0084デフォルトの名無しさん
垢版 |
2019/02/12(火) 12:36:54.43ID:NT60/ZFg
でもこのstaticおじさん順調に出世して今では大手の本部長だかCTOだかなんでしょ?
0086デフォルトの名無しさん
垢版 |
2019/02/12(火) 13:06:24.87ID:eC1lEXzI
高階関数なんてありふれてるだろ。
それを偉そうにとは?
使ったことないの?
0087デフォルトの名無しさん
垢版 |
2019/02/12(火) 13:12:41.50ID:1MzWJDZP
プログラミングは経験つめば抽象的な概念を使って具体的な整理がしっかりできる世界だろ。
0090デフォルトの名無しさん
垢版 |
2019/02/12(火) 17:08:04.63ID:wp1a6nq7
>>84 出世するためにプログラミングしてるの?
だとしたら手段と目的を履き違えてるよ
そうでないのなら「出世するプログラム」でも書いて世の中に出したら良いw
0094デフォルトの名無しさん
垢版 |
2019/02/12(火) 20:04:05.06ID:g6CslLMJ
テストコードちゃんと書く奴ならstatic変数もオブジェクト指向も
ある点で問題あることは理解できるもんだが。
そういう意味では関数型のが有害性は低いか。
たまに何でもかんでも再帰で書こうとして逆に可読性低くする馬鹿もいるが。
0096デフォルトの名無しさん
垢版 |
2019/02/13(水) 01:37:44.19ID:WxhWOV7/
さんざんメソッド移動して最後のメソッドでreturnだけして値返すだけなのにたどり着くと殺意が湧く
0098デフォルトの名無しさん
垢版 |
2019/02/13(水) 01:47:04.99ID:wIurVPBj
関数型の話をすると
関数書けない言語なんてあるんですかねと返されたことを思い出す
0100>>82
垢版 |
2019/02/13(水) 22:33:19.44ID:1YO06rir
>>83
ま、その通りだよな。
「public static宣言した共有変数」なんて、
オブジェクト間のメッセージパッシングができないアホ
(別名「オブジェクト指向もできなければ関数型でもないただのウンコード量産機」)
が頼ろうとする手段の最たるものだからな。
0101デフォルトの名無しさん
垢版 |
2019/02/14(木) 07:14:01.74ID:zYy89We+
また今日もValueHolderモデル使わないで直にget/setやるうんこちゃんと仲良くコード書かなきゃ
はぁまじはぁ
■ このスレッドは過去ログ倉庫に格納されています

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