オブジェクト指向は愚かな考え。排便メソッドを実装した人間クラスから美少女クラスが作れない。 https://twitter.com/ProgrammingMono/status/665702678006140928 研究グループは、血管新生注において血管が伸長する際の血管内皮細胞注運動を制御するしくみを、生物学と数理モデル・ コンピュータシミュレーションを融合させた先端的な研究手法により明らかにしました。 生物は、最小の機能単位である細胞が寄り集まった多細胞体です。しかし、細胞の集まりが、組織や器官といった 秩序ある形態や構造をつくり機能するしくみはほとんど分かっていません。中でも血管は、体中の全組織に十分な 酸素や栄養源を効率よく供給するため、組織や組織の間に入り込み、血管外の環境との相互作用により、巧妙な 枝分かれ構造をとっています。 これまでに本研究グループは、新しく血管がつくられる(血管新生)際の細胞の動きに着目し、特に血管内皮細胞の 動きをリアルタイムで可視化し、定量的に捉えることを可能にしてきました。 今回さらに、血管の伸長を制御するしくみについて、細胞が自発的に自らを制御して動く過程(自律的過程)と、 隣接した細胞から適宜影響を受けて動く過程(協調的過程)がうまく共存することで、全体の動きが巧みに統制 されていることを世界に先駆けて実証しました。 興味深いことに、血管内皮細胞が前後したり、お互いに追い抜きあったりという血管新生で見られる複雑な細胞集団の 動きを制御している中枢部分は、細胞一つ一つの動き(スピードと方向性)の「確率的な変化」として十分説明できる ことをコンピュータシミュレーションで実証しました。 http://www.jst.go.jp/pr/announce/20151120-2/#YOUGO3 前スレ オブジェクト指向は愚かな考え。この世は計算式 ★2 http://peace.2ch.net/test/read.cgi/tech/1450153388/ オブジェクト指向は直観に反するんだよな。 こいつを見てくれ。 Coffeeオブジェクトに振る舞いがある。これはオブジェクト指向的に完全に正しい。 しかし、現実にコーヒーを飲むのは人間だ。コーヒーは人間によってカップに注がれる存在だ。 これが思考を混乱させる。オブジェクト指向に従うとよくわからないソースコードのできあがりだ。 データに振る舞いを持たせるのは大失敗だと言わざるを得ない。 空かどうか判定するEmpty()を定義したCupクラスとLiquidクラスを継承したCoffeeクラスを作って、HumanクラスにRefill(Cup,Liquid),Drink(Cup)を定義すればいいだけだ if(cup.Empty()) { human.Refill(cup,coffee); } else { human.Drink(Cup); }
コーヒーの属性定義が広範囲すぎる 量をのオブジェクトに突然、実態コーヒーを入れている 量のオブジェクトの範囲のクラスを作っる コーヒークラスに量をコンポジションさせる 設計の間違え
>>4 単純。 コーヒーはただの量であり、人間オブジェクトの一変数だ。 いや、コーヒーはオブジェクトであり、生成からの時間により温度変数の値が変わる。 いや、コーヒー生成の時刻を保持するのは人間であり、コーヒーの温度を計算するのは人間である。 いや、コーヒーはコーヒーサーバーオブジェクトの変数であり、、、、 >>5 ま^、これでもいいがこれをオブジェクト指向と思っている時点で 何をやっても後が大変。 >>8 目的次第としか言えんわ 直感的なコードが求められるなら>>5 ってだけ その直感が、直感的だと思う時点 斜め直感にしか見えん
すまん、自動で口にコーヒー注いでくれない前時代のコップ使ってる雑魚おる?
現実をそのままモデル化してOO否定って5周くらい遅れとるで
形式主義ではコーヒーを椅子に置き換えても成り立つってことをいいたいんじゃないのか。
>>14 >>4 は現実をそのままモデル化できていない。 大事なのは、そのままモデル化するのではなく、どうモデル化するかなのだ。 まー初心者(OOだけでなくプログラミング全般の初心者)向けのオブジェクト指向の解説とかでよくある説明だよね。 「オブジェクトとは日本語で物、対象物などという意味です」みたいなさ。とっかかりとしては平易なためによく使われているけど、 数学の定義のように後生大事にするべき、応用の効く、正しいイメージじゃない。
メソッドに何かやらせるのはやめて全て物理演算で動作を決めるべき
コンピュータ内でシミュレートするのではなく実際の分子原子を用いるべき
そんなことしたら分子原子の仕様変更で全てがひっくり返るぞ
メソッドコールのかわりにオブジェクトに対するフォースとトルクを搭載した言語を作ればいい
beDrank, beRefilledにかえればいいだけだろ。
>>25 drinkに渡すのはcup.contentsとかにする? >>4 は一般的なコーヒーのモデル化じゃなくて コーヒーの消費が常態化したマの皮肉じゃないの 最後にコメント付いてるし >>9 そこまでしてオブジェクト指向にこだわる意味がわからない。 そんなもんperlやrubyのワンライナーですませろよ オブジェクト指向も結局はコミュニケーションというか メソッド(関数)指向という方が正しい。 結局はメソッド(関数)をどのように呼ばれるか、まとめられるかってことだから。
メソッドは関数ではない メソッドとは特定のオブジェクトにのみ適用可能な手続きであり、 関数とは特定のオブジェクトに依存しないものである 特に純粋関数は状態にも依存せず、参照等価性が成り立つものである ところでオブジェクトが状態を持たず、メソッドを持たなければ、 それは単なるデータ(例えばハッシュマップ)と同じである 従ってオブジェクトというものは状態、及びメソッドの存在を暗示している オブジェクト志向とは全てのものを変更可能なデータ(言い換えればエンティティ)とメソッドで表そうという観念である 関数型はそれに反して極力多くのものを変更不可能なデータ(値)と関数で表そうとする ここの話はいわゆるドメイン駆動設計にも絡んでいる どちらが、現実世界の捨象に有用であるかということが問題なのである
オブジェクト志向で実装可能なことは、原理的に関数型でも実装可能であり 関数型で実装可能なことは原理的にオブジェクト志向でも実装可能なはずである 関数はオブジェクト志向においては、staticクラスを使えば実装できる メソッドは関数型においては、第一引数によって動作を変更するポリモーフィズムとして実装できる 問題はどちらが汎化に適しているかということなのである 関数型にはオブジェクト指向では綺麗に実装できない麗としてマルチメソッドというものがある これは第一引数及び第二引数+・・・の型を持ってして動作を変更するという技であるが、 特定のオブジェクトに依存しているオブジェクトにおいてはこれはif文を内包したディスパッチをする他に実装する方法はないだろう 一方staticクラスによる関数のパッケージ化は煩雑である 必要な関数だけをインポートするには、その関数を内包したstaticクラスをインポートする必要がある もしここで厳密なカプセル化を適用するならば、 1つの関数のために1つのクラスを使う必要がある、さもなくば利用可能でない関数も同時にインポートしてしまう カプセル化もまた、オブジェクト志向の特権ではないのである 関数型は関数をカプセル化しているのである そして変数のカプセル化もまたクロージャで実装できる オブジェクト志向での変数のカプセル化は容易ではあるが、本当に変数はカプセル化されるべきか それが私の問いなのである
>>37 その問いにおける「変数」とは状態のことであるから、 それは構造化・カプセル化によってアクセス制限されるべきなのは明らか。 >>1 >>4 結局のところ、この問題に誰もが納得するシンプルな回答を示せない奴が設計するからデスマーチになるんだろ。 自分も参加してるプロジェクトでデスマが起こるなら多分自分にも原因があるんだと思うよ
>>4 そもそもなんでコーヒーに命令するとコーヒーが自分で動作してんだよ。 そんなコーヒーがあるかw いきなり設計段階から間違ってるじゃねーか どう考えても最後の"//I am a software developer"って時点で そういう設計をやらかす>>4 みてぇなバカを揶揄したセルフパロじゃんかw ああ、ジョークまで完全に見えた >>4 は「プログラマがコーヒーを飲む」じゃなくて 「コーヒーがプログラマに飲まれる」って逆転ジョークで 絶え間なくコーヒーが自動的にプログラマに注がれ続ける おかしな逆転コードでプログラマジョークになってんだ。 「こいつをみてくれ」じゃねーよ!プププ こういう根本的に理解できてないのが大量に居る時点で、オブジェクト指向は愚かな考えw
コーヒーはどうでもいいけど、 2.log() とか数に数学的関数計算をくっつけるってどうなのよ? 気持ち悪いったらありゃしねえ。
数学みたいにlog(2)でいいと思うが。 その()は何のためにあるんだと言いたい。
大分昔だけどフリー関数は気持ち悪くて、1.sin()とか1.cos()とか書けるのが本来の在り方だ、といった 痛い記事を読んだ記憶がある。Rubyがらみだったかなあ。 今ちょっと検索すると見つからないから俺の妄想なのかもしれん。
数字は計算をしないからそう書いちゃいかんのだけどな
>>46 > 何のため 関数そのものなのか、関数を呼び出した結果なのかを区別する括弧。 括弧がなければ関数そのもの、あれば関数呼び出しの結果。 括弧がなければlogという関数そのもの、あればlog(hoge)の計算結果。 かどうかは言語による。 >>45 こういう主語述語みたいなくだらない議論に陥るのがオブジェクト指向の最大の問題点だな どっちでもいいからそのためのテストなりサンプルコードをがつがつ作ってくれれば問題ないんだが 糞みたいな議論ばっかりふっかける輩を生むところが最大の問題点だな。 >>53 何も考えずに作業こなすだけの社畜 VS 議論ばかりやる頭でっかち ファイッ!! >>53 ドット構文を変な風に使うバカの問題であってオブジェクト指向関係ないな。 主語述語っていうけど、オブジェクトは目的語だからね
昔ながらのfunc( obj ); 形式だと、オブジェクトを主語と考える人はいないだろうし obj.func(); は↑が変形したものにすぎないから同じ理屈だよね しかも時期C++ではfunc( obj )でもobj.func()でもどちらの形式でも呼び出せるようにするって C++の超偉い人がやる気満々だし、見た目は最早重要ではないよね 普通に考えると、主語はコンピュータや処理系だね プログラミングを全然知らない人でも、主語は誰?って聞いたらコンピュータって答えるだろうね 何するにしても、結局実行するのはコンピュータだからね これが全く現実世界でおこっている物理現象なのに、あえてオブジェクトを主語という風に ひねくれた別な観点で考え直す必要は無いね 現実世界に合わせて、主語をコンピュータ、オブジェクトを目的語、関数を述語、と捉えると それで多態や継承が出来なくなるっつーんなら困るけど、そういうわけではないからね だったら現実世界で起こっていることに合わせて考えたほうが自然だね
メッセージングのオブジェクト指向の言い方で言うと、 主語はメッセージのレシーバであり、文の残りはメッセージだ
>>58 x.sin() では x がオブジェクトで、sinというメソッド(もしくはメッセージ?)を処理していて、 sin(x) では sin がオブジェクトで、xという入力を処理している。 どちらかの方がよりオブジェクト指向的だという序列なんかない。 数学関数それ自体をオブジェクトと認めようとしない思想(?)の根源は何なんだ? 演算子前置のポーランド記法は嫌いだなぁ 存在する意味がわからないレベルで嫌い。 演算子後置の逆ポーランドじゃないとね。
> 存在する意味がわからないレベルで嫌い。 なんで? > 演算子後置の逆ポーランドじゃないとね。 なんで?
Add 3 to 5, then multiple it by 2.
逆ポーランドの方が実装しやすいと思う。 人それぞれの範疇だが。
>逆ポーランドの方が実装しやすいと思う。 意味がわからん。 構文木作るのに一番前と後でなんか変わるか? AST作らずにそのまま逐次実行するならスタックに 積むだけでいい逆ポーランドの方がいいかもしれんが
x.sin() では x がオブジェクトで、sinというメソッド(もしくはメッセージ?)を処理していて、 sin(x) では sin がオブジェクトで、xという入力を処理している。 どちらかの方がよりオブジェクト指向的だという序列なんかない。 数学関数それ自体をオブジェクトと認めようとしない思想(?)の根源は何なんだ? 違うよな どちらがオブジェクト志向的かといえばx.sin()でしょ xというオブジェクトにsin()というメソッドが属しているという考えなんだから sin()は関数に対してxというオブジェクト、あるいは単にデータを引き渡しているだけ 後者は明らかに関数的な考え方、動詞優位
関数へのエイリアスのようなメソッドはドットで繋ぐのでなく、 別の文字にした方がいいよな。
釣りじゃなくて単に本当にあたまおかしいのかな? Xはデータであって演算ではない。Xは演算しない。 Xをオブジェクトとして扱った場合、その操作として実装されるメソッドは データのゲットセットなど内部状態を隠蔽するためのメソッドと 可変不変などのデータ状態をあらわすメソッド。 まだお前の脳内じゃおまえがコーヒーを飲むんじゃなくて コーヒーが勝手に口に飛び込んで来てんのか。
x.sin()は手続き言語的だと思うけどなあ もちろんsin(x)も。 オブジェクト指向ならメッセージを送るような記述の方が自然では
現実世界をオブジェクト指向に当てはめるやついるけど馬鹿だよなー コーヒーが勝手に口まで運ばれてくる機能をコーヒにつけただけじゃんw ついでにコーヒーがしゃべる機能もつけたよ。 問題がないからそういう設計にしたんですよ
どちらがより汎化されているかではなく 具体例で語ろうとする人間は、プログラムを実装したことがないのでは? 具体的な手続きによる具体的な文字通りのプログラムを書きたいなら Cでかいてどうぞ
オブジェクト指向だろうと関数志向だろうとやってることは変わらない オブジェクトはメソッドの第一引数でしかない コーヒーを飲むという行為を書くためには手続き的に書くしか無い コーヒーが俺の口の中にあるという結果を宣言的に書きたいのに その手続きを丹念に描写したいならそうすればいい I.drink(coffee)と書けばいいんだよ I.drink(coffee)とyou.drink(coffee)は飲み方が違う!というのならそう実装すればよい モデリングとは物事を単純化する行為、汎化する行為であって具象化する行為ではない Iとyouの違いがモデルのキーポイントなら、Iとyouという(メソッドの第一引数)をパラメータに加えればいいし そうでないなら含まないほうがモデルがシンプルに保たれる 数学ができない自称モデラーはプログラムを手続き的に書いたらいいんだよ
特化させたいのに汎化する必要ある? 狭い世界で使うなら特化させていい。 広い世界で使うなら汎化させる。 それだけ。
>>74 言ってることはわかるがコーヒーを主語に対象を汎化なら coffee1.drunkBy(me); coffee2.drunkBy(you); だろ >>72 普通モデリングなんて想定される実装の多さや効率の問題で変えるものだからね 感性にまかせる初心者ほど文脈や抽象に拘って依存性の上下を無視するよ アクセル→エンジン→ギア→タイヤじゃなくて タイヤ.回転で自動車設計してそうだなおまえら。
>>79 そうやって現実の構造を想定している時点でもう駄目なんだよ ちうかこれオブジェクトが目的語とか言ってる人か? 英語とプログラミングのobject混同とかとてもまともとは思えないよ
>>74 JavaScriptだと実際foo.barは第0番目の引数を指定するための糖衣構文でしか無い オブジェクト指向は別にそんな大したものでも、手続き型と相容れないものでもない 指向とは言うが実際の所スタイルの一部だね >>82 そういう嘘をまき散らさないでもらいたいなあ。 毛の人といい、技術の普及は嘘との戦いだな。 オブジェクト指向は嘘つきが多すぎた。 >>68 いいえ。 sin(x) と書いたときのsinは十分オブジェクトに見えるでしょ。 xとsinは違う階層(空間)に属するモノだけど、後者の方が階層としては高い。 x.sin()と書くと、あるオブジェクトが自分より高い階層のオブジェクトを所有しているように見えてしまう。 これは俺にとっては不自然なので好きになれない。 オブジェクト指向は手続き型と直行する概念だと理解してないのが何人かいるな
>>80 "現実の構造を想定しちゃダメ"て おまえの作るシステムはどんな現実離れした 脳内妄想ベースなんだよ。 sinは関数だろね。 テーブルを持つためにクラスを使わなければならない言語があったとしても、 極力、ユーザーにとって関数に見えるように実装するべきじゃないのかな。
>>79 君が設計する自動車ではエンジンブレーキが効かないようだな。 ブレーキなんてのは外部から ベクトルの力を操作するんだから 後付けで全然構わないんだが。
関数を手続きだと思ってるならそれでいいけど、名前が関数ってだけで数学関数をそういうカテゴリーのものとするのは不適当でしょうね。
クロージャーって、関数なの?オブジェクトなの? rubyだとProcのインスタンスでしかないよね
>>91 わからないなら無理に口を挟まないほうがいいよ。 >>92 関数が状態を持つべきかどうか考えると自ずと答えが出るのではないだろうか。 sin(x)は関数の値であって関数ではないよな。 関数は∀x∈double.sin(x)のことだよな。
>>85 実装がどうあれ、OOPではメソッドはオブジェクトに属するものとして考えるから、 x.sin(value)の表記は不自然じゃ無いだろ。sinはオブジェクトxに属している。 >>97 それは不自然な考え方じゃないかな。 原点に立ち返ってみると、オブジェクト志向とはコード再利用に際して コンポーネント化の要求から発生したもの。 現実に存在する物のように、ディスプレイ上のウィンドウに四角形を 描画しろとメッセージを送るというようなシンプルなものだ。 この場合、四角形自体がオブジェクトであることは問題が無いように感じる。 これは、四角形が状態を保持しているからかもしれない。 一方、数値に対してsinを要求するのは突拍子もないように感じる。 これは、数値を日常いたるところで使用していて、数値がメッセージを受け取る性質を もたないと良く知ってるからではないだろうか。 あるいは計算機オブジェクトに対してsinを要求するなら不自然に感じないのかもしれない。 どうだろうか? この種のくそ議論って恣意的な答えしかないんだから、 議論するだけ無駄なんだけどねぇ。
>>95 状態をもつかどうかは実装しだい。 関数を初期化するとき係数のセットを与えるとかあると思う。 関数がグループとしてまとまって環をなすとか つか、sin(x)ってなんやねんw 引数無しのメソッドの話か? それならsinは例として不適当だ。 sinを例にするなら、x.sin(value) か、sin(x, value) だろ。
>>97 そりゃメソッドはオブジェクトに属するだろ。 メソッドとして位置付けるのが適切かどうかの議論をしてるんだよ。 こういうシンプルな考えに基づくと、四角形と三角形は形状クラスから 派生すると思われる。 しかし、四角形オブジェクトと三角形オブジェクトの合成メソッドは、形状クラスあるいは その派生クラスにあってはならないように感じる。 それは形状合成器クラスに、あるいは単純な関数であった方が良いように感じる。
>>87 物理的構造物とは違うんだよ それすら理解できないならもう向いてないとしか 例えばゲームでキャラクターが特定のアイテムを使用するモデル キャラ.使う(アイテム)はもらうアイテムによってメソッドの動作を変える必要があるが 設計としてはアイテム.適用(キャラ)のが遥かに取り回しやすい なのにあえて前者のクソ設計を選ぶのが>>87 のようなオバカさん >>102 それならOOPの議論じゃないな。 >>105 いや、属する/所有するという概念の方が適当だと思う。(実装は違うが) 実際クラスを書くときそう書くだろ。 >>101 現実の姿を模すという意味だとsinなどは連想配列であって、sin(x)という書き方はそのまんまだよね。 実装においては計算手続きだろうけど。 Smalltalkerが引き上げたらもう初心者しか残ってないのかよ
そもそもクラスだってオブジェクト指向とは直接関係ない >>84 嘘ではなく現実だ 美少女が云々言うのも一般的なクラスベースは融通が効かないねという話であって オブジェクト指向とは直接関係ないし
>>111 ほう、それならウンコをしない美少女をオブジェクト指向で設計して貰おうか >>97 見逃したいたが、x.sin(value)の value って何だい? >>113 引数だよ。 クラスxのメソッドsinに渡す引数。 俺はそういう話をしてると思ったから。 xって中身は例えばfloatのデータ自身だぞ? だから、引数は必要ないんだぞ?
>>115 理解した。 それなら、x.sin() なんて形が出てくる余地は無いよな。 一般に sin に必要な引数は、 pi/2 とかの実数(もしくは複素数) かな。 あとはいくつまでの級数和をとるとか何桁まで計算するとかが引数になるんじゃないかね。 その辺をあいまいなまま value とか x がクラスだの引数だの言ってることに何か意味があると思ってんのかね。
>>117 いや、sinの引数がオブジェクトの場合はあるよ。 実数や10進型をクラスで表現したりするし、俺も実際やる。 xがそういうオブジェクトなら、sin(x)でいいし、x.sin()はおかしい。 まあ絶対におかしいとか無理ってわけじゃないけどなw 新しいC++ではsin(x)でもx.sin()でも、どちらの方法でも統一的に呼び出せるようになる予定だから こんな議論は全く意味ないんだよ? 呼び出す側からしたら、sinがメンバ関数だろうが外部関数だろうが、何であれ、知ったことではないからね 気にしなければならないのは実装する側だけ だからどちらの方法でも呼び出せるようになる、らしい どちらの方法でも呼び出せるんだから、喧嘩する必要ないし、気にする必要ないよね
どちらの方法でも呼び出せるんだから どちらの方が、よりオブジェクト指向的か、考えるのは意味がないんだよ 等しいわけ、等価と考えてよい 見た目が違うだけ 大した問題じゃない
こんなにややこしいプログラムがオブジェクト指向を使って こんなに簡潔になりましたって事例が欲しい
>>112 思うんだけど、 うんkをしないというのが、 意思を持ってひたすら我慢して(人の目がある場所では)しないのか、 それとも腸内の美少女菌のおかげでする必要が無いのか、 もしくは他の何かなのかによってイメージが変わってくると思う。 でもしないにしろする必要がないにしろ、排便メソッド自体は備わっててもなんら問題ないと思う。 逆に、腸内やなんかの問題を解決せずに、排便メソッドだけ外して他を流用するということは、 オブジェクト指向的であろうがなかろうが不可能だと思う。 それこそ亞人として設計しなおして全ての手続やメソッドを別に用意することが妥当かもしれない。 だから結論を言うと、この例はそもそも良くないと思う。 >>122 サイズを持っていてくれるのですら俺は嬉しいと思う 文字列や配列を扱うとき int string::size() {return strlen(data);} // 数える関数を使うって例 ↑こーいうのじゃなくて int string::size() {return end - begin;} // 簡単な計算(ポインタの差分)で返す int string::size() {return size;} // 内部でケアしていたprivate変数を返す こういう実装をしうるのが嬉しい 使うときに a = s.size * s.size / s.size % s.size みたいにいっぱい呼び出しても安心 逆に言うとせっかく用意されたsizeメソッドが内部で数えなおしてる場合はつまらないと思う >>112 美少女はマーカーインターフェースであり、 美少女として扱うとき排便は隠蔽される。 interface 美少女 { } class おっさん implements 美少女 { void 排便() { } } >>126 それは「何もしない」という排便メソッドを持つ 持たない,ではない >>127 何を言うてんの?排便メソッドを持つのはおっさんだよ。 オブジェクト志向の考えだと 大便ableインターフェースを実装するんだろ
美少女クラスを欲する奴が美少女のウンコがついたぱんつを欲しがらないかと考えると これは要件定義から間違っているような気がしてならない。
実装からメソッド設計を考えるより使い方から設計したほうが上手く行くと思う つまり美少女がうんこ出来るのか、出来ないのかで考えるのでは無く美少女にうんこをさせたいのか、うんこさせたくないのかで考える
肛門はコンポーネントとしてアタッチする。 美少女は肛門をインプリメントしていない
関数型言語っていい点もあるけど、変更に弱過ぎない? ちょっと動作を変えるのにかなり見直さないといけない
>>138 関数型言語を使えば完璧なプログラミングが可能なので後から変更する必要が無い。 >>140 完璧なプログラミングは出来ても 将来の仕様の変化を完璧に予測することは出来ないでしょ? オブジェクト指向は細かい修正で済むと手を抜き続けた結果メチャクチャ悲惨なことになる 全て書き直すくらいがちょうどいい
関数型言語は仕様変更のたびにめちゃくちゃ悲惨なことをしなければならないのか
関数型言語にとって型とはプログラムの設計図なのである。
>>155 関数型じゃなくてお前を馬鹿にしてるんだよw >>157 ああそう、なら良いんだ。 関数型馬鹿にしたら唐沢弁護士に頼んで勝訴しちゃうからね? 関数型に不可能はない。関数型は神にのみ扱える至高の言語 関数型を疑ってはならない。汝の実力を疑え
広く使われてて実用的な言語は多かれ少なかれマルチパラダイム 関数型っていうのも結局は作者がそう言ってるかどうかの線引でしか無い 理想的な関数型gwンゴを想定してなにか言うのはあまり意味が無い
関数型ンゴwwwwwwwwwwwwwwwwwwwwwwwwwww
今時は大学とかでも言語比較とか講義しているのかな。
>>173 記事のベースはイギリスのプログラマ教育のあり方と社会地位の話で "大学で教えていることが現場で役に立たない"ことと "高級技術者としてのプログラマの社会的地位の低さ"について そして、前者関連の話で「教えるべき技術は次々と移り変わる」例として オブジェクト指向を挙げてみてるが、筆者があまり理解してる感じではないなぁ… 20年前なら単語そのまま「構造化プログラミング」に置き換えて書かれた 単なる流行りワードの扱いだわな。 また、書かれている内容のとおりイギリスのプログラミング技術のほとんどが 学校教育ではなく「独学」で学ばねばならないもので、その上でガチで 『しかし今では、私を含めて多くの人が、この潮流は20年間に渡って 本流から逸れていたものであり、そのほとんどが間違いだったと考えています。』 と、思ってるとしたら本当にイギリスのプログラミング業界界隈の危機は 深刻なものだと考えざるをえない…
>>176 >>173 のリンクを読んだ感じではイギリスではどうも国を挙げて 学校や社会人教育で「無償で国民にプログラミングを学ばせる」事業をやってたっぽい で、たぶん日本でやってもそうなるだろうけれど みんな合格するようなレベルの簡単な内容なので わざわざ教える意味がない的な事態になったっぽい? 大学の情報学科だったら日本でもまぁ直でコーディングの役には立たんが 逆に大学レベルの情報工学理論面を広く教えるから オブジェクト指向なんて~って池沼はでないだろう(皮肉 コードの奇麗さはなになに指向とかとはいつだって無相関だよ。
それはツールに設定したルールを守ってるかの判別器でしか無いな。 本当に一般的に綺麗なコードとやらを図るには、 統計を集めて機械学習でもさせる必要があるだろう。 もしくは綺麗というのが、編集しやすいということなら 最低きちんとした理論と根拠を元に基準を決めるべき。 今の基準の多くはただ作者の信念だったり、狭い範囲での多数はを取っているだけ。
コードとは言語だから、綺麗な英語と置き換えてみればわかる。 学校で教えられるのは全部綺麗な英語だから実際の外人の喋ってることなんか一つも役に立たない。 汚いコードを書いてどんな汚いコードも読めるようになるのが大切。
実際に効果があるかそっちのけで、主観的な綺麗さばっかり気にしてルールを 固定化しようとするやつなんなの? どことなく自閉症的で気味が悪い。
あ、このスレの発言のことじゃないです。リアルの話。
コードコンプリートを書いたのはマイクロソフト()だぞ 林檎がビューティパーフェクトコードを書くまで待て
>>186 ルールなんて誰でもわかってると思うけどな。 ・重複する処理はかかない。 ・同じことに関する値を重複して定義しない。 ・計算で求められるものは計算でだす。 ・ある処理に関するコードは一箇所にまとめる。 ・条件分岐を減らす。 ・ループを減らす。 ・設計とファイル名やディレクトリ構造を一致させる。 ・役割毎に関数やクラスを分ける ・関数やクラスはなるべく短くする ・テストしにくい所を減らす ・適切な名前(グローバルに近いほど長く、ローカルに近いほど簡単な名前)をつける。 ・十分にテストされた信頼性が高いライブラリを使用する。独自実装しない。 ・コーディングスタイルに適合すること ・メトリクス(複雑度等)が悪いものは認めない これらは主観じゃないので、このルールにしたがえば、 誰でも良い方がどちらかわかる。 >>190 それらは効果があるとわかるものだから問題ないよ。 Smalltalker達がいなくなったら途端に初心者スレ化w
Smalltalkの人はボコボコにされて Smalltalkに自信を失って帰っちゃったからな 実際全然使われていない現実なわけだから 何を言っても説得力皆無だし机上の空論になるし こいつマゾと思って皆で玩具にしたが 言うほどマゾじゃなかったのかもね
7 minutes of Pharo Smalltalk for Rubyists VIDEO Pharo - Welcome to Pharo! http://pharo.org/ >>185 どんな汚いコードも読めることは大切だが 汚いコードは書くなよ… まあその汚さをある程度許されるようになるオブジェクト指向は嫌いじゃない >>197 いや、それでも人間クラスに 排便メソッドは必要だ。 >>198 そんな汚いコード書くと人間クラスを継承した美少女クラスで不都合が生じる >>200 だから美少女クラスは天使クラスを継承するのだと何度説明すれば... >>200 だから美少女クラスは天使クラスを継承するのだと何度説明すれば... >>200 だから美少女クラスは天使クラスを継承するのだと何度説明すれば... 人間クラスを継承せずに、 必要に応じて肛門を持たせればいいのでは? この問題は、設計を誤ると修整が容易ではないと言ってるの? 論点は何?
>>206 メンバーの種類を制限したり、メンバー間に何らかの制約を入れたクラスが欲しいときの ベストプラクティスはっていう話かい? 言語によるけれど c++ のテンプレート使った方法が「Modern C++ Design」に書いてあった気はする。 有用かどうかは知らん。 天使クラスを継承するともれなくおちんちんがついてくるぞ
滑ったな どうすんのこれ 教えてよ 今すぐあんたが教えてよ
この板にいたなら知ってる人も多いだろうけど このスレタイで建てる前に延々「オブジェクト指向は~」ってスレ建てては 毎回、議論についてけなくなると「美少女クラスはうんこしない」みたいなこと書いて 荒らし逃げしてんだよこいつは。 んで、またそれ始めたから知ってる人々がサーッと逃げた。
そんな糞みたいな議論に持ってがれる時点でオブジェクト指向って切り口は何か問題があるんだろう。 もう少しバズワードと距離とれるスタンスが必要だったんじゃないのかね。
美少女の件は、キモオタクラスからは美少女の排便参照不可にすれば解決。 また、キモオタクラスからは他のどの処理を呼んだ場合にもキモ例外が発生することにすれば万全。
排便量を(オブジェクト指向について僕ができる最大の議論)
>>216 排便メソッドの引数にいちいち排便量足すのかよ… 排便量は流石にインスタンス変数で管理するだろ トイレに行って半分だけ出すとかいうマニアックな機能をつけたいならともかく
get_unko を仮想関数にして美少女クラスは 0 を返すようにすればよい。
ワンチャン便秘のババアクラスを継承しても美少女クラスは成り立つのではないだろうか
日本の現場は永続化層が糞すぎてオブジェクトにマッピング出来ない これじゃまともにOOPは出来ないから関数型でやらざるをえないんだね 別に関数型がOOPより優れてるという事ではなかったんだね
>>227 OOPが愚かなのではなくDB設計者が愚かだったという事 永続化層が糞でも関数型なら上手く行くならOOPより優れてるってことになるんでは?
RDBにオブジェクトをそのまま永続化できないように、 RDBに関数を値として永続化できないんなら同じじゃん
>>229 うまくいくからやるというかそうせざるをえないからやる そして一見うまくいっているように見えるが保守性も拡張性も悪い 製造が進むほど歪みが大きくなり破綻に近付く OOPなら最後まで破綻しないが永続化層はOOPに譲歩して合わせなければならない しかし日本ではDB中心のアプローチしか出来ない老害が支配的だからそれが出来ない OOPが優れているのに足を引っ張る老害のせいでOOPはダメだという風評被害を受けている >>231 便秘が永続化するババアがいるのは日本だけだぞ?知らんかったんか? DBには関係代数という理論的バックボーンが存在するからやり方の是非に真偽をつけられるが Mutableなオブジェクトを許容するオブジェクト指向にはそれが無い 何でもできるかわりに何でもアリすぐる
mutable なオブジェクトは糞。 美少女はウンコをしない。 オブジェクトの値が破壊的に変更出来てしまっては、 並列的な処理に容易に分割できないから、 マズイだろってな的話じゃないか?
例えばC++の入門書で必ずと言って良いほど載ってる複素数クラスComplexだけども、 たいてい代入演算詩(かコピーコンストラクタ)とか定義していやがる 藻前はa+2iに3+4iが代入されるのを見たことがあるのかっていうか、 Complexはもはや複素数ではない何か別の異形のものを表してしまっているのではないか、
スマンorz; 誤1:詩 正1:子 誤2: a+2i 正2: 1+2i
1+2i + 3+4i = 4+6i 意外と便利かもしれないww
>>242 右辺値に対するoperator = をdeleteすればいいんでしょ? 関数型とかいう産廃はイベントがないから使い物にならない 最近の大規模システムはみんなイベントがないと始まらない
ちょっとだけ期待してスレひらいてみたら美少女のうんこ λ計算すらないのかよ
「美少女はうんこしない」という話を「美少女のうんこ」の話だと理解してしまうようなおっちょこちょいが オブジェクト指向を理解出来るわけがない
依存型とか見てみると結局行き着く先は同じなんだなと思うけどどうよ
美少女はウンコするのかしないのか。 それでみんな行き詰まる。
うんこをした時点で美少女ではない しかし、うんこを我慢している美少女は萌えるのだ
うんこをしないのにうんこを我慢するわけないだろ 絶対にしないから美少女のうんこには底知れぬ価値があるのだ
スコープだったり変数の生存期間を気にしたりってのは関数型だろうとオブジェクト指向だろうと 同じように気にする。 要はまとめ方ってだけの話。
「野球もサッカーも球技だからおなじようなもの!」いただきましたw
オブジェクト指向は役に立っている。 関数型言語はトイプログラムしか作れない。
僕みたいな芸人とか人前に出る人は、多かれ少なかれちょっとした発言や態度がネットで炎上したり、 罵詈雑言を浴びせられたりします。けれど、僕はそんなのにまったく腹も立たないし、 むしろオブジェクト指向を“カチャカチャ”してる人のほうが可哀想やなあ、と思うんです。 エラい人たちは、オブジェクト指向で時間を使うことはないでしょう。 だから僕は子どもにも「金持ちやエラい人のマネせえ、幸せな人のマネをせえよ」と言うようにしています。 はい、ここで問題です。オブジェクト指向でカチャカチャしてる人とそうでない人、どっちが幸せですか? そんなの100%、カチャカチャじゃないほうですよ。カチャカチャばっかしてたら不幸になることは、みんなわかってる。 「あの人幸せそう、エエ人やわ」と評判の20人のおばはんをモニタリングしてみてください。 ちゃんと挨拶して、言葉遣いも優しくて、お店でもエラそうな態度をとらない、とか共通項があるはずです。 逆に「あの人意地悪いわ、不幸やわ」と言われてる20人のおばはんを見ると、絶対カチャカチャみたいな行動をしてるはずです。 オブジェクト指向をカチャカチャして、クラスのインスタントを参照して「やったった感」を持ってるのかも しれんけど、それでハッピーエンドの人生が待ってると思いますか? それよりも、もっとお友だちと おしゃべりするとか、勉強するとか自分が幸せになる方法を考えるのがいいんじゃないですか。 オブジェクト指向をカチャカチャするのは、自分から不幸になりに行ってるようなものですよ。 あまりに生産性がなさすぎる。それを考えると可哀想やなと思えてくるんです。 僕は「日本は沈没しかけとる。こりゃどエラい時代が来るぞ……」とゾッとしたもんですが、 今まさにそれが当たり前のどエラい時代になりましたね。
関数型は「このわかりにくい書き方をすればある問題が絶対発生しない!」だからなぁ… いや、わかりにくいって時点でダメじゃんっつか。
>>265 問題が絶対に発生しないなんてあるわけねえだろ Haskellだってランタイムエラー出るときは出るわ ○○は学習コストがーとかわかりにくいってよく聞くけど、仕事でやってる人なら誰でもすぐわかるような(もしくはわかったつもりになれるような)技術だけ使い続けるより安心じゃね? 覚える価値があるなら特に。
誰でもわかる ↓ コストがかからない ↓ 人気がある ↓ 衰退しない
誰でもわかる ↓ バカが混入する ↓ コードが荒れてプロジェクトが燃える ↓ マトモな技術者が新しい言語に逃げ出す 今、関数型言語界隈がstep 2のど真ん中w
匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、 BitTorrentがオープンソースで開発されています 言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか? Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします https://twitter.com/Lyrise_al ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw The Covenant Project 概要 Covenantは、純粋P2Pのファイル共有ソフトです 目的 インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します 特徴 Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW) 接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です DHTにはKademlia + コネクションプールを使用します UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります) 検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません @ オブジェクト指向って別に世の中の色んな事を記述するためのものじゃないよねw pcの制御を記述するためのものじゃん たぶん世の中 = pcって偏狭な人間が混乱してるだけなんじゃない?
手続き型の一部に関数型っぽい書き方するのがカコイイという風潮が強くなってきて 熱心な子が意気込んで本格的なものに手を出してみるがわけわからなくて 酷い目に遭って帰ってきました、という感じじゃない?
誰でもわかる ↓ コストがかからない ↓ 人を集めやすい一方、単価が下がる ↓ 人気が減る
関数型言語って狭義のプログラミング言語じゃない気がするよ アルゴリズムをシステマティックに表現するスクリプトに近い コンピュータが手続きの連鎖で動いている以上、普通は関数を中心に記述するのはオーバーヘッドが大きすぎる アルゴリズムが最適化される事で最終的な手続きが減るほど複雑なロジックを組む人が使えばいいと思う
言語はJavaでもC#でも良いけど、凡人はデータとロジックは分けて扱う方が良いと思う デザインパターンも、多少スキルのある人に任せて、自分では手を出すべきではない アホが好き勝手に弄った挙げ句トンズラこいた、巨大でインスタンス変数やstatic変数を弄りまくる分岐とループにまみれたクラスの継承元と継承先を飛び回るのは、とてもツラい 何をもって安心すれば良いのかわからない 仕事戻りたくない
名前空間で分けられるOOの方が構造化プログラミングより安全だ バカを隔離するためにクラスを作ると昔の人は言った
おお、そのとおりだよw 末端のクラスは融通の効かないバカに作る。 そうすると見通しがいい。
「言われたことをちゃんとこなすように」が正解。 途中途中で権限委譲しておかないと 上流がすべての決定をしなきゃいけなくなるので破綻する。
>>276 藻前の悩みは名前空間の汚染しかないのカヨ… クラスにして良いのはふるまいに状態を持たせる覚悟のある奴だけ もしくはクロージャとかfunctorを作りたいときとかだが C++で作るクロージャとかfunctorは クロージャとかfunctorですよみたいな顔して状態を隠し持ちかねないところが恐ろしい…
c++のクロージャってレキシカルスコープ以外の状態を持つのか? 後 functorもクロージャって全然違わない?
Objectから派生したものは、メンバ変数とメソッド、つまり状態と処理を持つ クラス・ラムダ・クロージャ・無名関数・Functor・ブロック・Proc、 どういう名前を付けようと、First Class(第1級)オブジェクトである 第1級オブジェクトとはオブジェクトなので、newできて、 簡単に持ち運びできるし、カプセル化してアクセス制御もできる 関数の引数として渡せて、戻り値にもできる
>>283 なにその中学生がぐぐりながら書いたような文章 ポケモンってオブジェクト指向が出て来たら これで効率よくやってそうだよな
モンスターは物じゃない 物じゃないんだ、友達なんだ
ゲームはオブジェクト指向が適しているだろうが、 それでもやっぱり思考ロジック部分はオブジェクト指向じゃないさ。 ロジックを固めるフレームワークに設計は適している。
>>287 なにその小学生がヤフりながら書いたような文章 100レス位まで読んだけどクッソどうでもいい事をぎゃーぎゃー言い合ってるだけやんけ
>>287 はっきり言ってゲームにオブジェクト指向なんて適してない すべてのオブジェクトをエクセルの縦の列に並べて すべてのパラメータを横の列にすべて書き出す こういう感じでチェックできるプログラムにしないと完成しない オブジェクト指向なんて意味ないよな スーパーマリオもテトリスもプレイに必要なのはエクセル
ネタとしても面白くないなぁw オブジェクト指向が使われてるのを 目の前にして適していないと言われてもねw
ここからオブジェクト指向を見た事がない人だけがオブジェクト指向を批判出来るスレになります
オブジェクト指向は重複したメソッドが発生する。こういうのは無駄。 coffee.owner=human coffee.drink() human.drink(coffee)
>coffee.owner=human >coffee.drink() いやいやいや
オブジェクト指向 「白痴の面倒までみれねーよww」
オブジェクト指向が面倒を見なくても 白痴はオブジェクトらしきものをプロジェクトに残してくんだ・・・
すべては名前 きちんとした、名前 名前、名前、名前 名前思考でお願いします 機能と名前が違うのがありすぎ 国語力の欠如した人のプログラムでは 反対語で書く奴もいるし 動詞を、名詞で隠す奴
正しくオブジェクト指向を使ったMacOSXは16年間で11回メジャーアップデートし オブジェクト差し替えでiOSに派生しiPhoneやiPad、果てはAppleTVにも使われ 一方、間違ったオブジェクト指向を使ってしまったWindowsは 15年間で5回しかアップデートできない上に不具合オンパレードで阿鼻叫喚 ユーザが一つ前のバージョンしか信用しないので常に5年前のバージョンが大半 そして強硬策「いま入れますか、あとにしますか?」地獄へ。 後者をオブジェクト指向だと思ってる奴はそりゃ全力で否定せざる負えないわな。
iOSとかMacのメジャーアップデートって完全に人柱じゃないですかヤダー
最近推し激しいが今のiOSっていいのか? まぁiOS使うくらいならLinux使うけどw
どうなんだろうか。 「お前のは本当のオブジェクト指向じゃない」だとか不毛な論争の火種にしか なってない気はする。 もうちょっとコードベースのモジュール化やコードの隔離方法なんかを議論した方がよっぽど建設的。
>>300 > 一方、間違ったオブジェクト指向を使ってしまったWindowsは 最近2週間で一回ぐらいのペースで、開発者版リリースが行われてる。 これはMSアカウントを作るだけで一般の人が入手できる。 これって正しくオブジェクト指向を使ったからだろうね。 何とも言えんね ぶっちゃけいまのmsのアップデートはデバッグをユーザに押し付けてるようにしか見えんし よくわからない用語で煙に巻くって点がオブジェクト指向だね
オブジェクト指向だから早くリリースしてるんでしょ?w
既存のクラスはなるべくいじらずそのまま静かに置いておく オブジェ思考
"クラスとは構造体に操作する関数がついたもの"と "クラスはメッセージコマンドを受けて動く"の違い。 前者はプログラマが陥りがちなタイプ数が少ない暗号みたいなパーツの組み合わせと 責任の所在がわからない動作をぜひ作り込んでくれと言わんばかりのジャンクで まさにそのとおりのジャンクができた。
>>310 クラスと(そのインスタンスとしての)オブジェクトとの区別がつかない人間は永久にROMってろ きみが棲んでるジャンク界隈がそういう仕様なのは知ってるけど こっちはクラスにメッセージ送るとクラスがインスタンス作るんだ。 うん。
>>312 クラスと(そのインスタンスとしての)オブジェクトとの区別がつかない人間は永久にROMってろ いちいち()で囲まなくてもよくない? 無駄な仕事多くしてそう。(どうでもいいけど)
オブジェクト指向とかクラスが分からないのは多分メモリ周りのことが全然わからないからなんだろうな。 アセンブラからやれとは言わんが、メモリアロケータくらい自作したらオブジェクト指向がいかに理に叶ったものかわかってくるんだけど。
メモリアロケータを自作しないと理解できないってのもなぁ(苦笑)
オブジェクト指向がわからない人は関数型を勉強してないんだろうな 手続き型はオブジェクト指向のメリットを潰してしまうから手続き型の書き方しか知らないとオブジェクト指向は身に付かない
データのカプセル化ができてれば手続き型でもオブジェクト指向でも関数型でもいい気がするが
オブジェクト指向つっても当初の「継承で差分プログラミングうまー」 みたいなのは否定されてきたからな。 入門書だと哺乳類クラスから犬クラスと猫クラスとかやってるけど、 動物が沢山出てくるゲームや動物病院のカルテシステムを開発するとして、 いちいち動物種ごとにクラスを作ることはしないだろう。 インターフェイス以外の継承は最小限にというのを教えないと。 でも未だに入門書レベルだと著者が勘違いしている。
>>324 かといって、というか 継承ってのがどんなものなのか「だけ」を説明するのなら やっぱ犬猫でもいいんでねえのって俺は今は思う 継承をどう使って設計していくかってのはまた先の話 親、子A、子Bという三者の関係「だけ」示すのが動物犬猫 >>325 例自体は反対しないよ。 でもそれで継承というものがどういうものかは分かっても、 継承がどういうときに使うべき物なのかは分からない。 そこまで教えてる本ってあまりないね。 (HP)をプロパティで持った「キャラクター」クラスを作って それを継承した「戦士」クラスは"たたかう"、"ぼうぎょ"、"にげる"などのメソッドを持つ これを再利用して、「武闘家」クラスを作れば おなじ"たたかう"メソッドで武闘家はてつのつめで戦うようにできる。 さらには(MP)と"まほう"メソッドを追加で「魔法使い」クラスが… ってこの辺りで便利さがわかると同時に (MP)プロパティや"まほう"メソッドをどこにつけるかで混乱が始まって 継承の不便さが浮き彫りになってくるという。 全部独立パーツでそれを必要に応じて束ねて使っていればもっと取り回しが楽だったり
実装の再利用は継承でやるよりtraitが便利 smalltalkで発表されて、PHPに輸入されて、後は知らないが
Scalaとかの静的型言語がただのmixinをあえてtraitsと呼ぶのは誤解を招くよなぁ…
>>327 > それを継承した「戦士」クラスは"たたかう"、"ぼうぎょ"、"にげる"などのメソッドを持つ > これを再利用して、「武闘家」クラスを作れば 武闘家は戦士を継承していません。 そもそもオブジェクトの粒度が高すぎんだよ アビリティクラス的なものを作るべき
> ってこの辺りで便利さがわかると同時に > (MP)プロパティや"まほう"メソッドをどこにつけるかで混乱が始まって 全然混乱しないなw どこにつけるかなんてシステム次第だが ドラクエ方式であればMPプロパティはキャラクタークラスで 魔法メソッドなんていうのは、特技メソッドの表示名の違いでしか無い。
継承ベースだと キャラクター>戦士>武闘家というクラス階層で 90年代のバカみたいな継承信奉してると武闘家の後ろとかに "魔法使い"作って泥沼に嵌まるんだよな。 継承=オブジェクト指向だから。
継承を使いこなせないのは要するに馬鹿なんだよ オブジェクト指向も関係なくプログラミングの基礎が出来てないから
>>333 > キャラクター>戦士>武闘家というクラス階層で それはどう考えても間違った継承だろ。 継承信奉以前の問題で、継承関係にないものを 継承しているのは、お前が馬鹿だからってだけなんだが。 「よくバカな奴が"延々と"を"永遠と"って書いてたりするよねー」 「え、おまえ"延々と"を"永遠と"って書いてんの!?バカじゃね! 俺なんか絶対そんな間違いしないね!!おまえバカだろ!バーカwww」 「えっ?」
>>326 そやねぇ あまりないというか、見たことが無いw あともしそれを書いてる本があっても 入門者には意外と伝わらないと思う それを必要とする状況まで陥ってないと デザパタ本ですらろくに伝わってない 困って、考えて、本読むという順じゃないと多分ダメ …多分だけど 目的に合わせて正しく抽象化出来れば継承関係は自然に導かれるはず 継承だけに着目して教える/教わるという考えがそもそもおかしい
概念の継承関係とコードの継承関係を同じ目線で見ると失敗する
自分のモデリングの間違いを言語機能のせいにする な?要するに馬鹿なんだよ
オブジェクト指向もずいぶん枯れたわけだし、アンチパターンの確認から入るってのも悪くはない。
正しく抽象化できれば正しくできる、 って意味のないこと言ってどうすんの? その正しく抽象化する方法が問題なんでしょ?
>>328 その後は、rubyにパチモンが作られて「Rubyの偉大な発明」の仲間入りしたのでは? たとえば魔法使いと魔法という概念が"新たに生まれた"場合 それは魔法を使える魔法使いのみが使うから魔法使いクラスの固有プロパティなのか。 それとも、使えないだけですべてのキャラクターが持つ基礎パラメータなのか。 すべての基底クラスにMPデータフィールドを追加していいのか。 運を消費して奇跡を起こす聖者、MPやHPを消費して治療を行う僧侶などが あたらしく出てきた時はどこにパラメータをつけて相互管理すればいいのか。 現実でその時は"ただしい"と思った抽象化が根底から揺さぶられることはいくらでもあって (固定価格に追加される消費税、新たに追加される福祉控除項目、すべてを一元化しようというマイナンバー…) まず、そういう認識すら持たずに「ちゃんとちゅうしょうかしないからだよ ぼくならなんでもただしくちゅうしょうかできるからきみたちよりえらいのさ!」とか うそぶいている時点で君はいま指をさして静かに嗤われてるのを自覚した方がいい。
>>348 要するに正しく抽象化モデリング出来てないだけだなw お前が馬鹿な理由にオブジェクト指向も継承も全く関係ないわw 振る舞いの抽象化なら型クラスやインターフェイスを使えばいいし、実装の再利用ならtraitのような仕組みを使えばいい 継承による型の階層構造なんて邪魔にしかならんわ
モデリングに間違いがなくかつモデルが未来永劫変化しないならID:4cC坊やの言い分は正しいね そんな世界がやってくるといいね
とりあえず>>348 で言われてることを具体的にイメージできないぐらい"疎い"ってのだけはわかるよね… 多くのクラスに関わるモデリングを変えなきゃいけないぐらい大きな変更の例が列挙されていて オブジェクト指向の黎明期と違って、オブジェクト指向があたりまえの空気になった現代だからこそ 強力な束縛を持つ継承がシステム組み替えの際の足かせになってきてるって話の流れにまったくついていけてない。 お前らのは抽象化でなく、ただのぼんやりしたイメージ いわば妄想プログラミングだなw お前らみたいな馬鹿がまともに設計出来ないから 言語が馬鹿を縛れるような進化が求められてるだけなんだぜ ダメなのは言語ではないお前ら自身だ
継承にしろオブジェクト指向にしろ コードを簡潔にしたり、仕様変更に強くするために利用すべき技術だから 「猫と犬は哺乳類クラスを継承する、なぜなら猫も犬も哺乳類だから」ってのは 熟練したプログラマの発想とはだいぶ離れているんだよね 熟練したプログラマは書かなければならないコードが頭に浮かんでいて それを何処に書くかという整理整頓の意味で継承などの技術を使っているわけで 結局OOは整理整頓術で、どう整理したらプログラミングの効率が上がるかというだけの話 それ以上の意味はない が、整理整頓は非常に奥が深い
そもそも哺乳類と言うのが最初にあって そこから猫や犬が生まれたわけじゃないからな。 最初に猫や犬があって、そこから共通する特徴を もっているものを哺乳類と分類した。 どっちかと言ったら名前空間みたいなもので 継承関係じゃない。(だけど理解するのに役立つ) で実際のプログラミングでは哺乳類がどうとかいう話とは関係なく、 継承構造は役に立つもの
>>352 > モデリングに間違いがなくかつモデルが未来永劫変化しないなら 変化するからこそリファクタリングが重要なんだよね。 リファクタリングは汚いコードを修正することじゃなくて 過去の時点では正しかった設計を、 今の時点の変化に合わせて設計を変えることだから。 359 名前:デフォルトの名無しさん[sage] 投稿日:2016/07/13(水) 08:17:59.46 ID:+CQztjRc 継承はそういう時に身動き取れなくなるから困る
割とマジで「オブジェクト指向って継承って奴だろ」な人で 言われてることがまったくわからなくてパニクってるんじゃないかと。
原始時代じゃあるまいしそんなプログラマがいるのか? にわかに信じがたいな
美少女が人間クラスから継承できない問題は どうなったんだ? それでオブジェクト指向は破綻したときいたが。
ぱっと思いつくだけでも Unkoオブジェクトに量の概念をもたせて量がゼロのうんこを作るかNullObject的な対処をする うんこしないAngelクラスを継承する 排便の概念を抽象化したメソッドを用意してうんこ以外の可能性を見出す などなど なんとでもなるやろ
UnkoのサブクラスとしてOhgonクラスを実装するんや!
美少女はウンコをしない この「しない」という所が美しいんじゃないか 汚れなき乙女を全うする意志の問題だ これが「出来ない」という物理的構造に由来する問題に成り下がってしまったら 何の味わいもなくなるだろ チンコ勃たんわ
頭の悪い人の悲しいところは 頭の悪い冗談を好んで言い続けるということだ 飽きもせずに繰り返し繰り返し何度も何度も…
美少年にクラスチェンジすることで破綻せずにハッテン
というか>>211 で書かれてるとおりをまたワンパターンで始めただけだしな。 美少女ウンコ問題は高度すぎて解決の糸口すら見つからないもんな ついていけない奴の気持ちもわかる
ちょっとしたネタ書き込みにすら 知能やセンスがもろ出しになっちゃうから悲しいね >>372 それ言っちゃうと今度は意地になってレスし続ける可能性 >>372 面白くない→顔が白くない→色白でない→実は美少女ではない→ウンコしても問題ない なるほど要件の再定義によって解決か 解決しとらんのにワンパターンもくそもないだろ 根気のない奴だなあ
解決できると思ってるのが間違いだと気付くといいよ 分類学的な階層を作っても「書いた人どう対象を捉えているか」というどうでもいいことしかソースに残せない 鳩クラスと鹿クラスが同じ親クラスを持ってて、ニワトリクラスとブタクラスが同じ親クラスを持ってて、 一体どうしてと思ったらジビエと畜産肉で分けてたとか、食肉加工業者の仕入れ管理ソフトだったらあり得るよ そういう情報を一切俎上に出さずにAはBの子クラスであるべきか否かなんて話すのは無意味 そういう文脈をソースに組み込む必要があるかもまず考えないといけない
なるほど 現状の研究成果に比べると一風変わった意見だが私は興味深く聞かせてもらったよ つまり君はウンコをしない美少女が人間クラスから派生されるべきコンテキストについて もっと掘り下げた議論をすべきだと言うのだな ところで君はそういう文脈をソースに組みこむ必要があるかについては どんな考えを持っているのかね?
生成するUnkoオブジェクトのtasteフィールドが最大値になるだけ
>>380 いやねーだろw その手のシステムで種ごとにクラスを分けるわけがない。 全部同じクラスだろ。 まあなんでも抽象化すればいいってもんではないわな。 物質は究極的にはクォークのセットだからって、そのまま実装したらそりゃ破綻するだろうし。
君それは細分化やないか 美少女のウンコふりかけ食わしたろか
同じ型のインスタンスの振る舞いをポリモーフィズムさせるのは、 ・継承 ・委譲 ・switch文 ・関数ポインタ、ラムダ式 ・別途スクリプトなどを用意する などの方法がある
>>384 データはDB管理かもしれないしDBに沿った構成になるかもしれない UIで必要であれば 380 の構成もありえるし だから 380 は文脈と言ってるんだろうに どんな文脈やねんw 肉屋の仕入れアプリでブタにダンスでもさせる気なんかw そんなら俺はウンコを我慢する美少女の方がええわwww 何でも文脈言えばええっちゅーもんちゃうでホンマ
>>389 いや、当然RDBMSでデータ管理しているという前提だが? 計算式が面倒になったら またどうせオブジェクト指向になるんだろ
>>380 > 一体どうしてと思ったらジビエと畜産肉で分けてたとか、食肉加工業者の仕入れ管理ソフトだったらあり得るよ 見たこと無いが「あり得る」という話なら、 C言語でgotoばっかり使うってのもあり得るよ。 C言語なのに、オレオレライブラリとマクロを使って COBOLみたいに使うことだって有り得るよ。 お前の大好きな言語をクソみたいな使い方する方法だって有り得るよ。 有り得るかどうかを語るのって意味なくね? クソみたいなコードを書くのは書いた人間が悪いのであって 言語の問題でもオブジェクト指向の問題でもない。 >>393 というか、人間がプログラムをユニット単位に分けた時に "こいつはこういうコマンドを与えれば勝手にそれをやる単位"って 分け方をすれば『人間がわかりやすい』だろう。ってのが いまあたりまえのメソッド型オブジェクト指向なんで、 こうすれば"副作用"が出ない!って計算式の方はむしろ 問題が起きないように『機械の都合に人間が合わせる』流れで たぶん遠からず下火になるわ、あれ。つかもうなった感じ。 むしろ、アルゴリズム解析みたいなのを開発環境がやって こうすると副作用が最小になるっぽいですよ?って AIがサジェスチョンするようになんじゃね?つか。 それはどうかわからんよ もともと機械の都合で生まれた静的型が 実は人間にも優しいってことで大人気だし 本来静的型じゃなくても動く筈の動的型言語も どんどん静的型の機能を取り入れていくのが今のトレンドでしょ それに、副作用の無い関数型は全然機械の都合じゃないし あれは数学の理論とかから生まれたような理論先行のもので コンピュータの動作原理を考えたら、むしろ副作用ありの方が 自然だと思う 副作用ありの静的型言語が一番機械の都合に合っていて その金字塔がC言語であり、今でも使われ続けている 主にローレベルなことやOSの開発やドライバの開発などに 使われているのは、それだけ機械の都合にあっているから 昔の言語なのに破たんせずに使われ続けているのは それだけコンピュータの動作原理を素直に表現していて 流行り廃りというものと無縁だから
Cで書いたコードが速く動くようにCPUやOSが設計されているという面も あるからぬ…だからって新世代の言語に合わせてCPUやOSを作り直すか? といわれたらそんなことは起こりっこないと断言できるが
おまいさんそれは逆ですぜ。 Cがアセンブラに馴染み易く出来てるんですぜ。 でも本来はintelの系統じゃ無くて、 モートローラとかミニコンから派生した石に馴染み易く出来てるんですがね。 まあ、Cが最初からintelの石用に作ってたら、 もう少し違った構文になってたかもね。
アセンブラやってた連中が、構造化プログラミングを提唱して、 プログラムを小さな塊の組み合わせで作る様になったんで、 同時期に条文分岐やサブルーチンの扱いをマクロ処理を被せて 読み易くするのが流行ったんだよ。 それをもっと書き易くして行って出て来たのがコンパイラ言語 いわゆる高級言語だけど、簡単なアセンブラへの置き換えしかしてなかった。 今ではそこから更にそれら高級言語を分かり易く記述出来る高次な高級言語が流行ってるけどね。
例えば、hoge+とかやれば自動的にインクリメントしてくれる仕様だって、そういうアセンブラ命令があったからなんだぜ。
>>397 >Cで書いたコードが速く動くようにCPUやOSが設計されている 何を根拠に? >>399 時系列がぐちゃぐちゃじゃね? 最初の高級言語と呼べるものはFortranだけど、 数式を人間フレンドリーな形で記述できるのが売りだった。 Fortranはアセンブラの簡単な置き換えレベルではないでしょ。 構造化プログラミングはALGOLからだろうけど、 Fortranより後だし、Cのようなレベルに達するのはもっと先。 自信を持って声を大きくして叫び続ければやがてそれが歴史となる
Cの何がすごいって、メモリに対する考え方がシンプルで凄い 構造体のメンバは単なる先頭からのオフセットだし 配列の添え字も先頭からのオフセットでしかない しかも配列とポインタはある種の互換性がある だから何だかよくわからないメモリブロックを 構造体にキャストしてアクセスできたり 同様に単なるメモリブロックを配列としてアクセスできたりする メモリの扱いがとにかくシンプルでありつつ強力なアクセス方法があり応用が利く こういうことができる言語はあまりない C++ですらvtableが入ってたらもうオフセットずれるし
>>406 言語の実装がシンプルなのと、その言語を 使ってアプリを実装するっていうのは別の話で なんでも一つの機能で出来てしまう言語っていうのは、 冗長で意味代わりにくいコードになりがちなんだよ。 例えばシンプルと言うのならアセンブラが一番シンプル 条件判定命令と条件ジャンプ命令だけでループを表現できてしまう。 プログラム言語っていうのは、特定のパターンに対して 専用の命令を作ることでコードの可読性を高くしてきた。 これは圧縮の仕組みにも近い。特定のパターンに短い単語を当てはめて 簡潔に書くことができるようになる。 条件判定命令と条件ジャンプ命令さえあれば十分であっても そこからforパターンやwhileパターンを見つけ、専用の単語に 割り当てることで可読性が高くなる。 だからCだけが生き残ったんだろ? 大衆プログラマが望んだ形で変化した結果だからな。
生き残ったっていうのは古い言語とくらべての話? 確かにFortlanとかPascalは消えた。 多くの優れた言語が生まれている中、今でも通用するのは C言語ぐらいだと思うが。
>>410 第三者の人が検証できるランキングとかある? そりゃどこか目につかないところではあるかもしれないが、 例えばその言語で仕事したいと思ったとき 探せ出せないような言語は消えたと思っていいだろう。 >>411 Intel Visual Fortran とかググッてみ。 リアルタイムで今も製品出てるのを消えたとは言わないでしょ。 >>408 ということで、C以外も生き残ってるんだが?w 問題は暗黙に行う言語の動きに対してどれだけ コンセンサスがとりやすいかってことだ。 c++ はもうその意味でどっか行ってる。
>>407 俺の言いたいことはそういうことじゃなくて ローレベルな世界ではその言語固有のオブジェクトになってない 単なるメモリブロック、データ、信号を扱わなきゃならない場面が多いんだよ それはファイルから読み込まれるかもしれないし ネットワーク越しにやってくるかもしれないし ディバイスとのやり取りかもしれないし ま、要するに単なるデータ Cはメモリモデルがシンプルだからこういった単なるメモリブロックを扱うのに 長けているんだよ 構造体にキャストするだけでそのまま扱えるから 今でもC言語が現場で活躍しているのはこれができるから もしこういったことが出来なかったとしたら、C言語なんかとっくに滅んでいたに違いない メモリブロックをキャストして構造体や配列としてアクセスできないとしたら そんなC言語に価値なんかあるか? その一点がすごいんだよ、マジセンスある、もしくは運が良かった そして多くの言語が見落としがちな部分でもあったんだよ オブジェクトにしなきゃならないっつってvtable持たせたり 動的にしなきゃならないと、メンバをオフセットではなくハッシュにしたり どんどん賢い機能を盛り込んでさ その点C言語の構造体や配列はフラットでむちゃくちゃシンプルな作り 適当なメモリブロックをキャストしても何の問題も起きない 仕様もシンプルで分かりきってる
別に必ずしも偉い機能を盛り込むのがダメと言っているわけじゃないよ ただ、Cが何故か生き残っていて今でも使われ続けている原因はソレということ C言語の用途と、うまい具合にマッチしてて、いい感じに生き残っている
構造体の先頭メンバ以外のオフセットは規定されていない まぁ、オフセットなのでメンバアクセスでどうとでもなるわけで 構造体が定義されたままメモリ上に存在していると考えているアホ 一般的なコンパイラなら定義通りだろうけど規定されていない 規定されていない規定されていない
構造体のメンバ間のパディングは未規定だけど、オフセットが未規定って言うのは 順番も入れ替わるって言ってるの?
簡単に入れ替わるさ。 わざわざ入れ替えないでねと指定するレベル
構造体のメンバの順番が入れ替わらないのは仕様で決まっているよ 決まってないのは間に入る詰め物だけ http://portable-c.jugem.jp/?eid=17 しかし、詰め物をどうするか、指定できるコンパイラがほとんどだから 実質的に詰め物も問題にならない C言語プログラマーは自分の使っているコンパイラの仕様ぐらい分かって使っているからね 問題になるとすればエンディアンぐらい intのサイズがアーキ依存だから通信に構造体は使うなってのが常識だけどな。
cはメモリは意識するがレジスタは隠蔽するって落とし所がよかったんじゃない。
Cはパーサが複雑なのとゼロコストで導入できる便利機能が無いのを除けば悪くはない
cの最大の失敗は波カッコ ブロックのスコープがパイソン風だったら人類は1世紀以上先の進んでいた
代入演算子=と比較演算子==だけは許されざるよ。 つうか、IDEのサジェスチョン機能実装前の "タイプ数が減る云々"な言語はすべて滅ぶべし。
C言語は特徴ある機能で生き残ることができた。 だけそのその特徴ある機能がなかったら生き残れないのか?というと そうではない。現にその特徴ある機能がない言語ばかりだからだ。 ここから言えることは、なにもない言語は消え行く定めだが、 C言語の機能がなくとも、それに上回る機能があれば生き残るということだ。
>>429 IDEを使うことでタイプ数が減る機能はどうでもいいんだよね。 どうでもいいというのは、タイプ数が多くても少なくても さほど違いはないということ。 重要なのはタイプ数じゃなくて読む文字数だから。 ただしタイプした文字数=読む文字数ではないということ。 どういうことかというと、人間は文章を読むとき 読み飛ばしをするということ。 例えばJavaでいうimportやMainクラス定義なんかは 読み飛ばす部分。だからそんなところで読む数の違いは出てこない。 また型定義は読むところではあるが、型定義だけを読むことで 型を理解できると言うメリットが有る。 これは型が書かれていないコードから、型を解析する 作業よりも読む文字数は少なくなる。 Cが生まれた時代はな シンタクスハイライトどころか下手すると スクリーンエディタ(キリッ カットアンドペースト(キリッ すら高価な機能だったんやで
Cが生まれた頃にはまだコピー&ペーストはなかったぞ。
最初のクリップボードはAltoかな Cが1972年でAltoが1973年
>>430 で、その、この先生きのこるのはどの言語! アセンブラ C Fortran Lisp の古代言語 Javascript COBOL Python HTML PHP はなんだかんだ言って生き残るんだろな~ あとは Java がどうなるかな
お前ら、テーマに戻れや。 なぜオブジェクト指向は愚かな考えなんだ?
初期設計を少しでも間違えたり手抜きしたら そのシステムの成長絶望的になり死ぬ
>>444 そして>>41-42 で完全に解説完了 ジョークとしてわざとオブジェクト指向として間違ったプログラム例だしてるってのに 「この通りオブジェクト指向は直感に反して~」じゃねぇっつのw >>440 Javaは普及してるから残るだろうなぁ なんか、いつものベストじゃないけど普及したから ベターとして残るというプログラム史のいつもの展開というか。 問題はそういうジョークを本気にする人が多すぎるってことだろうに。 つまりオブジェクト指向ってのは一般にコンセンサスをとりずらい概念なんだよ。
>>446 コーヒーの例は単純明快だからいいけど、美少女は実際に正しく設計できるやつが日本に何人いるかってレベルだろうな >>448 これをジョークだと思って実戦に挑む奴がデスマーチを引き起こす くだらん与太話はこれくらいにしてそろそろ全力でウンコ美少女問題に取り組むか
ウンコしない美少女は偶像 つまり人間からの派生ではない
なんか、いっつも同じレベルの書き込みするから 自演になってないって自覚しとる?きみ。
ユーザーはうんこなんて機能は求めて無いから削除しろよと
人間がウンコするのは、 ユーザーが求めているからなのか?
ソフトの機能に不要な要素まで組み入れても誰も買わないだろ。 現実の要素を完全に網羅する必要は無いから
それは当たり前のことではあるな 必要な要素だけ実装すればよいからな Humanクラスがどういった要素を持つかは案件によるし もし人の持つすべての機能をHumanクラスに実装できるっていうんなら そのHumanクラスにプログラムも書いてもらえばよい よって現実の人間がうんこをするからと言って 必ずしもHumanクラスにうんこをする機能が必要かどうかはわからないし 必要な案件に出会ってから美少女クラスのうんこの扱いについて考えればよい
要件で一言も触れてないのに「はぁ?○○はあって当然だろ」とか言い出す顧客しかいないから 想像できるものは全て詰め込んでおく必要がある。 ウンコだろうとゲロだろうと例外はない。
肝心なことを決めずに作り込んでいく。 美少女クラスのスーパークラスは人間クラスである。 排便メソッドは関係ないからそれでいい。 だが、ある時ユーザーからの要望で人間クラスに排便メソッドを作った。 人間だもの、当たり前だ。 それでいいと思った。その時がくるまでは。 ある時私は気がついた。 これだと美少女が排便すると www
このスレ的にはgo言語とかD言語のダックタイピングってどうなん?
ダックタイピング 由来 アヒルのの鳴きマネをする人間はアヒルに違いない
ダッチワイフィング 由来 オランダの人妻はエロいに違いない
COBOLからJavaへの移行で「実際に」成功した案件は存在しない
>>468 COBOLって単なる言語じゃなくて運用まで含めたシステムの総称だからな。かなうわけがない とは言え、高賃金のCOBOLプログラマーもいずれ死に絶えるわけでなんとかしないといけないんだけどさ Adaなんか勉強して損した オブジェクト指向を考え出した人間もオブジェクト指向の解釈を誤っていたのではないか クラスというのは人間が直感的に思い描く世界の事物をプログラムコードにマップする手段ではなくて、 プロセスという大きなチューリングマシンの中の小さなチューリングマシンを記述する手段にすぎなかった (チューリング完全性の利用例の一つだった クラスのコンストラクタは状態機械であるところのチューリングマシンの初期化と生存期間の始まりに相当する デストラクタは後始末と生存期間の終わり。 メソッドはチューリングマシンにlive timeを与え、計算を進めさせる。 そんだけ 状態(mutableなデータ)を含むから関数型プログラミングとは似て非なるものだし、 数学的にカタをつけるにはチューリングマシンの一変種で無限長の磁気テープをクラスで小分けにしたもの、 としか言い様が無い
こう考えると継承のしくみを使ったプログラミングが ごく一部のデザインパターンにおいてしか成功しないことも理解できる 継承というしくみのは人間が「こうだったらイイなあ…」と思い描いて作っただけで、 >>476 な解釈からは必然性が出てこない つまり継承というしくみは論理的妥当性を欠いており、 継承を下手に使ったらあちこちで矛盾が生じて話が発散していく傾向なのも仕方が無い だいたいプログラミング業界って、 新しいものが導入される →古いものはやめてこれ使いましょう →新しいものも色々問題があることが分かってくる →極力使わないようにしましょう の繰り返しだからな。継承しかり例外しかり。 最近はテンプレート使いすぎなんじゃねーのって思うけど。
> 継承しかり例外しかり。 継承も例外も極力使わないようにしましょうなんて 誰も言ってないが? 間違った使い方が明らかになって、 間違った使い方をしないで 正しい使い方をしましょう。 っていう結論ならばいつもそうなっている。 継承しかり例外しかり。
結局、人間クラスと美少女クラスは どうすればいいんだ?
>>479 正しく使おうってのは常に真だから内容が無いのと同じだな。 できるだけ使わないようにって風潮はある。程度の差はあれgotoとかと同じ。 javaはオラクルがVMを提供しなくなったら 廃れるだろ。
>>479 結局、言語の問題よりも馬鹿を入れない事のが重要ってことだろ。 そういう意味じゃ linus のやり方は正しいってことになる。 >>481 > できるだけ使わないようにって風潮はある。 無いよそんなのwww アルアル言っていても、 嘘がホントになったりしないアルよ~w (定義が論理的に妥当でなかったりあいまいだったりするとお議論が紛糾する例
多少コピペが多くなっても継承をむやみに使ってはいけない場面ってのは想定しなきゃなぁ
なんで継承をやめたらコピペが多くなるのかそれがわからんw 正しく継承使うといういうのは、 継承以外の方法を使うべきときに、違う方法を使うという意味であって、 ならばその違う方法で、コピペを回避すれば良いんだよ。
委譲を使えばいいんだろ。 肛門クラスを作って、 人間クラスと美少女クラスのプロパティに肛門インスタンスを持てばいいんだ。 排便できる肛門と出来ない肛門と。
コーデングテクニックでごまかすのはアカンね そーゆーことするから所謂ひとつのスパゲッテイー的ソースコードが出来上がるんや デザインの問題はデザインで解決出来な一生炎上商法プログラマーのまんまやで
>>487 ミックスインの手法が確立されてないってことは、継承が害悪になる場面ってのはあるんだよ。 そういう場合は、下に書かれてる通り、コンポーネント的な設計が必要。 そういう時に、コンストラクタでコピペが必要ってこと。 そうするとインタフェースの定義が必要になってくるから、結局継承が楽だし、よほどのことじゃなければそれで済ませるんだけどね
だから、委譲というか、 デリゲート使えっていうか。
ほんと最近、is-a関係、has-a関係っていうの 軽視されてるよな。 is-aのときに継承すれば良いんだって 昔から言われてるんだが。 これは古い概念じゃないぞw
>>494 is-a関係は一般に存在しない 例外なのは同値関係と包含関係が数学的に定義できて無矛盾性が担保された (=直接証明されたか、より一般的な体系の無矛盾性に帰着できる)ケースだけだが そんなのはスゲーまれ いっぱいあると感じるのは錯覚 不用意にis-a関係を導入することでクラス分けにあいまいさが紛れ込み、 プログラムの設計とか簡単に壊滅する その点ha-a関係はやりやすいなぜなら単なる集約であって分類が絡まないから has-a関係の導入自体が矛盾を生じることは無いからだ
is-a関係だと思っているものは全てhas-aとしても実装できる。 概念系統が複数ある場合、is-aでは多重継承もしくは、 全ての組み合わせの派生クラスを定義することが必要だが、 has-aではそういう問題は無く柔軟に設計できる。
OO使わない場合に フラグとかカウンタとかステータスってのをどう管理するのかを 単刀直入に知りたい。 関数型なんかでもこの辺がよくわからない (消せるはずはないから何か別の概念などで整理・管理されるんだとは思うけど)
>>499 普通の構造体でいいのでは?(Cでいうところの) is-a だったらliskov置換原則の方が理解し易いし、コード書くときの指針になる。
ちなステータスというのは大概I/Oを通じて外界と繋がっている事物の結果を意味し、 実時間軸上でうつろうもの(mutableなブツ)なので厳密には関数型プログラミングに存在し得ない概念 関数型プログラミングでは「1」を返す関数と、和を返す関数から「1」+「1」=「2」という演繹ステップを経て 「2」を返す関数を作る、というように演繹ステップとしての時間経過しか扱わない これでどうやって実時間で動くシステムをプログラムするのかというと、 演繹ステップの順序と実時間軸上の物事の変化順序が一致するように関数を設計してやって、 擬似的に演繹順序を実時間軸上の順序と合わせてそれっぽい動きを実現しているわけや 例えばHDDのエラーステータスとか、昨日のステータスに対し今日のステータスが変化した、と捉えるのではなしに、 「HDDの昨日のステータス」を返す関数と、ステータスの適切な処理に対応する何がしかを返す関数とから 「HDDの今日のステータス」に対する処理に対応する何がしかを返す関数を生成する ことでHDDの今日のステータスを処理する
>>494 女は一般に存在しない いっぱいあると感じるのは錯覚 って言ってるようなもんだなw 一般に存在しないというのなら 存在しないと言う根拠を書け >>504 is-a関係は一般には存在しないと書いたのじゃ 例えば妻クラスを女クラスの派生クラスにしたりしたら、同姓婚が合法化されたときプログラムは作り直しになるであろう また、なんで女クラスの派生クラスが妻クラスではいけないのか?その根拠を目下人類は手にしていない はい論破 ちな、有限集合に関しては無矛盾性は常に証明できるから別に 女クラス←妻クラス でも 妻クラス←女クラス でも良いが、有限のケースしか想定しないんならswitch文で良いやという話で オブジェクト指向の出る必然性がかなり減る あくまで無限集合としてのクラスXを今数学的に正しく定義付けできるか?(X=妻 or 女 or so on)というのが問題 is-aかどうかなんて抽象的すぎて判断の材料になんないよな。 何を持ってしてis-aとするかが大事なんだけど、そこをきちんと答えられる人は少ない。
>>505 そりゃ妻のような一時的な属性に過ぎないものををクラス化するのがそもそも間違ってる 同性婚以前に結婚離婚で既に破綻してるじゃないか 例が悪いので説明になってない、やり直し >>507 男も改造すれば女になりうるから、男クラスのインスタンスを作ると、参照を維持したまま女クラスに変身できない。 だから、is-aなんてものは、性転換をしないという契約がなければなりたたない。 契約をしてないのにis-aなんて言いきれる訳ない。 妻とか女とか、単なる属性をクラスにするからワケが分からなくなる。
口に肛門つけてください。 しゃべれるしうんこできるし便利だと思うんです。
話についていけない子が 必死で面白レスしようとするのが悲痛 人間の悲しみが透けて見える
>>505 > 例えば妻クラスを女クラスの派生クラスにしたりしたら、同姓婚が合法化されたときプログラムは作り直しになるであろう ならないなw お前設計がおかしいよ。 妻をクラスするって発想がそもそも キチガイじみてる。 普通は性別は属性だよなw 人クラスがあって、名前・年齢・性別 ほら属性だ。 そのうち佐藤クラスを作るとか言いそうだwwww
is-a関係っていうのは必要条件であって十分条件じゃないんだがw is-aになっていれば必ず継承関係にあるってことじゃない。 継承しようと思ったとき、is-a関係を満たしていなければいけないって話だ。
オブジェクト指向ってどこで間違ったんだろう 途中までは良い線行ってたと思うんだけど、どこからか使いものにならなくなったよね
オブジェクト指向が使われてない フレームワークなんて無いんだが? 使い物にならなくなったという考えがそもそも間違いだな。 まあ「使い物にならなくなった」と言い続けることで 他の人に事実だと錯覚させようとする手段ニダ?w
>>517 本当にオブジェクト指向が必要だから使っているのか、 抽象化の手段がオブジェクト指向しか無いから使わざるをえないのか 昨今の言語なら継承以外の方法で抽象化とか再利用とかできたりする OOは本当に最小限にして、late bindingやメッセージパッシングの妙を際立たせるとより効果的 Real World OCamlだとヘテロな型を持つ木構造を探索するのに使ってたりしたな 継承捨てて委譲を使えっていうのは マイクロソフト用語でコンポーネント指向っていうんだが、 これを意図的に取り入れたのが2000年前後に使われていたVB6なんだよな。 そのVB6も.NETになってから継承をサポートしたし、 コンポーネント指向だけではだめだということだろう。
>>519 オブジェクト指向は必要だから使うんじゃなくて いくつもある手段の中から一番適切だから使うんだよ。 お前が例示する使い方は、単にオブジェクト指向じゃないほうが 適切だってだけ。そしてオブジェクト指向が適切だから ほとんどのフレームワークでオブジェクト指向が使われている。 他に代替技術があるにもかかわらずだ。 >>513 だからその設計はねーってこと言ってるんだろ。 日本語読めないの? >>516 >どこからか使いものにならなくなったよね C++の奇形めいたオブジェクト指向は衰退して 別方面で進化してきたObjecive-CとJavaが本流として いま街でみかける全てのスマホアプリを支えてるけどな。 今はObjrctive-CじゃなくてSwiftじゃね?
>>521 適切だから使うというなら何故デザインパターンなんて出てきたのか? デザパタの大部分がOOに適さない問題を無理矢理OOで解決するためのもので、 他の手段が使える言語なら間違いなく採用しない 他にもExpression ProblemをJavaで解決しているのとOCamlで解決しているのを比較してみるといい OOだと論文書けるくらいには面倒な方法があるけど、OCamlのVariant使った方法と比べて圧倒的に可読性と簡潔さに劣っている JavaはC++よりレガシーな言語になってしまったが…
>>525 > デザパタの大部分がOOに適さない問題を無理矢理OOで解決するためのもので、 違う。OO便利だなーって使っているうちに 設計のアルゴリズムが確立されていって、 それをまとめたのがデザパタ いや、デザパタはOOと関係無いから。 関係あるのはOOPの方
>>525 > デザパタの大部分がOOに適さない問題を無理矢理OOで解決するためのもので、 おしい。 デザパタはJavaやC++に適さない問題を無理やりJavaやC++で解決するためのもので、 SmalltalkやSelfで書けば圧倒的に簡潔かつ明瞭に記述できる。 smalltalk だと、人間クラスと美少女クラスの問題は どう解決するの?
Squeak Smalltalk だと、こんな感じか? Object subclass: #人間 instanceVariableNames: 'もろもろ' classVariableNames: '' poolDictionaries: '' category: '美少女-排便'. 人間 compile: '排便 ^#便'. Trait named: #美少女 uses: #() category: '美少女-排便'. 美少女 compile: '排便 self notify: ''トイレには行きません''. ^#プリン'. おまえら := 人間 new. おまえら 排便. "=> #便 " 橋本環奈 := 人間 new. 橋本環奈 assureUniClass class uses: 美少女. 橋本環奈 排便. "Warning: トイレには行きません => #プリン"
>>531 > SmalltalkやSelfで書けば圧倒的に簡潔かつ明瞭に記述できる。 例えば、どのパターンが簡潔明瞭に記述できるの? 一番簡単なパターンでいいので書いてみて。 考えるのが面倒なら俺が出題しても良い? Singletonは個人的につまらないので そうだね、DecoratorはSmalltalkやSelfで書いたらどうなる? シングルトンなんて言語に最初から組み込んでおけ(Scala信者並感)
>>532 そもそもきみは継承関係=オブジェクト指向でしか発想してないから クソ邪魔くさい継承取っ払ってモジュール自由に組み外しできるタイプの オブジェクト指向の話にまったくついてこれてないからずっと嗤われてるわけで。 >>535 別にDecoratorじゃなくていいんだけどね。 圧倒的に簡潔かつ明瞭に記述できるっていってるから そのコードを見たいだけ。 デコレータパターンはそもそも静的に型がつけられることからくるクラス階層への制約を誤魔化すための小手先の技術でしかない。 型が完全に動的なSmalltalkやSelfではデコレータパターン自体が不要。
型が動的だと>>535 の例のようなコードはどうなるの? そそ 例えばアセンブリや機械語は制約がないからデコレータパターンとか要らないでしょ それと同じでSmalltalkには何も必要ないよ
全然違うのだが。デコレータもSmallTalkも理解してないとみた。
なにも知らなくても語れる。 それが Smalltalk のいいところらしい。 人間の悲しさがほの見えるな・・・
>>540 Smalltalkはよくわからないけど、 DoublePriceとかWholesalePriceとかいうクラスを増やすより、 元値から実売価格を計算するクロージャを持たせるんじゃないかなあ。 SmalltalkのPluggableMVCとかもクロージャで柔軟な変換を実装しているし。 >>543 これだと Java 版でいうところの getValue() する前に 毎回、二倍にして 利益80乗せて、また二倍にしてもう一度 利益200乗せて…とかって いちいち書かないと 840を返せないから、結果は合っているけど要求仕様を満たしていないような気がする いつになったら、 人間クラスと美少女クラスの問題に辿りつけるのかね? 悲しいの~。
どう解けてるんだよ。 人間の肛門と天使の肛門にコンポーネントするのか?
用途も分からず闇雲に現実世界をクラス化して行ったら、一生掛かっても終わらないから無駄な事すんな。
もうそろそろいいかな? みんな「デコレーターパターン」をどうするか?というテーマで 会話が成り立ってるよね? つまりこういうことさ。デザインパターンっていうのは用語。 実装じゃない。 デコレーターパターンをJavaならこう書く、SmallTalkならこう書くと いうふうに共通認識ができてる。これこそデザインパターンの有用な所。 だからコードの書き方が決まってるわけじゃないんだよ。 設計だからね。言語が決まらない状態であっても話はできる。 デザインパターンをどういうふうに書くかってのは例でしか無いんだよ。 目的を達成できるならどう書くてもいいし、デコレータパターンを どう書いてもそれはデコレータパターンなのさ。 SmallTalkであってもデコレーターパターンっていうのは存在する。 だからこそSmallTalkでデコレータパターンをシンプルに書くことができる!と 主張できる。
>>553 なんでみんなより二歩も三歩も手前な意見を そんな長文で書き込めるの? Smalltalk の t を大文字で書くやつは無知か知ったかぶり
実は誰も Smalltalk なんて知らない www
言語は関係無いと言う内容の話への反論が、言語名のミスプリントの指摘とか、レベル低過ぎだろw 小学生の負け惜しみかよw
>>561 え?それ反論だと思ってたの? 反論はまだ一つも来てませんよw >>553 >>538 で「見たいだけ」って言ってるところをみると、これは反語で >>546 みたいに簡潔なのが出てくるとはこの時点では考えてなかったんじゃない? だからデザパタは用語で実装じゃない、言語は関係ないって趣旨替えしたように読むのは穿ちすぎ? >>565 いやw 最初からこのために、 デコレータパターンをSmallTalkで書いたらどうなるの?って 話題を振って会話をさせたんだよ。 デコレータパターンという共通知識があり、 SmallTalkでそれを実装することができるという会話をね。 もし実装が決まっているものであれば、 SmallTalkでデコレータパターンを実装すれば シンプルな形で実装できるんだっていう話はでてこない。 そもそもC++でデコレーターでもそんな難しくないでしょw シングルトンの方がよっぽどややこしい。
「シングルトン」だけで話が通じる所がデザインパターンの 便利なところだね。 さてシングルトンにもいろんな実装があるけど、 DIコンテナを使ってシングルトンに見せるっていう方法もあるよね。 これだと普通にクラスを作るだけで良くなる。
Smalltalk の最大の魅力は、 それが雑談に過ぎないということである。 by アラン・ケイ
>>566 まるでちがう。>>546 はデコレータパターンじゃない。 Javaではデコレータパターンを使う問題を デコレータパターンを使わずにより簡潔に記述した例。 Wikipediaにある > Decorator パターンの方針は、既存のオブジェクトを新しい Decorator オブジェクトでラップすることである。 がわかってない奴がいるな
デザパタの目的とされがちであるが 常に失敗しているのが語彙の共有 いつでもつねに認識がバラバラw
>>579 ごく一部の人間が正しく理解できてないだけで、 > いつでもつねに認識がバラバラw は言い過ぎ Smalltalkに意味なんかないよ 登場してから30年とか40年とか経ってるのに 誰も現場で使ってない言語だからね 40年という歳月は結論を出すのに十分な時間だと思うよ これから先もずっと使われないだろう こんな言語についてあれこれ考えるのは時間の無駄だよ 御幣を恐れずに言うと、Smalltalkは間違っている、机上の空論 本当によくできていたなら、もうちょっとぐらい使われていてもおかしくない 少なくともRuby程度ぐらいには使われてないと話にならない Smalltalkは実用にならないスジの悪い言語だということ
Smalltalkは言語だけじゃダメで。 windows上では使い物にならないから仕方無い。
要するに、windows自体がオブジェクト指向に向いてないんだよ。
結論。 誰も Smalltalk なんて知らない www
それは関係ない なぜなら概念上の問題より運用上の問題のほうが大事だから いくら概念的な素晴らしさを語ったところで まともに運用できないならゴミ 使えない
>>574 > Javaではデコレータパターンを使う問題を > デコレータパターンを使わずにより簡潔に記述した例。 お前は勘違いしているな。 デコレータパターンを実装しなさいというお題なんだから それがデコレータパターンなんだよ。 Javaならこういう実装でやるが、他の言語では その実装方法が違うだけ。 >>582 まあ仮にSmalltalkが本当に誰も使ってなくて 処理系も失われたり、あるいは as-is で放置された言語だとしたら そんなものに意味がないって意見は全くもって正しいよね シングルトンやアイテレーターなどは時代が変わっても重要だろうけど、 デコレーターは継承関係への依存度が高いから微妙だな。
>>583 Smalltalkは独自のGUIもそうだけれども、もうひとつ、通常のセルフホスティング (自身で自身を記述)にとどまらず、処理系を構成する実行時オブジェクト群を 仮想イメージと呼ばれる、ある種のオブジェクトストアに永続化して次回起動時も 継続利用する運用スタイルも毛嫌いされるよね。個人的には示唆に富んでいて好きなんだけど >>587 いや? クロージャで実装しているのだから、デコレータパターンによる実装ではないよ。 コード読めない子? > クロージャで実装しているのだから、 クロージャで "何を" 実装しているの?
デコレータパターンを実装できてはいないんだよw これでわかった?w
いや、何を実装したのかを聞いたんだが? 実装したものは何?
>>590 あのあたりはむしろメモリや記憶装置いくらでも使える現代向けというか 過去にオブジェクト指向の要素をちょっとだけ輸入してみた中途半端なオブジェクト指向言語が次々出ては滅びの興亡続けてたのは "コンパイル後のサイズが大きいじゃないか"とかいまじゃヘソが茶を沸かすような理由がメインなわけだし。 デコレータパターンと同等の機能をクロージャで実装した じゃね? 同等の機能を持った違った実装があるのは当たり前じゃね? デコレータパターンと同じような機能をもたらすけど デコレータパターンじゃない実装は普通にあり得るんじゃね?
>>595 パターンは機能じゃないよ。設計。 デコレータパターンという設計 この設計の実装はいろいろある。 決まっていない。 Javaだったらクラスで実装し クロージャーでも実装できるってだけの話。 >パターンは機能じゃないよ。設計。 それで、その設計パターンとは合致しないけど 同等の機能や目的を満たす他の設計はあり得る ってことでしょ? 俺の言ってることと一緒だね
ID:jTAWnEUaを教育してあげる義務は我々には無い
>>599 わざわざ複雑にしないでいいよw やりたいことがある。 でも説明するのが面倒くさい。 じゃあ「デコレーターパターン」と呼びましょう。 これで話は通じてるじゃん。 だからこれだけの情報でコードを書くことができる。 そのデコレーターパターンを クロージャーで実装したんでしょ? そういえば良いんだよ。 >>600 じゃあ一緒に勉強していきましょう(笑) http://www.techscore.com/tech/DesignPattern/foundation/foundation1.html/#dp0-2 > 前章でも説明したとおり、デザインパターンとは、「よく出会う問題とそれにうまく対処するための設計」を > まとめたものです。 デザインパターンを利用するメリットとして、最初にあげられるのが、 > 「再利用性の高い柔軟な設計ができる」という点です。各パターンには、多くの知恵が凝縮されています。 > これまでは、設計者の直感や経験などに依存していた設計が、デザインパターンを導入することで、 > 初心者でも先人たちが詰め込んだ「知恵」を利用した設計をすることが可能となります。 > また、先人たちの知恵を参考にすることで、設計力の向上も期待できます。 > > 次のメリットは、「技術者どうしの意思疎通が容易になる」ことが挙げられます。 > デザインパターンを習得している技術者どうしであれば、設計について相談するとき > 「Singleton パターンで行きましょう」とか「Strategy パターンが応用できるのではないでしょうか」と > いうようにパターン名で設計の概要の合意を取ることが可能です。デザインパターンを > 習得していない技術者には「こんなクラスを作って、このクラスはこんな役割を持っていて・・・。」と > 延々と説明しなければなりません。このように、デザインパターンを学習しておくことで > 開発者どうしの意思疎通がスムースになるのです。 あなたは何で勉強していますか? 話をややこしくしているのはあなたです >パターンは機能じゃないよ。設計。 ↑これは君が言ったことだよね その上で俺は、同等の機能を持った、違ったデザインなんじゃね?って言ってるわけ 機能が同じであっても、同じデザインパターンとは限らない 何故なら、デザインパターンは機能じゃないから、設計のパターンだから ↑君の言ってることと全く同じだよね だから同じ機能だけど、違った設計パターンであり 同じデザインパターンに属さない設計は有る ということを君は認めているということ
デザインパターンは機能では無く、よくある設計パターンに名前を付けたもの ってのは正に君が自分で言ったことであって それは俺も了承している だから同じ機能であっても、それだけで同じデザインパターンとは言えないよね と俺は言ってるわけ なぜならデザインパターンは機能では無いから(君の言ったことだよね) そもそも俺とお前とのやり取りに、何のとどこおりも無い 俺は、>>596 で同等の機能を別の設計で実装したんじゃないか、と言い お前は>>597 でデザインパターンの分類は機能で決まるものではなく設計で決まる、と言っている 合わせると、「同等の機能であっても同じデザインパターンであるとは限らない、設計で決まる」 という結論が得られる デコレータパターンの解決できる問題領域は他の(オブジェクト指向でない)方法でもっと簡潔に書ける、のはいいだろうか。 これと同じことが他のデザインパターンでもできるんじゃね?という主張だったと思うんだが。 Singletonは言語によって容易に達成できるものもあればそうでない言語もあるが、そう難しくは無いはず。 OCamlだったらmutable valueを持ったモジュール使えば同等のことが実現できる。 Adapterパターンも変更できない物がオブジェクトだったら関数1つで済むし、 モジュールだったらファンクタ使えば良い。 これを続けていけばデザインパターンがOOPの表現力の低さを解決する妥協案である、と示せる気がするが、 逆にOOPでデザパタ使うのが一番簡潔になる問題を探す方が難しいかもね。
やっぱりデザインパターンを 実装パターンと勘違いしているとしか思えないな。 まず大前提としてデザインパターンに言語は関係ない。 だから言語は関係なく設計の話、 オブジェクト指向での設計の話を考える。 そうするとそこにデザインパターンが出てくる ここまでで言語の話は出てこないから 当然実装の話もでてこないんだよ。
OOPじゃなくてC言語でも当てはまる話だよね。 シングルトンやデコレータなどは。 C言語であってもオブジェクト指向で設計していれば 自然とデザインパターンは出てくる。
>>605 だから、GoFはSmalltalkなら簡単に記述できる構造や機能を JavaやC++の表現力で解決する妥協案を集めたものなの。 JavaやC++の表現能力や抽象度が低いことを勝手にOOPの表現能力の低さにすり替えるな。 デザパタの実装はいろいろあっていいし、言語によって簡単に書けたりそもそも必要なかったりもする。 「オブジェクト指向における再利用のためのデザインパターン」←GoFのデザパタ提唱本ね。念のため。 プログラミング言語の選択は重要である。なぜなら、どの言語を使うかによってどのような観点でデ ザインパターンをまとめるかが違ってくるからである。我々のパターンはSmalltalk/C+十レベルの言 語形態を想定している。その選択によって、容易に実現できることとできないことが決まる。たとえば、 もし、我々が手続き型言語を想定していれば、Inheritance(継承)、Encapsuladon(カプセル化)、 Polymorphism(ポリモルフィズム)といったデザインパターンを組み入れたであろう。また、我々のパタ ーンの中には、あまリー般的でない言語によって直接サポートされているものもある。たとえば、CLOS はマルチメソッドを有しているので、Visitorパターン(P.53)のようなパターンは必要性がなくなるの である。実際のところ、SmalltalkとC十+の間にも違いがあり、どちらの言語を使うとより簡単に表現 できるかは、パターンによっても違ってくる(例としては、Iteratorパターン(P.275)を参照)。
内容を理解してないから例にある記述方法しか受け付けないんだよ。
>>610 あ。引用部分は自炊本の OCR のコピペなんで、タイポは脳内補完ねがいます。 >>612 GoF も「Smalltalk では簡単に記述できるものもある」とは言っているけど、 ぜんぶがぜんぶとは言っていないよね。 >>612 おまいみたいなバカに本を売り付ける為だろw > だから、GoFはSmalltalkなら簡単に記述できる構造や機能を > JavaやC++の表現力で解決する妥協案を集めたものなの。 Smalltalkを好意的にとらえて持ち上げてくれるのは、狭い視野で意味なし認定しちゃう人たちよりは ファンとしてはありがたいけど、これはさすがにオーバーエスティメートだし、 もうちょっとSmalltalkならではのアドバンテージを学んでから、適切な持ち上げ方をしてほしい…
「GoFは、」と、「デザインパターンは、」の区別がつかない人たちと技術を語るのは非常に困難である。
>>619 もしそうだとしても、少なくとも>>591 は「GoFの(デコレーター)」と明記すべきですよね smalltalkって簡単に色々できるんでしょ? なんで現代でメジャーじゃないの?
日本語の方が優れてるのに、世界じゃ日本人しか使ってないだろ?
MSがVisual Smalltalkをつくらなかったから
はやく、 人間クラスと美少女クラスの問題に たどり着いてくれよ。
>>624 だとするとちょっと分からないのですが、 あなたの言う「Smalltalkなら簡単に記述できる構造や機能」で実現された デコレーターパターン(GoFの定義如何に関わらない)というのを提示してもらうことはできますか? Smalltalk は書けないということでしたら、端的に方針だけ示してもらえればこちらで書きますので。 そもそも Smalltalk ではデコレーターパターンが不要(なので、実装はナンセンス)とのお考えでしたら 代替として Smalltalk 組み込みのどういう構造や機能を使うかを示してもらえればさいわいです。 つか、>>546 のruby版って一体何? デコレータパターンのつもり? >>627 自分にはウィキペのデコレーターにあるJavaの例の要求仕様は満たしているように見えるけど。 具体的にはどこが不満? >>628 あ、デコレータパターンの実装だったんだ。 同じ感じでこれ実装できる? class Log def output(s) puts s end end class TimeStampLog def initialize(log) @log = log end def output(s) @log.output "#{Time.now} #{s}" end end class PidLog def initialize(log) @log = log @pid = Process.pid end def output(s) @log.output "[#{@pid}] #{s}" end end log = TimeStampLog.new(PidLog.new(Log.new)) log.output 'aaa' log.output 'bbb' log2 = PidLog.new(TimeStampLog.new(Log.new)) log2.output 'aaa' log2.output 'bbb' 結果: [24968] 2016-08-04 14:41:58 +0900 aaa [24968] 2016-08-04 14:41:58 +0900 bbb 2016-08-04 14:41:58 +0900 [24968] aaa 2016-08-04 14:41:58 +0900 [24968] bbb
>>631 なんか実装手段が違ってきてますが・・・。 >>546 のruby版はいったいどういう意図なのかが知りたいんだけど。 「rubyでclosureを使えばデコレータパターン同等のことができる」とか、そういう「意図」。 >>632 > なんか実装手段が違ってきてますが・・・。 本質部分は変えてないでしょ 変えたのも、クラスを直にいじるか、モジュールをprependするかくらいなもので > closureを使えばデコレータパターン同等のことができる >>540 ,545,546 の流れで、件のコードにそれ以外の意図を思いつくなら逆に聞きたい >>633 うまく説明できないので、最後まで残っている違和感だけを説明して終わる。 WikipediaのDoublePriceクラスで、何か振る舞いを変えようと思えばDoublePriceクラスのみを変更すればいい。 DecoratorTestクラスの変更もしなくていい。 一方、>>546 のコードだとそうはいかない。 これを「デコレータパターンを実装している」といっていいのか? というのが俺の違和感。 まあ、それが本質なのか本質じゃないのかはわからんが。 >>626 だーかーらー、 デコレータパターンという、修飾オブジェクトで被修飾オブジェクトでラップして、両者を同じ基底クラスから派生させることで型に互換性を持たせる、というバッドノウハウは静的型OOPLのためのものにすぎなくて、 同等の機能はSmalltalkでクロージャを使った実装(当然、上記デコレータパターンの実装ではない)で実現できる。 という主張に、どうして「じゃあSmalltalkで実装したデコレータパターンはどうなんだよ」がどれだけ的外れか理解できてる? >>634 > 一方、>>546 のコードだとそうはいかない。 単純に、ideone.com/WW8gva はデコレートをテストにハードコードしているからそうなるってだけで http://ideone.com/HOkUN1 というふうに書いておけば、デコレーターの振る舞いを変えたければ それを定義した decorate_price.rb だけを変えれば、decorate_price_test.rb は変更不要でしょう。 >>635 なるほど。たしかにおっしゃるとおりです。的外れなことを言ってすみません。 >>638 Smalltalk と C++ との比較で? それならもちろん Smalltalk です。 (同書P.289より) Smalltalkではiteratorを明示的に定義する必要はない。標準的なコレクションクラス(Bag、 Set、Dictionary、OrderedCollection、Stringなど)で、内部iteratorのメソッドdo:を定義してい るからである。do:はブロック(つまり、closure)を引数としてとる。 (標準的なコレクションクラスの例になぜか名前がありませんが当然Arrayも含みます。念のため。) >>639 それでいうと今のC++もSTLでイテレーターが実装されてるから、 必要ないって言ってるようなもんじゃね? 別にSmalltalkが特別ってことにはならない。 >>635 > デコレータパターンという、修飾オブジェクトで被修飾オブジェクトでラップして、両者を同じ基底クラスから派生させることで型に互換性を持たせる、 修飾オブジェクトで被修飾オブジェクトでラップしてっていうのは Javaでの実装であって、Rubyのデコレーターパターンには必須ではないよ。 デコレータパターンは言語によっていろんな実装が有って Javaでは修飾オブジェクトで被修飾オブジェクトでラップして、両者を同じ基底クラスから派生させることで 型に互換性を持たせる、というバッドノウハウが静的型OOPLだから必要になるけど、 デコレーターパターンはSmalltalkでクロージャを使った実装で実現できる。
イテレーターパターンをSmalltalkで書いてみたわけね。
イテレータパターンを使わずとも 既にあるイテレータを使った、でしょ
>>643 for each (range based for)でいいじゃん。 for (auto& item : collection) { // print an item } クロージャ風がいいなら、 std::for_each(collection.end(), collection.begin(), [](auto& item){ /* print */} アイテレーターが登場するけど昔の名残みたいなもんで、 本質じゃないだろ?(範囲を指定してるだけ) >>642 クロージャを使ったらデコレータとは言わないのでは? デコレータは継承による多態性を用いたものに限定すべき。 同じ事をやる方法なんていくらでもあるから、 そこは継承によるものと限定しておかないと意味分からなくなる。 無論、今のC++やJava、C#だってクロージャもしくは それに類似した機能を使って同じ様なことはできるし、 Smalltalkだって継承を使ったデコレーターはできる。 言語によってできることできないことと、 各言語の流儀みたいなものは切り分けて考えるべき。 >>647 デコレータの説明として、インターフェイスを同一視して 動的に機能を拡張していくとは書いてあるが 継承を用いることとは書いていない。 >>648 それは定義じゃないだろ。GoF本では定義はStructureのところだ。 Structureは日本語にしたら 構造って意味ですよw
>>650 んなことは分かってるだろ。そこが実質的な定義だと言ってるの。 そのあとにImplementationが来て、その構造の実装法やアレンジを述べる流れ。 > そこが実質的な定義だと(俺様が)言ってるの。 知らんがなw お前が何を言ったところで、 Structureは日本語にしたら構造 Definition(定義)じゃない。 まさか単語の意味を強弁するとは思わなかったなw
>>653 暗黙の定義ってやつだ。プログラミングしてるなら分かれ。 この場合、構造、だとしても問題無い件。 パターンの構造はこうであると定めてる。
デザインパターンなんだから特定の構造を集めたものだからな。 同じ事ができるならなんでもいいならパターンとはいわない。 まあ馬鹿は無視して議論続けてくれ。
まさかデザインパターンがGoFの23個だけだと? あれはパターン例だよ
>>659 それこそ誰もそんな話はしていないわけだが。 国語のテストとか悪かったでしょ? Structureは日本語にしたら構造 Definition(定義)じゃない。 国語と英語の問題なw
あるプログラム片の構造がパターンカタログのものと異なっていたら、 そのプログラム片はそのパターンの実装とは言えないな。 実際問題として、このスレで出ているRuby実装は、GoFに掲載されたデコレータパターンの実装ではない。 それを無視するなら、あなた (ID:jTAWnEUa) にはデザインパターンを使うための 最低限の素地が備わっていないということ。
>>644 あまりにひどくて、なにをいっているかわからなかった。SmalltalkはともかくRubyのコードも読めないのかと。 内部イテレーターを使ったこの実装をイテレーターパターンだと言い切るのはどう考えても無理があるし、 同じ理屈でクロージャーを使った件の実装をデコレーターパターンだと言い張っているなら混乱するだけだからやめてほしい。 >>664-665 この二人は単に常識的な発言をしているだけだが きっと相手には伝わらないだろうね 結局オブジェクト志向が理解出来なくて管を巻いていたら 世間はプロトコル志向に移ってしまったでござるの巻 お前ら何周遅れたら走り出す気になるの?
Swiftのプロトコルも何周回目か遅れですよ? ScalaやRustのトレイトとか知らないんですか?
イテレータをアイテレータって書いてる人がいるけど どこの方言なの? weblioさんの発音もイテレータなんだけど
weblioワロタw もっとちゃんとした辞書持って来いよ。 Merriam Websterとかさ。和英辞書を引用して日本語論じたりしないだろ? 色々調べてみたけど、Wikitionaryのiterateでは二重母音の発音も載せてる。 その他の辞書では見つからなかった。 実際に英語ネイティブのアメリカ人が/ai/でも発音しているのを聴いたこともある。 伝統的には一般的な発音じゃなかったけど、IT界隈でよく使われているうちに、 発音変種が発生したんじゃないか? 英語発音学的にはどちらでも許容されそうだし。
>>669 方言というより極度の経験不足なんだろ イテレータについて人と語った事が無いから 間違いがずっと正されずにここまで来たんだろうな >669 iとかitとかitrとかiterとかに略すから アイ、イット、アイター、アイターとかって呼んでいるのでは 発音している本人に聞かないと真相はわからんがな
クロージャはデコレータじゃないとかPythonに全面的に喧嘩売りすぎだろ
クロージャーを使った実装はデコレーターパターン(GoFの)ではないという話なんだが
>>673 別のパターンって言ってるだけでは? 覚えやすさや関連性からデコレーターの名前を関するのは自由だけど。 Rubyのprependを使った例はDecoratorとしてもいい気がするが、単なるクロージャをDecoratorとは呼べない気がする
デコレータパターンの機能を持っている設計を 全部デコレータパターンとしてしまっては デザインパターンの意味がないからな そりゃどんな方法でも同等の機能は実現するかもだが ある程度を設計をパターン化して縛るのが目的でもあるからね なんでもOKだったら意味ないよね
カタログ化の価値を下げようとする連中は居るんだよ 広義のデザインパターンは~とか ○○も××パターンの亜流と言えるだろう~とか 拡大解釈と独自解釈でどんどん元の輪郭をぼやかしていくんだよ
>>677 ケーキにホイップクリームのせるのもおちんぽにコンデンスミルクかけるのもデコレーションには違いないだろ実装が違うだけでやってることは完全に同じなのだから継承か委譲かクラスかクロージャかといった細かい違いを気にしなくていいからこその設計だと思うのだよ 実装まで縛るならデザインパターンじゃなくてインプリメンテーションパターンだ
>>680 そうか、おまえがいう「デザイン」「ソフトウェア設計」は実装を縛らないのか。 ずいぶんフリーダムなプログラマだなw クラス図レベルがデザインパターン。 そこから実際にどう具体的な言語でコードに落とし込むかが実装。 クラス図レベルで全く違うものはパターンとして別物です。
おまいら、自動翻訳で日本語をえいごにして、出た英語を自動翻訳で日本語にして、元の日本語と違うってモンクいってるんだよな?
>>684 なまってるんじゃなくて、発音が[i]の母音に強いアクセントがつくと[ai]に転じるのは普通。 iterateの第1母音は普通は[i]だが、iterateという語を特に強調する時には[ai]になることもある。 ちなみにweblioはUS出身のNLP研究者にも評価が高かったりするから、そう馬鹿にしたものでもない。 >>686 Haben Sie gelesen, eine deutsche Übersetzung? >>689 Was davon ist im Zusammenhang mit? >>691 Das ist meine Frage. そんなアイレテーター君にヒントをもらった>>646 ですが、 週末の余暇を使って調べ調べ C++ で書いてみました。 http://ideone.com/aMHgqO なるほど。このくらい抽象化して簡潔に書けるなら 今の C++ には35年ほど前の Smalltalk 同様イテレーターパターンは不要と言い切ってよさそうですね。 惜しむらくは逆順用の range-based for くらい用意しておけよ…、という不満は残りますが。^^; そもそもbegin, endなどのモロモロが 既に(外部)イテレータ以外の何物でもないわけでw 内部イテレータ形式を欲しがるかどうかはともかく range-based forとかはどうでもいいよねこの場合
アメリカ英語なんて 英語の方言そのものだろ。w トマトをトメイトゥとか、 ポテトをポテイトゥとか 馬鹿みたいな発音するんだぜ。 アイテレーターみたいな馬鹿っぽい発音が好きなのか?
>>695 おっしゃりたいことがよくわからなかったのですが 「イテレーター(内部なり外部なりの)が標準で提供されていればイテレーターパターン(GoFの)はいらない」 という主張(>>639 ,646)に対して「そもそも~」はどういう反論で、 range-based forがなぜ「どうでもいい」という話になるのしょうか? >>693 おいおい、Neinに続いて肯定文とか、なんなんだその日本語みたいなドイツ語もどきはw >>696 はいはい、あなたは馬鹿ですよ。認めてあげましょう。 >>695 >そもそもbegin, endなどのモロモロが >既に(外部)イテレータ以外の何物でもないわけでw だめだ、こいつは手の施しようがないw >>697 ごめん 流れつかめて無かったわ 標準のコンテナにイテレータがあるんなら それを使う限りはイテレータパターンの必要も無い (内部イテレータ形式もrange-based forも無くてもいい) それだけの話 スレの最初のほうに既に書かれてる話 もう少し正確に言えば、言語やライブラリが イテレータパターンを実装しているから、 あとはそれに従うだけって感じかな。 意識せずにイテレータパターンを使っている。
>>702 「意識せずにイテレータパターンを使っている」は大間違い。 >>704 そやね そっちが正しい パターンを使うのは設計者だからね おっすおらフリーダムプログラマ 日夜社畜プログラマと戦ってるだ
>>702 > もう少し正確に言えば、言語やライブラリが > イテレータパターンを実装しているから、 正確に言うなら、イテレータパターンというのは、 > コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない > 反復子を提供することを目的とする 実装パターンのことで(Wikipediaより)、言語やライブラリがiterableな何かを提供しているからといって、 それらがイテレータパターンを実装しているとは限らない。 >>680 > 実装まで縛るならデザインパターンじゃなくてインプリメンテーションパターンだ 発想が逆だね。 ある機能を実現するための実装パターンを分類・カタログ化したものが、GoFのデザインパターンだ。 まさしくその通りだね そして同じ機能だったらどんな設計でもOKとしてしまっては デザインパターンの意味がない でもこの話題はもう終わりにしたいね
だからデザパタなんか、屋根を屋根といってるだけで、トタンなのか瓦なのか藁葺きなのか何も定義してないって言っただろ。 だから積み木のおうちでも構わないんだよなぁ
パンピーは屋根には天井がセットでついてくると本気で思ってそうだから怖い。
>>709 とは言っても言語が違ってもデザインパターンは通用するわけで 実装がたった一つというわけじゃないのは確か C言語でオブジェクト指向をすることだってあるし、 クラスがなかったES5時代のJavaScriptでもデザインパターンは作れた。 重要なのはデザインパターンの設計に出てくる登場人物があるかどうかではないだろうか? 例えば、Decoratorパターンだと、Component、ConcreteComponent、 Decoretor、ConcreteDecoratorという登場人物がある。 これはクラス図で書かれているだろうけど、別にクラスである必要はない。 例えばクロージャーを使って実装してもかまわない。 またインターフェースは明示的に継承していなくても、事実上特定の関数を実装していなければ 正しく動かないなら、それはインターフェースを使っていると言ってもいいだろう。 これと同じ登場人物が出てくるものは同じデザインパターンといっても良いだろう。 そこまで行ったら別物だって。 クロージャーやら使ってクラス図レベルで逸脱してもいいという 宗派をひらきなよ。
>>713 そうはいってもだね。 クラス図がないES5でもデザインパターンの 設計通りに作れるでしょ? >>714 クラス、クラス図がないからデザパタにクラスは不要というのは、本末を転倒してますよ。 GoF も述べているように(>>610 ) クラスの無い言語では、クラスの役割りを「カプセル化」パターン、 「継承」パターン等で補ってから、その上でたとえばデコレーターパターンを実現しているというだけです。 >>716 なるほど。言語仕様としてクラスの有無ではなく 継承パターンができていれば、その実装がクロージャーでも かまわないということですね。 そして継承パターンと言うものには、何が何を継承している という概念があるはずですから、その「何」が登場人物に なるわけですか。 「○○言語だともっと簡単に実装できる」君と 「クロージャを使えばもっと簡単に実装できる」君は いい加減うざいよ?
>>719 その通りだと思います。 まずはソフトウェア設計は実装ではないが、 実装を縛る規範であるということを 理解したらいいと思います。 それが理解できたら帰っておいで。 デザインパターン 日本語で 設計見本でいいですか?
>>708 それは過程の話な結果として実装を示すならインプリメンテーションパターンと言っているだろうしかしデザインパターンと言っているから実装を抽象化したものだ具体的な実装を示すものではないってことさ その前に君の書き込みを日本語のパターンにしてください
>>681 設計が実装を具体的に決めてしまったら設計の意味がないと思うんだよおトイレとお風呂が一緒になってますってことと具体的な便器の形とは分けられると思うんですデザインパターンっていうのはいわばそういうものでお風呂とトイレを一緒にしたら便利だよってことさ いい加減、オブジェクト指向 vs 関数型なんていう無意味な議論やめようよ 直交する概念じゃん 関数型言語でも「本物の」オブジェクト指向プログラミングは出来るし、 最近の流行りはオブジェクト指向言語に関数型的な機能を付けることだろう
本当のオブジェクトプログラムは、メッセージ交換だから、関数型が入る余地なんか無いけどな。
お前ら、早く本論に入れ! 美少女クラスはなぜ人間クラスを継承出来ないのよ!!!
美少女はクラスじゃなくて人間クラスのインスタンスで パラメータが特定の値のものなだけだよ。 プリンセスメーカーであれば「魅力」のパラメータが 高くて「年齢」が若ければ美少女なんじゃね?
>>732 まあそうだな。 人間クラスの女性属性で年齢属性が十代で、 あとはいろんなパラメータがバランス良く絶妙なバランスであるだけ。 >>733 排便性能とでもいうパラメータ作れば良いんじゃねーの? 美少女じゃなくても排便が困難な人っているからな。 | | 彡 ⌒ ミ \ (´・ω・`)またうんこの話してる... (| |):::: (γ /::::::: し \::: \
オブジェクト指向は愚かな考え。 排便メソッドを実装した人間クラスから美少女クラスが作れない。
アヒルががーがーなくのではなく、がーがー鳴けばそれがアヒルなのである うんこができればそれは人間なのである
>>738 「ウンコを覗くときウンコもまたおまえを覗いているのだ。」 もうこの子は脳の端までウンコになっちゃったんだよ… 頬を紅潮させた少女のアナルは今にも決壊寸前のダムの如くヒクヒクと静かに脈打つのであった そのアナルをまるで獲物を狙う蜥蜴の様な眼差しでジットリと凝視していたお前は…
やはり、オブジェクト指向は愚かな考えなんでしょうか? それはなぜですか?
オブジェクト指向にクロージャーが取り入れられてから、 オブジェクト指向は更に便利になった。
どうせなら理想のクロージャの構文はどんなものか議論しよう。 美少女のウンコの話はもういいから。
じゃあ質問 若い時は買ってでもするものな~んじゃ?
コンビニでトイレだけ借りるのは気まずいので後で何か買って帰る
オブジェクト指向と計算式という対比がまずおかしいスレ
>>757 その前に>> 1の脳みそがオカシイ。 議論以前の話 >>733 排便メソッドつくってうんち吐き出させれば良いじゃん… できの悪いプログラマはこうやってくだらんことに執着した挙げ句道を外すからな オブジェクト指向を禁ずるのは当然だが、プログラムも規制すべきだろ
外に公開するインターフェイスだけオブジェクト指向で中身は手続きとかできないの?
なんでもかんでもOOPしないといけないという強迫観念も新しい病気みたいなもんだ
OOPは自然な概念。 しようとしなくても自然にOOPで書いてしまう。
んじゃ、Cでファイル読んで行毎に番号振るプログラムを自然にOOPで書いてくれ。 OOPな言語でも油断してると手続き的なコードになるのが実感。 手続き型言語や関数型言語のが自然と言えば自然。 OOPはどっちかと言うと手続き型言語の限界を超える苦肉の策。 有効ではあっても、自然ではない。
手続き型の言語使ってるんだからそりゃ書き方は自然に手続き的になるわw
>>765 とりまなんかのOOPLで「ファイル読んで行毎に番号振る」操作の“油断した”版をideone.comあたりで晒して見せてよ >>765 > Cでファイル読んで行毎に番号振るプログラム FILE構造体使うからOOPだな。 後での取り回しのために動作分離してオブジェクトにするんであって なんで"その中身をオブジェクト指向で書けるか?"なんて 頓珍漢な発想が出るのかの方が不思議だよ。
まぁそうだよね。関数型だって関数の中味に手続き書くだろうし
>>771 関数型言語では手続きは書かない。 式か、式とパターンマッチやガードによる条件わけだけ。モナドもdo形式で書くと手続きっぽいけど、実際は大きな一つの式。 if/caseに似てるけど、文と式が入り乱れるのと違って全部式。 それで何が嬉しいかと言うと、正しい動作をすると言う証明が出来る。 せやね関数型言語でも中身はモナド駆使して手続き的に書くのが自然やからね …せやろか?
>>767 import sys for i, line in enumerate(open(sys.argv[1])): ____print i, line, Python3だとprint i, line end = ' ' ついついこう書いちゃうだろ? でも、出力先がGUIになった途端破綻する。 そう言うのを見越して汎用的にしとかんと。 出力先を切り替えられるようにしたい、は別の要件でしょ
CでOOPしてたやつって、なんかのGUIライブラリでなかったっけか?
オブジェクト指向の方が自然だと思うし好きだけどPythonやjsみたいな動的型付け言語でオブジェクト指向は無理というか無駄な気がしてきた オブジェクト指向は副作用を限定化するためにカプセル化が必須だけど動的型付け言語だとそれが保証されない 横からいくらでもメンバの付け足しやメソッドのすげ替えができてしまう そうなると副作用の保証ができないどころか、静的解析によるインテリセンスやエラー検出というメリットさえ捨てる羽目になる そうなるともうオブジェクト指向で作る意味がない クラス単位で保証ができない以上、関数で保証する他なく 必然的に関数型にせざるを得ない
「世界がどんどん変わって行くのを俺が全部コントロールして阻止しなければならない… そうでなければ世界はバラバラになってしまう…」 「どうしたんですか?先輩」(もぐもぐ 「おお後輩!…なんだそれ?」 「売店がパンじゃなくて弁当扱い出したんですよ ゴミかさばるから売店とこで捨てろですって。 まぁ、どうせ僕が一括して持ってくんでしょうがw」 「後輩」 「はい?」 「カレーある?」 「たしか」 「じゃあ、それ一つ」 「はい」
パイセン方、JS勉強したてでオブジェクト指向って言葉が出てきたばっかでよく分かってないドブネズミ以下の僕に教えて オブジェクト指向ってプログラミングのルールとか具体的な所作のことを指すの? 例えば「このプログラムは誰が読んでも分かりやすいものしよう」程度のものはオブジェクト指向とは言わないの?
>>785 最初、「適当に飛び先決めて好きなように処理書いて戻す」やってたら 後でプログラマが死にそうになったので "入り口があったら出口はここ"とブロック化しようぜ!が『構造化プログラミング』 Cなどが直接の成果で今の言語はほぼこの流れを受け継いでる。 次にブロック(サブルーチン)化されたからこれをクラスとして使いまわそうぜ!が『オブジェクト指向』 ここで単純に使い回しの方向でCから発展したのがC++ 主目的が使い回し。 それとは別にブロックを使い回すにあたって「これをやれ」という具体的な コマンドを受けてクラスが独自に動くようにすれば 相互の関係がゆるくなって取り回しと修正が楽になる。というのが smalltalk>objective-C>JAVA~と続いてるメッセージ/メソッド方式 目的はクラスの独立 もっと進んで命令すればクラスが自分でデータや仕事探すぐらいになるだろ? というエージェント指向はまだ実現していない。 Javaをそちらのダメな考え方の方に入れるのはJavaが可哀そう
メソッドはメッセージ側のスタイルなんでなぁ。 ウィキペディアの「影響を受けた言語」書き換えてくるかい? 「クラスとは構造体に関数がついたもの」って90年代の C++なんかをベースにしたオブジェクト指向の説明とか いまじゃ誰も電波すぎて理解できねぇよ。 「自動車は馬車から馬が外れたものである」かっつの…
オブジェクトはデータに自身を操作するための処理が付いたもの というありがちな説明は、これを正しいとするかどうかは別として 電波すぎて理解できない、という程のものではない 厳密かどうかは置いておいたとして、具体性があり、ある種の分かりやすさはある 「データ」とか「処理」とかいう言葉は、プログラマじゃなくても知ってる一般的な言葉だし 大体の人が正しく理解して使っているであろう ということと、コンピュータの根本の原理も大昔から特に変わってないので 「データ」や「処理」という言葉が、理解できないほどに意味をなさなくなっているわけでもない 普通に理解できる範囲 実際にはもっと賢い表現が適切であろうが、今は理解できる文言かどうかが焦点であるから 関係が無い どちらかというとsmalltalkというかアランケイのオブジェクト指向の表現の方が若干電波であり 事前に知識が無ければ、何を言っているかよくわからない、正しく理解できない 現実の部分が見えてこない、拡大解釈してしまう、思考が発散する、といったところ 最終的には生態系がどうのこうの言い出すから
>>791 前からちょいちょい思ってたけれど、脳がパソコンの一個のCPUで完結してる人とか 処理時間の遅れとか当人の脳内世界に存在しないから概念が理解できないみたい。 60年代に大学間などの通信ネットワークが作られてこのかた 現代のマルチタスク・マルチコアに至るまで 相手の処理終了が不明な状態で "逐次実行なんか期待できない"というところから話が始まってるのに 脳が「プログラムってバッチ処理だろ?」で止まってるから 「順番に動かないプログラムなんてあるか!」って本気で思ってるんだよ、こういう人… >>792 >全部電波じゃねえかwww うん。だから例えば具体的にはどんなとこころ? あるいは件の主張を端から理解する気が無いのならレスは無用に願います >>790 >事前に知識が無ければ、何を言っているかよくわからない、正しく理解できない Smalltalkを理解するために事前の知識は要らないぞ。 実践せずに本やブログ記事を読むだけで理解しようと思っている人は苦労するだろうけど。 >>795 んー、それはどうだろう。気持ちはわらんでもないけど、ちょっと言い過ぎではないかなぁ… たとえば同じように Python を“理解するために事前に必要とされる知識”を問われた場合、 どんな答えを想定しているか教えてもらえる? あるいは Java なら必要だけど、Python であれば Smalltalk と同程度には必要ないとかそんな程度の話? 例のFILE構造体を用いたファイル操作はファイルシステムに対する低水準な操作がカプセル化され利用者から見えない設計だからオブジェクト指向設計、 と言って良いものかどうか… (内部ではiob[ ]という配列操作になっておりインスタンスの個数に上限がある && 物理ディスクの個数はもっと小さいから、ファイル操作の内部の実装にはiob[ ]全体を操作対象とする手続き型のコードが含まれる これをオブジェクト指向と呼んで良いのなら、ユニックスのシステムコールやWin32 APIからハンドルを受け取って ハンドルに対して操作を行うのは全部オブジェクト指向と呼んで良いことになる が
>>793 順番として書けないプログラムがあるか!!!!111!!!!1! 確かに非同期に動く複数のブツというやつは全体としては順序的でない並列的な振る舞をするが それらを同期させる手順自体は順序として書ける(そうでないとCPUに処理させられない >>798 のような話もあると思う マルチプロセスだろうが、複数のコンピュータだろうが、なんであれ 結局、処理の順番は大事だろう というのもあるが、それは置いておいたとして >"逐次実行なんか期待できない"というところから話が始まってるのに 逐次実行が期待できないケースがあったとして、それはそれで置いておくけど 逐次実行が期待できるケースにまでそのモデルを使わなければならないのかどうなのか ってのは有ると思う a = 1 + b; ・・・① b = c + 2; ・・・② の①②に関しては、少なくとも逐次実行を期待したいし 複雑なモデルは必要ないと思う 全部の個所において、ありとあらゆることを想定した包括的モデル、を適用するのは あまり好きではない a={1,2,........100}; sum(a); こんな場合、遠くの鯖でも近くの鯖でも10なら10ずつ(実際ににはもっと粒度が大きくないと割に合わないけど)分割して1-10の合計+11-20の合計+...って感じで全部揃いさえすれば順番関係無いって処理もあるお。
>>799 オブジェクト指向(C++とかじゃなくて上でいうアランケイ的な)が 逐次処理を否定していると思ってるなら、それは違う 言うならば、並列処理できるときにも逐次処理するのを否定しているという感じ。 その例にあげた依存のある計算みたいに、逐次処理が必要なところは そうしなきゃならない。でもそうじゃないところは並列にやればいい。 CPUのスーパースカラも同じだね。前の命令の演算結果を参照するような 場合はパイプラインが止まるけど、依存が無ければ並列にどんどん進められる >>800 バ、バラバラに計算した部分和を最後にどうするんです? >>803 1. 同期をとってから 2. 足し合わせる のでは… C#, Java8 の、Parallel はそう。 並列処理で、最後に同期する 各スレッドでソートして、最後にマージするとか
>>804 全部揃いさえすれば=同期とったら 「最後」にどうなる? 解:合計します。 突っ込まれるような事だったかな。。。 処理が一つの処理(タスク)単位になった時に シングルタスク指向じゃやってられないよねってあたりまえの話なのに なんで2017年に「そんなことはない!俺はオブジェクト指向が嫌いだ!」って 頭ごとシングルタスクのじいさんが湧くんだ…
>>801 そういう風に俺は言ってない >逐次実行が期待できないケースがあったとして、それはそれで置いておくけど >逐次実行が期待できるケースにまでそのモデルを使わなければならないのかどうなのか と書いた シングルタスクじゃ扱いきれなくて マルチタスクが合ってるって思える部分が出てきたら その部分ではマルチタスク指向とやらをやれば良いのでは? オブジェクト指向とは直接的に関係が無いね
C++とかハードに直結してるのに使い回しにだけオブジェクト指向を使おうとしたクソを通してオブジェクト指向知った人の末路がこれ
シングルスレッドで同時接続数、1万をこなす、Node.js の、WebSocket ただし、CPU を多く使うものは、ダメだけど
そーゆーのとオブジェクト指向は本質的に関係なくない? タスクの実装に向いているとしたところで じゃあ、タスクの実装以外ではメリット無いのか?ってことになる 全体的にはマルチタスク的だったとしても、細かく見ていけば、個々はシングルタスクな部分も出てくるだろ ほとんどのOO言語のオブジェクトの実装は 「データと処理を一纏めにしたもの」、っていう実装になってることが多いんだから それを考えると、ほとんど何でも実装しやすいんだけども (↑マルチタスクとかシングルタスクとか関係なくね) この説明に拒否反応を示す人がいて > いまじゃ誰も電波すぎて理解できねぇよ。 って言うから、どーなんだよ、と オブジェクトはデータと処理を一纏めにしたもの、ってそんなに理解しにくいか?という話だったはず ただ、この説明の仕方は、かなりボトムアップ的で、実装から炙り出したところがあって 「とどのつまりこういうことだろ」と頭ごなしに言われているようで気分が悪い つまり、オブジェクト指向の効率的で有効な実装は、えてしてそうなる、というような あとオブジェクトの全貌は語ってなくて、「言っている範囲においては間違ったことは言ってない」 程度の説明でしかないけども しかし実際にそのような実装になってる言語が多いから、完全に無視してよいというものではないし 頭にはおいておかなければならないね
>>806 >全部揃いさえすれば=同期とったら さも最初から書いてあったかのように嘘を言い… 「あ、お客さま、こちらのおリンゴ少々傷んでおりますので、交換致しますね」 レジから店員が離れたらどうなっちゃうの!どうなっちゃうの!? もう仕事できないよね!業務崩壊だよね!! 「はい、こちらで宜しかったでしょうか? では御会計は~」 戻ってくるなんて説明なかったよね!処理が続くとも言ってないよね!!! ボク意味わかんない!!!!!!!!
オブジェクト指向は、データと処理をひと纏めにする? 馬鹿じゃないの。 機能で分けるの。
>>816 機能で分けることはデータと処理を一体化することを否定しない 機能で分けるって言ったら、そら、なんでも機能で分けるもんなんだよ 例えばCなんかで関数に分けるって事を考えても、当たり前、機能で分けるわ 機能で分けるってだけじゃ何の説明にもなってない むしろ機能以外で分ける必然性がないし だから機能で分けるのはどのような何であろうと、分ける以上は当たり前そうする前提として 「具体的にどのような方法、単位で分けるの?」って部分がないと その時に、データと処理を一纏めにしたものをオブジェクトとして、ってのが出てくる クラスは機能で分ける、って文言は、おかしなクラス設計をする人に対して クラスは機能で分けなきゃダメだよ、と注意するために有るのであって オブジェクト指向の説明にはなってないんだよ 例えば、「関数は機能でわける」って言い方も出来るし、なんでもそうじゃん
平たく言えば「機能で分ける」ってのは クラスの作り方や設計方針の話であって クラスやオブジェクトの根底のメカニズムについては何も言及してないんだよ
ふる~いサブルーチン的な「関数」の発想だと たとえば「ドルと円を換算する」"関数"はただの「処理機」だから レートと額を送ると換算額が返ってくる、という発想になる。 そこがオブジェクト指向では「ドルと円を換算する」"クラス"は そういう処理をする「処理場」なので送るのは "換算してくれ"という命令コマンドと額になる。 違いはなんだろう? 「関数じゃなくてクラスはレートってデータを持ってて、換算という操作関数が付いてんだろ?」? 違います。自動車が馬抜き馬車ではないように。 ポイントは「換算」というタスクは当該クラスが責任を持つ仕事で 処理を頼んだ側まで責任は及ばない設計になっていることです。 オブジェクト指向の思想ではそれぞれで責任が切り分けられているので プログラムの修正の際に修正が延々波及する事態を抑制できるし 処理はタスクを行う実行単位で切り分けられているから 処理終了を待つ必要のないタスクは並列実行できる。 "そういうこともできる"ではなく"そういうことをやるように"仕様が作られている。 そういう違いです。
で、結局クラスやオブジェクトの持つメカニズムについては言及しないのであった 書いてある内容は「そういう風に考えてください、そういう風にとらえてください」 程度のものでしかない 後半の並列処理なんか全然オブジェクト指向と関係が無いしな そういう風に書けば、そうなる、ってだけ 「ポイントは「換算」というタスクは~」の部分に関してなど 一般化して他のものに関しても同じことが言えるし 何の説明にもなってない 唯の一般的に良いといわれるプログラミングの作法を説明しているに過ぎない もちろんその作法はOOPでも通用するが、OOPの説明にはなってない 例えば、クラスを"関数"に置き換えて 「ポイントは「換算」というタスクは当該"関数"が責任を持つ仕事で 処理を頼んだ側まで責任は及ばない設計になっていることです。 "関数"を使う思想では、それぞれで責任が切り分けられているので プログラムの修正の際に修正が延々波及する事態を抑制できるし 処理はタスクを行う実行単位で"関数"に切り分けられている」 っていう風に言ったって別に通じるし、オブジェクト指向の説明になってないことが分かる 一般的に良いといわれるプログラミングの作法を説明しているに過ぎない となれば結局、「関数とクラスは何が違うのか」って事がクローズアップされるべきで 「関数じゃなくてクラスはレートってデータを持ってて、換算という操作関数が付いてんだろ?」 ってのは結構的を得た説明なわけだ、少なくとも君の糞みたいな説明よりは
だたし、オブジェクトはデータと処理を一纏めにしたものって説明は オブジェクトの性質の全部を言い表しているわけじゃない 「言っている範囲においては間違ったことは言ってない」程度のもの
なんかまだ現実を理解していないみたいだけど 誰かがそう考えているとかそういう話ですらなくて "君が"一人で自動車が走り回ってるこの時代のど真ん中で 「いいや!自動車は馬なし馬車ともみなせる!誰も自動車の細かいシステムについて 俺に懇切丁寧にマンツーマンで教えてくれないからな! あくまで自動車とかいうのは馬なし馬車にすぎない!!」 ってほざいてるからみんななんだこのボケジジイwと笑ってるだけだよ。
俺は別に笑われてないんだけど 君の書き込みは電波すぎて誰にも相手にされてないかもしれないが これが自己紹介乙というやつか
>>823 >書いてある内容は「そういう風に考えてください、そういう風にとらえてください」 >程度のものでしかない だってOOPとかその程度のものやとしか言いようが無いし… OOPにしたからといってチューリングマシンでできない計算ができるようになるわけでもないし、 高階関数の系の能力を超えるわけでもない 「オブジェクト」も「機能」や「データ構造」と同じく人間が勝手に設けた区切りと考えたほうが精神衛生上宜しい 「漏れの無い抽象化」を達成せしめたクラスに属するオブジェクトのみが、独立した数学的対象同然の正当性を有す でもそうじゃないクラス(とそのインスタンスとしてのオブジェクト)も世の中にはゴマンとあり、実用OOPはそれらも包含してゐる OOPの枠内の全てをスッキリ定義づけて一意のクラス分けを導くような数学は目下無いしこれからも無さげ ちな >「関数じゃなくてクラスはレートってデータを持ってて、換算という操作関数が付いてんだろ?」 (823) というんのはクラスを「レートという束縛変数を有する「換算」という関数」の定義とみなしてゐる、 とみなすこともできる、、
そこまでわかってるなら、手続き型言語には何があるかも分かってるだろ 紐解いていけば、手続き型言語には、「テータ構造」と「制御構造」の二つしかない あとは定数とかもあるけど、無視しといてよいし 本当に、データ構造と制御構造しかない クラスはこの二つをまとめたパーツ、ぐらいの認識でよろしい
データ構造はメモリの空間的分割構造といえるし 制御構造はCPUの時間的分割構造といえる これで空間と時間がそろったからプログラミングの準備が出来たといえる クラスは単に、C時代はデータ構造と制御構造を別々に定義していたのを 区切りの良いところで纏めて定義しましょうってだけだよ 小さなプログラム(クラス)の破片を集めて大きなプログラムにしましょうってだけ 実際クラスのメンバ変数はクラス内のグローバル変数だしな
>>830 >実際クラスのメンバ変数はクラス内のグローバル変数だしな これはそう作ればそうなるし、そうでない作り方もできる (クロージャにするなら通常はコンストラクタでメンバ変数の値を固定してしまい以後変えないとか、 OOPはハマるべきところにはきっちりハマるから、必要性はある ハマればセマンティクスとコードの表記がきれいに対応してたいへん保守しやすく書きやすいコードになる ただしそうなるのは漏れの無い抽象化が可能とか、漏れを設計で見えにくいところに隠せるとかそういうケースに限られる >漏れの無い抽象化が可能 こんなのよっぽど単純な事象以外ありえんだろ。
なんか、別なものに見立てての説明ばかり受けたせいで なにかに見立てないとオブジェクト指向じゃないみたいな変な理解をしてる人がおるけど 要するに会社の「◯◯部」とか「◯◯課」みたいに 仕事と処理を送るとよしなにやってくれる単位で切り分けるってだけの話だし 「こういうことも◯◯課の仕事に新設」でも「仕事の質が変わったから部課を統廃合して編成しなおし」でも 部課が責任を持つことで取り回しが楽になるよね。だし
いや、会社みたいな組織は必要な仕事の流れに応じて組み変わるじゃん? 無理ないちゃもんつける人は変化しないもの出してきて 「猫に羽が生えて飛ばないからオブジェクト指向は間違い!」って言いだすからw
部署部署言ったって、それはプログラムにおいては、何に相当するのか って話がある そこが無いと本当に意味のないたとえ話にすぎない プログラムで会社の部署のように振舞わせるには データと処理の両方が必要 データだけでも処理だけでも部署のようには振舞えない classはプログラム環境のフルセットじゃないといけない その意味で、オブジェクトは処理とデータを纏めたものでなければならないし そうなってる それだけの話
変な例え話を出したり、大仰な説明をしたりしないと理解できないだろう、なんて思ってる時点で間違ってると思わないのか プログラムの素養の無い人でもOOならプログラミングできるようになります!とか妄想してるのか?
そうだね、自動車は馬なし馬車だから運転者は御者だね。 最近の馬なし馬車は馬を繋ぐパーツが欠落してるからけしからんね。
まだ馬なし馬車とか言ってるのかよ、進歩ないな 誰も興味ないんだって、そんなアホで的を得てない例え話
「クラスは構造体」じいさんにはぴったりすぎて例えですらないけれど?
仮想の脳内の敵と戦ってるんだな、がんばれよ その仮想の敵はお前自身でもあるからな
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 MNVZG
唯一純粋なオブジェクト指向言語と呼ばれることがあるSmalltalkが ほとんど世間一般に普及していないのに、 オブジェクト指向が持てはやされるのはなぜ? いいとこ取り?
いいとこ取りというよりはその時々で模倣可能な機能が徐々に実用化されてずいぶん近づいている 例えばホットスワップとかデバッグ中のコード変更とか で、後者とかは実行中コンテクストの保持まではまだ模倣できてないとか
このスレタイは「この世は飛行機も自動車も不要!北海道から沖縄までは徒歩で十分!」 みたいに見えるんだがw
このスレはC++でオブジェクト指向に挫折したじいさんが 「オブジェクト指向なんてゴミだね!」って喚いて回ってたら 周り中から「あんなもん真のオブジェクト指向じゃねぇよアホw」ってツッコミまくられて 今度は「よくわからないけど“真のオブジェクト指向”ってのがゴミなんだろ!」って 暗闇に向かって手を振り回してみたら敵に当たるだろう!ってスレなんで…
>>852 はげどう >>853 全ての飛行機が墜落するほどにはひどい話ではない メーカーや航空会社によっては墜落せずに目的地まで行き着くかもしれん >>854 真のオブジェクト指向は人間の直感的分析とコードが完全に一対一に対応する ただしそれは一般には存在しない だいたいオブジェクトを命令コードで書くという時点で理論が破綻している
破綻しているは言いすぎかもしれん 崩壊の序曲を奏でているに訂正 オブジェクト指向設計に基づくありとあらゆるプロジェクトが
序曲を奏でるwww >オブジェクト指向設計に基づくありとあらゆるプロジェクトが とか、なに言ってるんだよオブジェクト指向設計ごときにwww
そもそもモジュール間の接続を密にしたら変更の影響がどこまでも波及してシャレにならんから モジュールごとに独立して、できるだけ抽象的な命令(メッセージ/メソッド)によって モジュール内で処理を完結させるようにしよう。 モジュール内で完結してればパーツとして使い回しもできるし。 だからな。
モジュールの依存性を弱くするのは手続き型でもできる foo.bar()はbar(&foo)と手続き的な表現にいつでも直せるので オブジェクト指向でやれる弱結合は手続き型でもやれる カプセル化というのも強力に型付けられた手続き型言語なら上の記法で同等の安全性が実現できるから オブジェクト指向固有の特質というには弱い オブジェクト指向が従来の方法論に対して際立って優れた(あるいはダメダメな)ところは 継承と多態性のしくみに夢を抱きすぎたところにある、、
手続き型プログラミングにおける型に振る舞いをくっつけたことで さまざまな振る舞いを同一の表記で書けるため、テンプレートとの相性が良くなった、 というのもオブジェクト指向の功績の一つに挙げても良いかもしれん きわめてコンパクトな表記でパワフルな仕事をさせられる その結果、テンプレートを使わんとするほとんどの現場に破壊と混乱がもたらされた
未経験から半年でフリーエンジニアになれる人の特徴 VIDEO フリーランスか会社員かどっちが簡単かについての最終回答 VIDEO 【エンジニア】正社員/派遣社員/フリーランスのメリット・デメリットについて VIDEO 月収1000万円オンラインサロンオーナーの日常【飲み過ぎ】 VIDEO &t=107s 借金400万円から人生逆転するまでの軌跡 VIDEO エンジニアはお金を追求してはいけないという年寄りを論破してみた VIDEO プログラミングスクールを否定する老害どもについて VIDEO &t=506s 新人叩きしてる古参勢がすぐ儲からなくなる理由 VIDEO &t=332s ところで「チンポがシコシコする」という日本語表現は、文法的に正しいのか? チンポ「を」シコシコするのではなくて、チンポ「が」シコシコする。この場合、「チンポ」は主語となる。 オブジェクト指向で言う「集約」は2種類あって、全体(俺)と部分(チンポ)が繋がっている場合と、 全体(俺)と部分(チンポ)が別々になっている場合とが考えられる。けれども「チンポ」はそれ自体 が独立した生き物であり、所有者の意思とは無関係に、勃起して「シコシコする」。 例えば寝てる時にエロい夢みて朝起きてみたらチンコが勃起して射精してたとか。 違うか? 「胸がドキドキする」は良いが、「チンポがシコシコする」はダメな理由を、50字以内で述べろ!