オブジェクト指向ってクソじゃねぇかよPart4
■ このスレッドは過去ログ倉庫に格納されています
無理やりオブジェクト指向にしたから出てきた問題を解決して凄い凄い言ってるだけ。 単なるマッチポンプ。 カプセル化(英語:encapsulation)とは、オブジェクト指向を構成する概念の一つで、 オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、 オブジェクトの実際の型を隠蔽したりすることをいう。 偏差値の低い学校向けの情報処理系教科書において「大変すばらしいものであり絶対に使うように」と大体的に宣伝された。 一方、カリフォルニア大学バークレー校の有識者を中心としたインターネットを作った人たちは「階層化の有害性」として 「絶対に使うな」としている。大雑把にいうと、その時は良くても、将来的な改修の際に隠蔽されたデータに アクセスできないと解決できない問題が出てきて、結果的にデスマーチに陥るというのである。 オブジェクト指向の発案者であるアラン・ケイもコーディング規約(頭文字にアンダースコアを付けるなどの命名規則)で 縛る程度にすることを推奨しており、アラン・ケイが関わったオブジェクト指向プログラミング言語にはどれも「private」 という概念はない。 https://monobook.org/wiki/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96 前前前スレ オブジェクト指向ってクソじゃね? https://mevius.5ch.net/test/read.cgi/tech/1535085129/ 前前スレ オブジェクト指向ってクソじゃねぇよ? Part2 https://mevius.5ch.net/test/read.cgi/tech/1539872441/ 前スレ オブジェクト指向ってクソじゃねぇかよPart3 https://mevius.5ch.net/test/read.cgi/tech/1542884872/ >>264 何を買おうとしてんだ? 出版社から買うと送料かかるだろ? >>265 >>153 >>147 送料こみで振込みしたつもりなんですが… >>266 Cでオブジェクト指向を実装する方法みたいな話が載ってんのか? 実用性はまったくないが、疑問を解消する姿勢は評価する。 送料無料の本の通販サイトじゃ売ってないのか? どこで買おうとお前の自由だけど、今どき送料払って買うなんて珍しい。 >>267 私は >>172 で示したとおり C で(委譲とは区別できる形での)継承は実装できない(ただしこれに対しては >>175 の突っ込みあり)、 という持論ですが、でも、C で OO を全部記述してやる、という心意気を本の紹介文から感じてしまったので思わずポチってしまった… >>268 しばらく前までC++はCに変換してCのコンパイラでコンパイルしていたらしいから C++でできることならできるんじゃね。 C++で使われていたテクニックを解説してるような本なんじゃね。 勝手な想像だけど。 継承は型に関係がある 委譲は関係ない なんでいつも型が出てくるのか オブジェクト指向そっちのけで型の疑問を解消したいんだが 継承も委譲も型とは関係ない 型はプログラミングの論理的不整合を コンパイラに見つけてもらうための追加機能であって コンピュータに人間の仕事を肩代わりさせたいなら 型を使って、人間が頑張りたいなら型を使わないだけの話 普通はクラスも型に含めるだろ。 そしてクラスと継承は関連する。 型って集合のことじゃん bool型は{true,false}の集合 int型は{0,1,2...}の集合 抽象データ型は関数をその集合に入れられますよってもの オブジェクト指向言語では抽象データ型を定義できる 実装の継承は値や関数を引き継げる 型の継承は抽象関数を引き継げる オブジェクト指向における型は値、関数の実装、抽象関数の集合 オブジェクトの定義は型の定義と同義 コンパイル時に型チェックを行うのは静的型付けの説明かな >>273 プログラムを数学に関連付けて誤解するバカって多いよね。 >>275 オブジェクトを生成するとき、 そのオブジェクトは集合からやってきたとでも思ってるの? あるクラスのオブジェクトを保持する集合がどこにあると意識してんの? そもそもお前の中じゃどういうときに集合の存在を意識してんの? >>276 質問の意味がわからない 僕が言いたいのは>>273 に書いたとおりですよ 型って集合だよねってことです 質問ばかりで僕の負担が半端ないので 論理を展開していただけると助かります オブジェクトが集合からやってきたとするならばうんぬんかんぬん あるクラスのオブジェクトを保持する集合がどこそこにあると意識するならうんぬんかんぬん 自分は集合をこう意識するんだうんぬんかんぬん てな具合で >>277 アスペかよ。 集合の存在なんてプログラムする際にはまったく現れないのに 集合として説明するお前は愚かだなあ と言ってんだよ。 >>275 に書いた「そうなの?」は 単純に「プログラムを数学に関連付けて誤解するバカって多い」 この事実を僕が知らないから聞いてみただけですよ アンケート取ったわけじゃないだろうし ベイズ推定的な直感で言っておられるんだろうとは思ったけど 何か具体的なエピーソードトークがあれば披露していただいて >>281 集合の存在に気づく僕と それに気付かない君とでは 僕がバカすぎるの? ダニング=クルーガー効果で 君は自分が賢いと思い込んでるだけじゃないの? >>276 横だがSmalltalkにはallInstancesというメッセージがあってだな… とはいえSmalltalkのクラスはSimula同様に型ではないけどね 自分の知ってることに無理やり結びつけて「理解できちゃう俺すげー」 言うのはやっぱり愚かだと思いますよ。 >>284 君は自分が知らないことがあったら それを知ってる人を愚かだと思うん? はたしてそれは賢いことなんかね >>270 が型とはなんぞや的なことを言ってたから 型は集合でオブジェクトと密接な関係があることを僕なりに説明したつもり ちなみに型は集合って考えは少数派ではないとも僕は思ってる ググったらたくさんでてくる たとえばこれとか プログラム言語論 http://www.cs.tsukuba.ac.jp/ ~kam/lecture/plm2017/6.pdf >>282 だから、集合の存在をいつ意識するのか聞いたんだが。 答えられないお前…。 違う考えをお持ちならそれをご披露いただければ 自分が思う型はこういうものだ的なご意見を拝読したいです >>287 うん・・・なんかごめん。 意識するの意味がわからなくて・・・。 僕には答えられないからこういうときに自分は意識するんだ!的なことをお述べいただければ あるいは自分は意識しないんだなぜならば型とはこういうものだからやー!的なことをお述べになって いただければ僕は正座して読むよ >>286 「プログラムを数学に関連付けて誤解するバカって多いよね。」 を自分で肯定してくれてご苦労w >>289 「型は集合である」と主張してるのはお前なんだから お前がプログラムのどういうときに「型は集合である」と意識するのか言えよwww。 俺は意識しない。 それ以上俺から言う必要がなさ過ぎて。 頭悪いなあ。 >>285 知ってることを周回遅れでさも真実かのように語られた時、 やっぱ愚かだなって思うもんだよ。 どうせhaskellとかあの辺の抽象的な関数型言語からの受け売りでしょ。 自分が偏ってることに少しは気付く努力をしましょうね。 >>290 僕が肯定したら「プログラムを数学に関連付けて誤解するバカって多いよね。」 この命題は真になるん? 僕の意見が参考になったら僕も嬉しいです >>289 つうかお前も集合だと意識することはないのなwww。 型を集合として意識することがないのに 「型は集合である」と主張するお前って一体…。 >>293 反論してる奴なんてお前しかいなくて お前が同意しているんだから 問題は解消したよ。 みっともない反論はやめような。 >>291 君は型は集合であるを意識しないんだ 僕もプログラミングしてるときには考えないかな 君はプログラミングしてるときに意識することを大事だと思ってるわけでしょ それはどうして? そこんとこ詳しくお聞きしたいな 自分は意識しないんだ、なぜならば型とはこういうものだからなんやー!ていう 力強い君の意見がお聞きしたいな >>292 じゃあ君は型とはなんぞやの質問に対してどう答えるん? >>296 プログラミングしてるときに意識しないのに なんでプログラムにおける「型は集合である」と主張するんだ? バカの考えは謎。 >>294 僕はプログラミングしてるときに「型は集合である」ことを意識する 必要があるとは思ってなくて型とはなんぞやということを 考えたときに集合かなーて思っただけだよ 君はプログラミングしてるときにどう意識してるかが大事だと 思っているわけでしょ、それはわかった それでは君は型をどう意識してるん? >>298 型は型である。 型の定義は教科書読んで勉強しような。 集合なんてかかれていないからw。 >>299 それは何の説明にもなってないです 辞典でちんぽを調べてちんぽはちんぽであるって載ってたらブチ切れでしょ? ベンチプレスで鍛えた自慢の鉄腕で分厚い辞典を真っ二つに破り捨てて 発行元に即クレームの電話入れてTwitterで拡散して炎上させるでしょう あなたが今言ってるのはまさにそういうことで完全に鉄腕ちんぽですよ >>286 の大学の講義資料は読みました?書かれてますよ 自分が勉強した内容や経験や知識をもとに 自分の意見を言えば建設的な議論ができるのかなって思うんですよ 意見交換という形でコミュニティとしては健全かなと >>300 頭悪い奴だと思っていたらちんぽマンかよ。 相手して損した。 その資料の「型はデータの集合である」という記述を言ってる? お前の言う「集合」の意味じゃねえだろwwww。 >>301 大学の講義資料は僕の言う集合ですよ 君の言う集合は違うん? 君は型は集合ではないんだって立場なんですよね では君は型をどう説明しますか? この質問だけだと漠然としてて答えにくいかもしれないので オブジェクト指向における型とは〜 プログラミングにおける型とは〜 と言ったふうに説明しやすい前提を置いていただいていいですよ 教えてください >>302 ちんぽマンは数学における「集合」の意味も理解してないのかよ。 ちんぽマンはバカ過ぎて会話にならん。 >>303 北海道大学でも同様に型を集合と説明してますよ 理解してないのは君の方かと 抽象データ型 http://kussharo.complex.eng.hokudai.ac.jp/ ~kurihara/classes/SE/04-abstdatatype.pdf それはさておき僕の理解とは関係なく君の説明が聞きたいな 君は型というものをどう説明しますか? 具体的に説明できないなら 自分がプログラミングするときに型をどう意識してるかを教えていただけると なんかこうふんわりしてて生意気そうなやわらかさみたいな感覚的なものでも良いですよ それに対して僕がつまりちんぽということですねと返すから そこからあと一言いただければ >>304 「データの集合」と書かれているんだが。 あのさあ…。 馬鹿のためにわざわざチェックしたのが時間の無駄だった。 読んでいただいたのはありがたいけど 僕が聞きたいのは君の「型は集合じゃない」という意見だよ ググればわかるようなまともな考えをここで知りたいとは思ってなくて 君のイカれた意見に興味があるんだよね、君の鉄腕を見せてくれ >>308 もう読まなくて良いですよ 僕の考えは十分に示しましたし君がそれをわかろうとしないのは仕方ないことかなと 僕は今夜君の型の説明が聞きたいです 僕は全力で君の意見をわかろうとするんでどうぞよろしくお願いします おい鉄腕説明はまだか? 僕は正座して待ってる、足がしびれてきた これ以上待たせたら虐待で訴える >>291 > お前がプログラムのどういうときに「型は集合である」と意識するのか言えよwww。 型→完全な円 (円の方程式) 集合→円形をした物 (円形の灰皿、円形の十円玉、円形のルーレット・・・その他身近なイロイロ) 『近似する実在物』を、ある一定の『実在しないひな形』にまとめるのが、オブジェクト指向! イデアとは最高度に抽象的な完全不滅の真実の実在的存在であり、感覚的事物はその影であるとする。 イデアが存在しているのがイデア界(本質界)で、その陰が投影されているのがわれわれ人間の住む現実界となる。 例えば、現実の世界に、円形をした物はたくさん存在するが、いずれも完全な円ではないし円そのものでもない。 しかし、これらの円の背後には永遠不変で、完璧、かつ抽象的な円のひな型であるイデアがあるとする。 この考え方ってどっかで聞いたことある・・・そうだ!オブジェクト指向の考え方にそっくりなんだ。 オブジェクト指向はクラスという雛形(設計図)があり、クラスを元にして実体を持つオブジェクト (インスタンス)がポコポコ作られるようなイメージである。 http://aidiary.hatenablog.com/entry/20050430/1114871993 >01000001011000000000000000000000 コンテキスト(時と場合)によって、チンポが随意筋なのか不随意筋なのかを使い分けような! 「モノ、コンテキスト、役割」の関係は、「モノ、照明、影」で例えられます。 モノに照明を当てると、影が出来上がります。影は、照明を当てる角度により形が異なります。 つまり、照明=コンテキスト、影=役割とすると、 仕事コンテキストでは従業員 家庭コンテキストではお父さん 趣味コンテキストではゲーム制作者 https://qiita.com/MinoDriven/items/2a378a09638e234d8614 >現代的な考え方: データ型=データの集合+演算・処理の集合 >01000001011000000000000000000000 >• int CPUが整数演算に使うなら 1,097,072,640 >• float CPUが実数演算に使うなら 14.25 >• String CPUが文字列処理に使うなら ”槍” とNULL文字 >• その他 CPUが画像処理に使うなら 白黒画像の一部 304 デフォルトの名無しさん 2019/05/05(日) 00:45:53.25 ID:0ZGoSt+d >>303 北海道大学でも同様に型を集合と説明してますよ 理解してないのは君の方かと 抽象データ型 http://kussharo.complex.eng.hokudai.ac.jp/ ~kurihara/classes/SE/04-abstdatatype.pdf それはさておき僕の理解とは関係なく君の説明が聞きたいな 君は型というものをどう説明しますか? 👀 Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b) >>314 今日もまた発狂して一人チンポ芝居かよ。 >>269 それは同じ動きのCのコードを作るというだけで、できた C コードはすでに OO ではない可能性があるかと >>316 C++のプログラマはオブジェクト指向のコードとしてかいてるんだから その主張は違う。 >>317 C++ の時点では OO であっても、それをトランスパイラに通して出てきた C コードは OO ではない、という可能性はあるのでは? 例えば C++ の時点では OO であっても、コンパイラに通して出てきた機械語は OO とは言いがたいでしょう? 少なくとも数学的な集合の性質として 「順番は問わない」集まり というのがある。これと型との関係は? >>318 最終的には機械語として実行されるから どんな言語のオブジェクト指向ではないと言ってるようなもんだ。 どんな言語もオブジェクト指向ではない主張したいのか? >>320 私の主張は、コンパイル/トランスパイルする前の記述言語において、オブジェクトオリエンティッドが達成されればいいだけです トランスパイル/コンパイル語の記述体がオブジェクトオリエンティッドでなくてもいい ただし、C 言語は、最初の記述時点において、すでに、オブジェクトオリエンティッドにおける継承が記述できないと考えています それを示すのが >>172 のといかけで、この内容を C で書けない、したがって OO を C で実現できない、ということになります >>292 一般論として周回遅れマンが紛れ込んだときのベストな対応はスルー 周回遅れを自覚できていないという時点で そいつの知力にはもはや期待が持てないので そいつに対して一つのレスも費やしてはならない この点を見誤ると、周回遅れマンに居座られてしまう >>321 だからそれに対して、昔のC++の実体はCだったと言った。 この意味を理解できてない様だなあ。 ついでにC++についても勉強したら。 >>323 C++ をトランスパイルして出てきた C は継承を表現できていなかったのでは? >>172 で私は C++ コードを書いていますが、これをトランスパイルして得られるはずの C コードはどのようなものと推察されますか? >>324 実際にC++をCに変換して確認しりゃいいだろ。 >>325 すでに私は確認しており、C にトランスパイルされた時点で OO ではなかったと記憶しています あなたは C でも OO できる、という立場であれば、>>172 の C++ コードに対して対応する C のコードを記述できるでしょうから、それを見せてください C で OO の継承を記述できない、という立場であれば、私と同じです >>326 C++はオブジェクト指向だと認めるんだよな? で、C++はCの機能だけで作られていた。 Cの機能だけでオブジェクト指向が実現できる、以外の結論を主張するのが意味不明過ぎて。 >>327 >C++はCの機能だけで作られていた。 機能、という言葉の使い方があいまいですね ・「C++ をトランスパイルした結果が C のコードが出力される」という事実だけでは、C が(委譲とは区別された)継承を記述できるかどうかを示すことはできないのではないでしょうか? >>328 お前も理解力が低過ぎるから説明するのが面倒になった。 ま、お勉強しような。 アップキャストできるから移譲と区別とはならないの? >>329 私は >>172 の C++ に対応する C コードを示していただければ満足します >>330 多重継承のときは、そのアップキャストはどうなりますか? >>332 そのとおり! そういうのを手でちまちまと書く、というのを「OO できている」とはいわないという主観です マシン語に変換された瞬間にOOできてないに変化するってこと? そう言われるだろうと思って自分でルールを作らなくなるんだろう 自分ではない誰かが作った教科書を読めとしか言わなくなる >>335 基底クラスA, B とそのメソッド A.f(), B.g() A, B を多重継承する派生クラス C とメソッド C.h()があったとして (コード例は >>172 ) 今 C のインスタンス c に対して c.f() と c.h() の両方を実行したいとき c の this から c 内の A のために this を作り c.f() を呼ぶ…@ c 内の B のために this を作り c.h() を呼ぶ…A @Aのどちらかあるいは両方について、c の this をずらして基底クラスの this を作らないといけません >>172 の C++ では c->f() や c->h() とお気楽にかけるのに、C では、チマチマと this にオフセットを「人間が数えて」足し込むコードを書かなくっちゃいけない そんな体たらくじゃ C では多重継承は書けないのと同等ですね >>339 それはC言語がオブジェクト指向プログラミング言語ではないと 言ってるに過ぎないと思うの 手でちまちまと書く、というのを「OO できている」とはいわないのはどうしてなん? オブジェクト指向プログラミング言語でプログラミングすることだけを オブジェクト指向と言うん? それはどうしてなん? オブジェクト指向は考え方であって手段として手書きするのか 言語の機能を使うのかはどちらでも良いと思うのだけれども どうして多重継承を言語としてサポートすることが大事だと思うん? >>340 >それはC言語がオブジェクト指向プログラミング言語ではないと >言ってるに過ぎないと思うの であれば、それが私の言いたいことそのものですね、問題ないのではないでしょうか? >手でちまちまと書く、というのを「OO できている」とはいわないのはどうしてなん? 手でちまちまと、すなわち手動で this を作らないといけないようではオブジェクト指向はできてないでしょうね… >オブジェクト指向プログラミング言語でプログラミングすることだけをオブジェクト指向と言うん? それはどうしてなん? そうはいってませんよ、単に C でオブジェクト指向にのっとったプログラミングはできない(なぜならばオブジェクト指向の重要な要素である継承が実現できないから)、といっているだけです >オブジェクト指向は考え方であって手段として手書きするのか言語の機能を使うのかはどちらでも良いと思うのだけれども >どうして多重継承を言語としてサポートすることが大事だと思うん? 多重継承を例にするのがわかりやすいから、多重継承を例にしただけです。 >>342 君はオブジェクト指向プログラミング言語でプログラミングすることを オブジェクト指向ができていると表現してるわけだね C言語は多重継承をサポートしていないという事実から C言語はオブジェクト指向プログラミング言語ではないを導き C言語ではオブジェクト指向できてないを導出したわけですね 自明ですが、論理とは自明の積み重ねですからね そういうの大事だと思います 僕の考えるオブジェクト指向はこうです オブジェクト指向とはオブジェクトを主要なものとしてシステムを作ることです オブジェクトとは状態と振る舞いのセットです 分析や設計の段階でオブジェクト指向で考えることができますし C言語や継承の機能を持たない古いVBでもオブジェクト指向を適用可能です 要件を満たすにはこういうオブジェクトが必要だ この状態はこのオブジェクトが持つべきだ この振る舞いはこのオブジェクトが持つべきだと 考えるのがオブジェクト指向なのです 大事MANブラザーズバンドが昔 負けない事・投げ出さない事・逃げ出さない事・信じ抜く事 それが一番大事と歌いましたが それを歌った本人は後年どれも大事じゃなかったと言いました 良い話です オブジェクト指向プログラミング言語がもつ機能として ・カプセル化 ・多態性 ・継承 これらが提唱されてはいますが オブジェクト指向にとってどれも大事じゃないです 良い話ですね オブジェクト指向ってなんなのかもわからない人だらけで、クラスこととだと思ってる奴が未だに大勢いるからな 最近じゃクラスを持たないオブジェクト指向言語が使われ出してきていて誤解も減ってきてる気はするけど クラスを持たないオブジェクト指向言語って具体的にはどれ? >>343 >君はオブジェクト指向プログラミング言語でプログラミングすることを >オブジェクト指向ができていると表現してるわけだね いいえ、OO な言語でなくても OO で記述できる範囲を代替できれば、それも「オブジェクト指向ができている」とします。 ただし C 言語は単一であっても継承を委譲と区別して記述できない…@ 継承は OO では基本的な考え方、枠組みである…A @Aより C 言語では OO 的な記述はできない となります >C言語は多重継承をサポートしていないという事実から >C言語はオブジェクト指向プログラミング言語ではないを導き >C言語ではオブジェクト指向できてないを導出したわけですね 多重継承だけではなく、単一継承も C では不可能、とします。 なぜならば、 構造体の第一メンバのアドレスと、構造体そのもののアドレスが一致するとは限らない…B 構造体の各メンバの物理的な順序はプログラマから指定することはできない、構造体テンプレートごとにシャッフルされても文句はいえない…C >>344 >要件を満たすにはこういうオブジェクトが必要だ >この状態はこのオブジェクトが持つべきだ >この振る舞いはこのオブジェクトが持つべきだと >考えるのがオブジェクト指向なのです これを@とします @は オブジェクト指向「的」に記述する というなら許容できますが、オブジェクト指向そのものではないと思いますね 人とか動物、鉛筆やボールペンならよく分かるんだが、実際のプログラムになると何がオブジェクトなのか途端に分からなくなる。 >>340 >どうして多重継承を言語としてサポートすることが大事だと思うん? 随意筋 不随意筋 ↖ ↗ チンポ 『継承』は、子クラス➡親クラス。 多重継承を否定できないのは、この現実世界においては、状況によって相反する属性が現れるから。 特に機械翻訳においては、文脈によってコトバの属性を選択しなければならない。 >>352 実際のプログラムではそういったビジネス要件のクラスと メモリ、データベース、ネットワークアクセスを上手くマッピングするレイヤーが 必要になるからな。 オブジェクト指向が役に立つ場面もあるが邪魔になる場面もある。 多重継承をサポートしてる言語って C++以外だと何がある? >>350 つまり結論はC言語はオブジェクト指向プログラミング言語じゃないってことですよねわかります >>351 僕のオブジェクト指向と君のオブジェクト指向は異なることを言ってますね それはそうです >>355 型の継承ならインターフェースって形でJavaはサポートしてますよん Javaはインターフェースでのデフォルト実装ができるようになったので 実装の継承もできちゃう >>357 Javaで言うとクラスの多重継承の意味で聞きたかった >>352 プログラムで何をやるのかによって 変わってくるんじゃないかと ソフトウェアが処理の対象にする分野はドメインと呼ばれるけれども オブジェクトはドメインによって変わってくるかと たとえば表計算というドメインでは「行」という概念があり「列」という 概念があり「セル」という概念があってそれぞれ状態や振る舞いを持つじゃん ファイルはデータを読んで分析するというドメインでは「データソース」になるし 処理したデータを永続化するというドメインでは「データストア」になるし データを連携するというドメインでは「連携データ」になる てな具合で ソフトウェアが解決しようとしてるドメインを考えることによって こういう概念があるとシステムがわかりやすいよね 処理しやすいよねって考えるのがいんじゃないかなと思いました >>360 Javaで言うとextendsで複数クラスを指定という意味 インターフェースはimplementsだから継承といよりは実装のほうが良いような もちろんデフォルト実装があるのは知ってるけど >>358 >Javaで言うとクラスの多重継承の意味で聞きたかった 随意筋 不随意筋 ↖ ↗ チンポ 『継承』は、子クラス➡親クラス。 多重継承を否定できないのは、この現実世界においては、状況によって相反する属性が現れるから。 特に機械翻訳においては、文脈によってコトバの属性を選択しなければならない。 >>361 クラスにあってインターフェースにないものそれは状態 状態の多重継承ってことね たしかにJavaではむりっすねー >>352 その疑問は的を得ている。 そこで設計指針が必要になる。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる