なぜ「staticおじさん」は叩かれたのか?
■ このスレッドは過去ログ倉庫に格納されています
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 staticおじさんの主張と関数型プログラミングは全く関係ない
関数型プログラミングはstatic変数なんか使わない リーダブルコードにも極力staticにした方がいいって書いてあったな VBまでオブジェクト指向になってたからな。
底辺はそれが正しいと洗脳されてた。 いまでも関数型が理解できない奴が大半でTypeScriptみたいなトランスコード言語が次々出てきてるからな @ITまわりは高学歴しか自慢できることが無い奴ばかりだったのが問題 >>6
だからなに?
> staticおじさんの主張と関数型プログラミングは全く関係ない
> 関数型プログラミングはstatic変数なんか使わない
この2つに対して、なにか否定したいなら
その理由を言えば? >>5
> リーダブルコードにも極力staticにした方がいいって書いてあったな
書いてないよ。 static女子高生なら叩かれなかった。諸悪の根源は彼がおじさんだったことであって彼の主張自体は何の間違いもない。 >>16
make as many methods static as possible. >>17
ハロワすらオブジェクト指向で書こうとするからな オブジェクト指向おじさんはIDEないと追うのが絶望的なソースにしまくるからタチが悪い オブジェクト指向3本柱マンのうちカプセル化が最も有害だと思う。
取りうる状態の組み合わせ爆発でまともな動作保証なんて出来ないだろ。 そもそも関数型言語という言い方も誤解を招く要因
関数を型として扱えますよ何言ってんのと返されるだけ >>27
正確には関数を型安全な値として扱えますよ staticおじさんは叩かれるけどDIでシングルトン保持するのは許される風潮があるよね そりゃstaticにしないためのシングルトンだからな Staticおじさんの言ってることと関数型言語はだいぶ違うと思うけど プログラミング手法そのものにこだわりがある人はダメ。めんどくさい。 おれあんまりこだわりないよ。
メソッドの先頭で全変数宣言
宣言した変数は直ちに初期値を代入
中途return禁止
ぐらいかな >>39
中途return禁止ってアーリーリターンも出来ないってこと? 中途return禁止とか言ってる奴はだいたい手段と目的を履き違えている
わざわざフラグ立てるくらいなら中途returnの方がマシ
中途returnが良くないと言われるのは処理順に依存した状態を持っていることになるからで、その代わりにフラグを使っても何も解決しない 前の会社は中途return禁止に再帰も禁止だった
めんどくさかったわ 関数抜けるときの必須処理が多い場合は中途リターンせずにgoto使って、それ以外は中途リターンかな。 >>42
再帰禁止って、下手したら実装できないアルゴリズムとかあるんじゃないの 実装できないことはないだろうけど再帰使った方がはるかに見通しが良くなるケースは多々あるだろうな あるフォルダ以下のフォルダ、ファイルを一覧表示とか再帰が便利だけどな
無くても余裕で作れるけど 再帰使ったことないな。どんな時に使いたくなる?
呼び出し側で管理できるようにして繰り返し呼ぶ方がコードから処理がイメージしやすくていい気がするんだが。
まあコード量が少なくなるのと謎の美しさは感じるけど。 >>48
階層の深さが可変のツリー構造になってるデータを探索する時とかに使う 末尾再起最適化を言語が保証してるのは前提として、いちいち末尾再起にするためにガチャガチャ汚ならしく変形するのが無常過ぎる。
例えばフィボナッチなんかは普通に再起書けば定義がそのまま動いているようでとても美しい。
メモ化入れてもそこまで汚くはならない。
しかし末尾再起のために変形すると一気に定義から離れる。
読むとき頭で変換しながら読むことになる。
ちっとも美しくない。
それなら最初からループで書いたほうが万が一にもスタック溢れないんだからいいわ。 この再帰の話、全員が想定してる言語や状況が違いすぎて絶対に話がまとまらないやつだなw 再帰は階層構造を扱う時はほぼ必須だと思うけど、逆にそれ以外の用途はあまり思いつかない ループは再帰の糖衣構文だから何でも再帰で書けるんだけど
再帰構造を扱うとき以外は普通にループしたほうがいい、ってかそうでないと糖衣に包んだ意味がない >>51
それすごくわかる
末尾再帰のために人間が頑張るのは違うと思う フィボナッチで再帰は安直でマシンパワーの無駄使いの見本
ループでヤレ スマホのこのクソIME 再帰くらい変換しろやクソッ!候補にも出てこんぞ! 1. ループは速い
2. 再帰にすると遅い
3. 末尾再帰になっていて処理系が対応していれば、
内部的にループに変換するので1と同じ速度になる データ構造そのものが再帰構造になってるなら大人しく再帰を使う
せっかく階層を持ってるのに全部並列に並べてループ回してたら余計なコードが死ぬほど増えて何もいいことない
それ以外で使ったことはないし使おうと思ったこともない 別にデータ構造に振り回される必要ないと思うけどな。ループで処理した方が見通しよければそれでいい。まあコードが死ぬほど増えるなら避けた方がいいだろうけど。 別に一般的な意見では?以下関数プログラミング実践入門より引用:
再帰関数は、物事を数学的に捉えた定義通りに書けることが多いためわかりやすいのですが、Haskellに慣れてくると直接的に再帰関数を書くのは避けるようになっていきます。
それは、再帰関数は便利であるのと同じくらい、危険でもあるからです。
停止しない再帰関数をうっかり書いてしまうこともあるでしょう。
とくに再帰関数を直接書くということは、時に必要となるものの、アセンブラを直接書くような低級な行為と認識されます。
データの構造に依存し、それを気にしたプログラミングを要求されるからです。
理想的にはデータの構造を気にせずに、全体に丸々変換をかけられるような関数だけを組み合わせて望む処理を書きたいのです。
そのために、再帰関数を直接利用せずにどうするかというと、次節で説明する高階関数をうまく利用するようになっていきます。
リストなど多くの再帰的に定義されたデータ構造に対しては、それを便利に利用するための計算パターンが用意されており、それらの計算パターンは高階関数として与えられています。
自分で再帰を書くのではなく、再帰部分は高階関数がやってくれるようになっています。 そもそもこのスレではみんなの想定する「再帰」という言葉の定義からして違いそうなのは伝わってくる 永遠に噛み合わない水掛け論やってないでStaticおじさんの話をしてやれよ >>72
これも当てはまる
ループ処理は、物事を数学的に捉えた定義通りに書けることが多いためわかりやすいのですが、Haskellに慣れてくると直接的にループ処理を書くのは避けるようになっていきます。
それは、ループ処理は便利であるのと同じくらい、危険でもあるからです。
停止しないループ処理をうっかり書いてしまうこともあるでしょう。
とくにループ処理を直接書くということは、時に必要となるものの、アセンブラを直接書くような低級な行為と認識されます。
データの構造に依存し、それを気にしたプログラミングを要求されるからです。
理想的にはデータの構造を気にせずに、全体に丸々変換をかけられるような関数だけを組み合わせて望む処理を書きたいのです。
そのために、ループ処理を直接利用せずにどうするかというと、次節で説明する高階関数をうまく利用するようになっていきます。
リストなど多くのループ処理に定義されたデータ構造に対しては、それを便利に利用するための計算パターンが用意されており、それらの計算パターンは高階関数として与えられています。
自分でループを書くのではなく、ループは高階関数がやってくれるようになっています。 >>76
雑すぎる…
> ループ処理は、物事を数学的に捉えた定義通りに書けることが多いため
数学の教科書読み直せw
> Haskellに慣れてくると直接的にループ処理を書くのは避けるようになっていきます。
Haskellはそもそもループ書けないぞw 再帰する関数の定義がばっちりと決まってて動かしようがないならそっちに吸い寄せられて書くけど
漏れがありそうな場合は再帰は使わない
普通のAPIで仕様的に再帰とは指定されてこないしね…(来たら死ねと思うわ) 関数型なんかは結局書ける奴が少ない
それでは業務はこなしきれない
それが解らない奴はただのアホです
自分は凄い事が出来ますよ〜
って自慢したいだけ そんなことないだろ。別に数学のすごい理論完璧に把握してなきゃ関数型書けないって訳でもないし。
OOP真理教の経典暗記のほうがよほど辛い。
慣れてないだけ。難しいと思い込んでるだけ。 ネタにマジレスかもしれないが、
未だにこんなこと言ってるバカいるんだな。
今、誰でも名前知ってる大企業から受託案件受けてるけど、
一番チェックされるのは「オブジェクト指向設計になっているか」だぞ。
上でも出てるけど、staticおじさんの主張と関数型言語は何の関係もない。
関数型言語の本質は参照透過性。
「public static宣言した共有変数」なんて、
参照透過性を妨げる最たるものだろwww そのオブジェクト指向もできないのが多すぎるから問題なんだよな
オブジェクトが分かってないからデザインパターンなんてもんも理解できるわけもない
つまり話は巡り巡ってstaticおじさんにたどり着くわけだ
オブジェクト指向もできなければ関数型でもないただのウンコード量産機がstaticおじさん でもこのstaticおじさん順調に出世して今では大手の本部長だかCTOだかなんでしょ? 高階関数って偉そうに言ってるけど具体例出さない時点でエアプだろw 高階関数なんてありふれてるだろ。
それを偉そうにとは?
使ったことないの? プログラミングは経験つめば抽象的な概念を使って具体的な整理がしっかりできる世界だろ。 >>84 出世するためにプログラミングしてるの?
だとしたら手段と目的を履き違えてるよ
そうでないのなら「出世するプログラム」でも書いて世の中に出したら良いw >>90
落ち着け。その解釈はメモリ破壊系のバグが発生してる可能性高い。 >>91
等価じゃないものを等価と判定してるから、そこら辺のロジックにバグがありそうだな テストコードちゃんと書く奴ならstatic変数もオブジェクト指向も
ある点で問題あることは理解できるもんだが。
そういう意味では関数型のが有害性は低いか。
たまに何でもかんでも再帰で書こうとして逆に可読性低くする馬鹿もいるが。 なんだかんだ出世高給取りのstaticおじさん勝ち組だわ さんざんメソッド移動して最後のメソッドでreturnだけして値返すだけなのにたどり着くと殺意が湧く 関数型の話をすると
関数書けない言語なんてあるんですかねと返されたことを思い出す >>83
ま、その通りだよな。
「public static宣言した共有変数」なんて、
オブジェクト間のメッセージパッシングができないアホ
(別名「オブジェクト指向もできなければ関数型でもないただのウンコード量産機」)
が頼ろうとする手段の最たるものだからな。 また今日もValueHolderモデル使わないで直にget/setやるうんこちゃんと仲良くコード書かなきゃ
はぁまじはぁ ■ このスレッドは過去ログ倉庫に格納されています