はてなキーワード: オブジェクト指向とは
オブジェクト指向とかかっこいい言い方をしても無駄だ。従来の構造化プログラミングから進歩したことなど一つもない。オブジェクト指向がなぜダメであるのか、それを今から話すぜ。
1. データと処理をまとめるという発想。
データと処理をまとめてクラスとして置くという発想がある。しかし、このようなことをしなくとも、モジュールという単位で利用データと処理の集合をまとめればよかったので、クラスを使う必要はない。しかもクラスはインスタンス化のときに、不要な情報まで持ってくるのでメモリ効率が明らかに悪い。コンピュータが進化しているからメモリのことはあまり考える必要がないとはいえ、必要ない処理をまとめて閉じ込めるのは無駄が多い。なぜクラスという名詞で概念分類できると考え始めたのかは不明だが、アルゴリズムとデータ構造という構造化プログラミングの手法を、クラスと型というパラダイムに変換することで型にうるさいC++馬鹿を生み出し、彼らが発狂することになってしまった。しかもデータと処理にわざわざ依存関係を持たせて、変更に対する柔軟性を失わせている。
2. 継承
継承によって既存の構造を持ってこようとする必要性が全く無い。それどころか、継承を使うことによってプログラムがスパゲティ化し、依存関係のグラフがややこしくなってしまう。継承など使わず、必要な情報はスコープの限られた共通の変数、または関数の引数として用意しておけば良い。もしクラスをどうしても使いたければ、共通のインターフェイスをもたせたほうがマシである。インターフェイスを使えば、クラス利用者が意識すべきpublicメソッドがなんであるか把握できる。
3. カプセル化
オブジェクト指向の中で役立つ概念はカプセル化だけである。しかし、カプセル化はクラスなしで構造化プログラミングの方法で実装できる。pythonでは、モジュールの中でアンダースコアから始まる関数を用意しておけば、それがprotectedやprivateと似たように機能させることができる。オブジェクト指向がなぜカプセル化が独自の概念だと言い始めたかは謎。
4. ポリモーフィズム
同じ名前のメソッドを、入力に応じて処理の内容を変える。このようなことはオブジェクト指向などと誇大宣伝をするほどのことでもない。構造化プログラミングで似たようなことができる。
プログラミングをサッカーに喩えると、巷にいるプログラマーは小学生サッカーレベルからJ1レベルの選手まで全部いるんよ
他の人から見たら
だけど普通に会社とかフリーランスとかでドヤ顔でプログラマーとして働いてるわけ
面接でそれを見抜くのはそれなりの能力を持った人、つまりはスカウトじゃないと無理なので小学生レベルでも普通に採用される
その結果リフティングしかできないやつがJ3のチームに普通に所属してしまう
小学生の昼休みサッカーでそこそこ上手いって言われてるレベルなのにJ3の試合に出てくるっていう地獄ね
いざ試合になってボールが回ってきたらリフティングばっかしてて、いきなり敵にパスするみたいなことを平気でやって
「パスミスはしょーがないでしょ」
具体的に言うとオブジェクト指向を理解できてない状態でTypeScriptでanyを連発してバグだらけのクソコードを量産しておいて
とか言うくせに
「別にオブジェクト指向で書く必要はないけれど、だったらどこでメンテナンス性と堅牢性を担保してるのか教えて?」
って言うとフガフガ言いながら逃げるっていうね
でもガチのCSを勉強しようと思ったらアルゴリズムとデータ構造は必須で、それに適した言語となるとC以下あれやこれやでしょ。
あと、デザイン・レシピとかいう考え方なら OCaml とかの関数型言語が入門に適しているし、オブジェクト指向ならCじゃ無理だし。
時は金なりという意味か?
public class Person { BasicInfo info; float stock; float Value; public string Name(bool isSpy){ return isSpy ? info.Name : info.Name.ToSecondName(); } public string Sex(bool isNormal){ return isNormal == info.isMan ? "Man" : "Woman"; } public float Earn(bool isExtra = false){ float sexPad = info.isMan ? 1f : 0.5f; float racePad = info.isWhite ? 1f : 0.5f; var delta = DateTime.Now - info.Birth; int age = (int)(delta.TotalDays / 365); float result = Value * sexPad * racePad * age; if(isExtra){ Value += result; } return result; } enum Race{ White, Black, Yellow }; class BasicInfo{ public string Name; public int NationalId; public bool isWhite; public bool isMan; public DateTime Birth; public BasicInfo(string Name, int NationalId, Race race, bool isMan){ this.Name = Name; this.NationalId = NationalId; this.isWhite = race == Race.White; this.isMan = isMan; Birth = DateTime.Now; } }
一線級のプロになれるとは思わない方がいい
そんで巷に溢れてるドヤ顔するプログラマーも9割が草野球レベルなんよ
コードレビューしてみたらびっくりするレベルのコード書いてるのに
本人はやたら自信満々でコメントに対しても
「これでは何故ダメですか?」
とか言ってくるの勘弁してくれ
必ずしもオブジェクト指向で書く必要はないけれどオブジェクト指向が何を目指しているかは理解してくれ
パッと見た感じはちゃんとしてるように見えるけれどプロでは全然通用しないレベルなんよ
草野球でめっちゃ上手い人って素人が見るとプロでも通用しそうだけど
実際にはそんな訳ないし、プロはもっとレベルが高いところで競ってるんよ
20年ぐらいプログラミングやってるっていう40代の人とペアプロしてるんだけど
変数はほとんどがグローバル的な扱いで独自の命名規則で宣言しるし
その命名規則も全然守られてないしスペルミスも多くて読んでてイライラしてくる
根本的な作り方が無茶苦茶でちゃんと動いてるのかバグがあるのかも分からん状態
PR出てくる度に打ち合わせして、そもそものデータ構造とか機能分割について指摘してるんだけど
この前ふと
「そういやJavaで書いたことありますか?Javaだとこんな感じですよね」
って話したらJava知らんと言われた
で、聞いてみたらオブジェクト指向言語で書いたことないし勉強したことも無いとのこと
JavaなりC++なりオブジェクト指向言語で書ける必要は無いけれど
オブジェクト指向まるっきりわかってなさそうで草
ソフトウエア・ウェア開発者で、こんなことを言うとアンタッチャブルにされるような発言を教えてください。個人的には、以下の感じかな?
こんな感じかな。
結晶の構造みたいなもの。リスト構造とか種類があるが、元素のように新規に人類が新規に発見するのは困難になりつつある。
【アルゴリズム】
たとえば黒鉛は炭素の同位体であるダイヤモンドに変換できる可能性があるが、その変更プロセスは多種多様である。コストやエネルギー効率のためにベストな方法をチョイスされるように、計算量という律速段階のようなもので比較される。
1mol が 6.0e23 個の原子と同じように、1バイトは8ビットである。バイトにするメリットは、英語圏だと 1バイトも有れば日常で使う文字はコンプリートできるのだ。
計算機で使われる浮動小数点数は実は実数ではない。たとえば、0.4f - 0.3f は 0.1f でない。ただし、0.5f - 0.25f は 0.25f である。
【オブジェクト指向】
フッ素分子(F2)を作ろうとした努力をプログラミングでもやろうとしたもの。
【アスペクト指向】
ポインターをインターセプトするための道具。電気泳動するためのツール。
【オライリー】
【インフルエンサー】
錬金術師(対価はカモの財布)
【JAVA】
【Ruby】
Al2O3。
【Perl】
Pearl でない。
でもさ、未だに Python2 しか書けない残念なアラフィフもいるのさ。EOL 来ていても中途半端に需要もあるせいか、引退時期を間違えるやつも多いのがこの業界の悪いところなんだよ。そいつさ、未だに Private な関数の書き方がわかんないみたいだし、is とか使うのだぜ?オブジェクト指向とかいうレベルでないし、引数の型を指定する意味とかも「めんどくさいよね」とか言って勉強しないんだよ。はっきり言って、消えてほしい。だから、ほんとうは勉強しないと消えざるを得ない世界のがまともなんだよ。おそらく彼は3年以内には仕事がなくなるだろうけど、年金をもらえるまで20年ぐらい無職かもしれない。リカレント教育とかも、年齢制限あるからな。コンバートは早めにだな。
1. C++はプログラミング言語として有名であり、ブラのカップ数をC++と表記することで、テクノロジーに精通していることをアピールできる。
2. C++はCよりも高度な機能を持っており、ブラのカップ数をC++と表記することで、自分のバストの質や機能性を高めることができる。
3. C++はオブジェクト指向プログラミングをサポートしており、ブラのカップ数をC++と表記することで、自分のバストをオブジェクトとして扱うことができる。オブジェクト指向プログラミングでは、オブジェクトに属性やメソッドを持たせることができるので、自分のバストにも色や形や大きさなどの属性や、揺れるや揉むや吸うなどのメソッドを持たせることができる。
4. C++は多重継承をサポートしており、ブラのカップ数をC++と表記することで、自分のバストを複数のクラスから継承することができる。多重継承では、複数のクラスの特徴や機能を組み合わせることができるので、自分のバストにも様々な特徴や機能を組み合わせることができる。例えば、自分のバストを芸能人やアニメキャラクターなどのクラスから継承することで、その人物やキャラクターのバストに似せることができる。
5. C++はテンプレートをサポートしており、ブラのカップ数をC++と表記することで、自分のバストをテンプレート化することができる。テンプレートでは、型や値などのパラメータを指定することで、汎用的なコードを生成することができるので、自分のバストにも型や値などのパラメータを指定することで、汎用的なバストを生成することができる。例えば、自分のバストをint型やdouble型などの型に指定することで、整数や小数などの値に変換することができる。
6. C++は例外処理をサポートしており、ブラのカップ数をC++と表記することで、自分のバストに発生する可能性のある例外に対処することができる。例外処理では、エラーや異常などの例外が発生した場合に、適切な処理を行うことができるので、自分のバストにもエラーや異常などの例外が発生した場合に、適切な処理を行うことができる。例えば、自分のバストが垂れたり痛んだりした場合に、修正したり治療したりする処理を行うことができる。