オブジェクト指向ってクソじゃね?
■ このスレッドは過去ログ倉庫に格納されています
カプセル化(英語:encapsulation)とは、オブジェクト指向を構成する概念の一つで、 オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、 オブジェクトの実際の型を隠蔽したりすることをいう。 偏差値の低い学校向けの情報処理系教科書において「大変すばらしいものであり絶対に使うように」と大体的に宣伝された。 一方、カリフォルニア大学バークレー校の有識者を中心としたインターネットを作った人たちは「階層化の有害性」として 「絶対に使うな」としている。大雑把にいうと、その時は良くても、将来的な改修の際に隠蔽されたデータに アクセスできないと解決できない問題が出てきて、結果的にデスマーチに陥るというのである。 オブジェクト指向の発案者であるアラン・ケイもコーディング規約(頭文字にアンダースコアを付けるなどの命名規則)で 縛る程度にすることを推奨しており、アラン・ケイが関わったオブジェクト指向プログラミング言語にはどれも「private」 という概念はない。 https://monobook.org/wiki/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96 /** リストの要素をゼロで置き換える **/ private void clearList() { for (Integer el : someList) { el = new Integer(0); } } なかなかファンキーなロケンロールだぜ >>68 条件分岐はあるで ループもあるで GOTOだからわかりにくいけど 線はフローを表すんやで ロバストネスエアプか? >>69 ユースケース図はユースケースを並べたものですよね ロバストネスはユースケースごとに処理フローを 書くわけでフローチャートそのものですよ 構造化プログラムでゴトーが滅亡したようにオブジェクト指向にも構造化のブレイクスルーが生まれていい頃合いだと思うの オブジェクト指向って簡単な処理先に書いて難しい処理は後回しにする考え方でしょ >>75 違うけど、意味がわからないから例をあげてみて 「簡単な処理」とは何かライブラリを使えば難しい処理は簡単な処理とみなせるのか? インターフェースを切って実装を分離することを言ってるんじゃないか? そもそも、継承関係で隠蔽しちゃい合うのが問題なだけで、 インスタンス握り合うだけの仲なら、相手の陰部まで見に行く必要性なんて無いだろ。 >>70 そのサイトには賛成できる部分と反対の部分がある 「クラスとはデータ構造」で 「責務はクラスではない」というのには大反対 クラスは責務そのものという方が オブジェクト指向の主流の教え方 >>75 当たってる部分がなくもないけど たんに関数に分割するんじゃなくて 抽象化するのがオブジェクト指向 >>79 ゴトーが主流の時代もあったわけで 主流じゃないからという理由で反対するのは いけないことだと思います! 責務ごとにクラスを作るのがどうして主流だよね?ってことですよ >>81 それもそうか >>82 変更コストが下がるから >>83 いやむしろ凝集度は上がるよ? 凝集度を上げるっていうのは でかいクラスを作ることじゃないよ? ボトムアップで設計したら結局最上位クラスが神クラス化しちゃうのは、アプリ層の設計が甘いんかな? どうもUI部の設計は苦手だ。 >>84 データに関わる処理を一箇所に集められますよ 凝集度は高くなります ドメインオブジェクトがドメインとしての振る舞いを持つのですから肥大化とは言いません、データと関わりのない振る舞いを持つわけではないんです >>85 肥大化するのが設計が甘いと言われればその通りでしょ ただ最初から一発で分からないことも多いので リファクタリングするのも大事だと思う >>86 >データに関わる処理を一箇所に 複数のデータの処理を一箇所でやるという意味なら 凝集度は下がる >>87 ドメインオブジェクトの数が増えていくのは普通だが 1オブジェクトの行数が増えていくのは肥大化 >>89 そんなバカな 行数でオブジェクトを捉えるべきじゃない 振る舞いがどこにあるべきかで考えないと 行数が増えたからオブジェクト分けましょうなんてのは オブジェクト指向の理念に反する データをカプセル化してデータに対する責務を持つのが オブジェクトなんだよ データに対する振る舞いが集まるんだから凝集度は高まるんです オブジェクトが何かを考えないと行数で判断するという 前世紀のような事が起こるわけです 行数が多いからこのオブジェクトは頑張ってるんだな と思ってしまうわけです 大きな間違いです、オブジェクト指向の根幹はカプセル化です 次に多態性、オブジェクトに適切なフルマがあって初めて 多態性を実現できます 皆が言ってることはもちろん分かる。 分かった上でViewのコートが大きくなりすぎて例えばC#ならついついpartial使ってファイル分けちゃう。 MVVMでも結局はViewか大きくなっちゃう。 いや、分かるよ。俺がViewの設計が下手っぴなのは認める。 >>93 ごめん、間違えた。 肥大化するのはViewじゃなくってViewModelだわ。 >>90 もちろん行数は目安でしかない 責務ごとにクラスを作るのが本筋 >>91 >>83 別人の発言かもしれないがこの発言の関係に疑問が残る 責務ごとにクラスを作ることで凝集度が上がるのであって 複数の責務をひとつのクラスに混ぜたら凝集度は下がるよ >>92 もちろん行数は目安でしかないが 行数が増えすぎたときに リファクタリングするのは実践的には大事 >>93 大きくなったら分割するのは何も悪くない 全体の規模が大きくなっていく時に ひとつのクラスの行数が増えるのが肥大化 クラス数を増やしていくのが正しいOOP つか、ワンオブジェクトワンファイルなんてルールは無いから。 このスレにいるような池沼が作らなければ クラスライブラリも階層や種類で作るからな 低い階層に行けばいくほど単純な簡単な機能を提供するクラスになる 階層は完全に分離させて独立したライブラリにする そして明確に種類の異なるプリミティブがある場合は ライブラリを完全に分離させて独立したライブラリにする その上にアプリケーションを実現するクラス群がのっかる 低学歴知恵遅れが作るとすべて同じ階層で同じ種類になる クラスに階層があるなんて寝言は寝て言うべきだと思うの このクラスの責務は行数を減らす事ですとか上記の沙汰じゃないやろ 当然、低レベルな部分を実現するクラスライブラリと アプリケーションが主に利用する中間層のクラスライブラリと アプリケーション自体を記述するクラス群は シロウトでもないかぎり完全に分離するからな 低レベルな部分を実現するクラスライブラリは 当然、中間層のクラスライブラリやアプリケーション自体を記述するクラス群を 参照することはまずない アプリケーションが主に利用する中間層のクラスライブラリは アプリケーション自体を記述するクラス群を参照することはまずない 低学歴知恵遅れが作ると酷い依存関係ができる コレはオブジェクト指向関係なくライブラリの基本だからな >>99 継承はクラス間の階層構造だろ? >>100 行数だけの問題じゃないけど プログラムを単純化するために 間接的なクラスを作ることはあるぞ? × このクラスの責務は行数を減らす事です ○ fooクラスに別のクラスに責務を分離できる処理を見つけたので分離しました。 その結果fooクラスの行数が減りました。 「行数を減らす」は「責務」ではない。「責務」を分離することで 得られる結果(メリット)の一つだ >70のサイト読んでると プログラミングでどの様にしてプログラミングするか というのと 実際のシステム要件なんかからどうやって設計するか というのがごっちゃに書かれている感じがする 責務とアホみたいなこといってるわ 組織でたとえるならこうなるからな 経営者クラス 社員をこき使う ↓ 社員クラス ← 派遣をこき使う(職階ごとの複数の中間層) ↓ 派遣クラス ← キミラが担当するような低レベルな部分の単純作業(つまりキミラ) 派遣は社員の作業も役員の作業もしない 社員は役員の作業はしない 行数が多いのは 作業を整理して作業を手順化して 派遣にうまく単純作業を割り当てれてないのと同じだからな つまり、人に仕事させないと自分の作業が増える キミラは派遣だからな、そういう作業はできないのは分かる 作業ミス(例外)が発生してスルーし続けてたら上までいくからな 例えば扱うビジネスの領域が違えば 部門を分けることになる 会社に複数の部門があっても一つの会社だからな 種類で分けるというのはそういうことになる キミラみたいな一種類の単純作業しかしてないヤツラには関係ない というわけでな キミラは刺身にタンポポのせる作業に戻りなさい キミラにはムリ あ、オマエは刺身の醤油入れに醤油つめる作業だったか いや、醤油入れのキャップをしめる作業だったか ともかく、キミの細かい作業なんかオレは知らないからな 作業ミスが発生したらちゃんと報告するようにな まずキミの直属の上長にだ 分かった? >>106 それだと上位が下位に依存して 組織が硬直化する インタフェスを挟んで依存関係を逆転させる (経営者クラス → 社員インタフェス) ← (社員クラス → 派遣インタフェス) ← 派遣クラス これがInversion Of Control >>112 それどこの定義? それと同じような説明をしてる場所教えて Inversion of Controlパターンでコンポーネント間の結びつきを弱める:CodeZine(コードジン) https://codezine.jp/article/detail/60 こことか ただのリフレクションやんけ 昔のウンコMFCのコントロールのリフレクションとほとんど同じ 結局親のコントロールに大量のリフレクションのコードを埋め込むことになる コントロールごとに処理記述するほうがはるかに分かりやすい ×結びつきを弱める ○もともと末端ではなにもしない処理にする 何もしないだと・・・ じゃあたんぽぽ担当は何のために いちいちタンポポ載せてる作業経過報告はいらない 作業の補助とか、いちいち次になにをするかとかとか指示はしないからな タンポポが地面に落ちたとかこのタンポポのハナ小さいとか そういう報告もいらない 捨てときなさい それぐらい分かるだろう タンポポが足りなくなりそうになったら この台帳に書いときなさい コレだけはたまに見といてやるからな DBのテーブル数や列数が少なくて テーブル設計が洗練されているならオブジェクト指向っていいんだろうね。 でも現実のシステム考えるとアホみたいにテーブルの数が多くて アホみたいに列の数が多くて、整理もされていないわけじゃん。 そしてアホみたいに文言の定数定義とかも多い。 そうすると、階層構造作ってレイヤの数を増やして 結果的1つの機能を達成するのに作るファイルの数が増えるほど、 それらのアホみたいに多くて長い列名をレイヤの数だけ書きまくる みたいな苦行が待っているわけじゃん。 少しでも項目名の変更があったらそれらのファイル部書き換えたり クラス名に変更がありでもしたらファイル名やフォルダ名とか、 テーブル名、import文とか全部書き換えになるわけじゃん。 それにオブジェクト指向でどう頑張っても最終的に値を 埋め込む画面が汚くなるのは避けることができない。 そうするとオブジェクト指向設計で無理にファイルを分けて 構造化するリスクってやばいと思う。 そうなると少ないファイルオブジェクト指向クソ喰らえみたいな勢いで 構造化プログラミングだけでゴリッと書くほうが早いと思うんだよね。 命名規則もいちいち気を使わないで勢いで書くんだよ。 ファイルの中関数定義だらけになるが、 その中で似たような処理の関数見つけてきて、複製して、 今必要な処理ができるように改変して新たな関数を作る。これで十分だ。 1ファイルの中で完結しているんだから不具合は波及しない。 ファイルをまたいでimportして無理にファイルの昨日使う必要性なんて どこにも有りはしないだろ。ファイルの頭からimportやextend inplementだらけ とか吐き気がするよ。 オブジェクト指向ってファイル間の関連性追ったり、 ファイル構造を含んだデバッグの苦痛は無視してんのか?って思う。 >>122 簡単に言うと短期間しか使わないシステムなら 構造化+DBで組むのも良いと思うけど 長期間使う大規模なシステムは オブジェクト指向で組んだ方が 保守まで含めた全体のコストは下がる だから企業もOOを採用している >>122 それオブジェクト指向の問題じゃなく、システムの基本設計が破綻してるだけ。 >オブジェクト指向ってファイル間の関連性追ったり、 >ファイル構造を含んだデバッグの苦痛は無視してんのか?って思う。 それはその通りだと思う ただ関連性はプログラムではなくてクラス構造図やオブジェクト生成手順図みたいなので判断するもので所謂上から下に辿って見て行く物でも辿って出きる物でも無い オブジェクト指向プログラミングをすると設計図をちゃんと描いてから作ってる って感じがするし ただまともに且つ効果的に作るのは難しくて解っていない人が無理やり作ってしまうと反って酷くなる そういう風にしか作れなかったりそういう風な人しか居ないならオブジェクト指向プログラミングは止めておいた方が良いそういう風な所はcobolみたいなのが一番向いていると思う ただしオブジェクト指向プログラミングに効果的な使い方が有り実際に行われているのでオブジェクト指向プログラミングその物がおかしいというのは間違い 多くの人が 使えるか? 使うべきか? となるとそれは無理なのかなぁ とは思う どっちかって言うと解らないなら無理して使うなという物だと思う 解らない人が有る程度居る?沢山居る?ということならプロジェクトで使わないという判断する というのが重要なんだと思う 解らない人には苦痛でしかないし解らない人が作った物は本人にも他に人にも迷惑でしかないだろうなぁ オブジェクト指向がよくわからんド素人俺にはlinqは感動した。 web系フレームワークの真似事+継承だらけのコードのメンテは地獄だった。素人が手をだしたらアカン代物だわ。 >>128 そのブログ前も見たけど説明が下手だなあ…… 何でデザインパターンが必要なのかとか 自分の言葉でほとんど説明できてないじゃん 分かりやすさ以前に分かる説明をしていない >>125 そらーオブジェクト指向はオブジェクト使うからオブジェクトの構造をちゃんと綺麗に作れば問題は起きないな オブジェクトの構造と言えばオブジェクト同士の繋がり方関連性も含まれるだろうからそのまま全体像にも繋がるから個々のオブジェクトさえちゃんと作れば全部が良くなるとも言えるはず 問題はシステムの基本設計が破錠しないように作ればいい、ということではなくて破錠しやすいという所にあるような >>134 そやな。俺が知ってる唯一の情報がオブジェクト指向はシステムの基本設計が破綻するってだけだからな。 俺が知ってる情報は次の2つだ 1.バカが使うとどんな言語でも破綻する 2.>>133-135 はそのバカに属する >>136 問題はそこからやな バカが使わなければ破錠しないのか、隠蔽のコスパが手続き型や関数型で作るコスパを本当に上回ってんのか オブジェクト指向は複雑な構造を構築するわけだから 別に破綻はしないだろう むしろ見た目は良い オブジェクト指向の弱点はクラスとクラス間の関係を設計しないといけないこと 小規模ならいいが大規模だと設計必須 とりあえず書き始めると最後に詰まるのがオブジェクト指向 小っちゃいパーツを作ってって最後に組み合わせるとき全然組み合わなかったり つなぎ目の形が合わないのがオブジェクト指向 普通は小さいパーツが出来てるならある程度楽できるはずなのに逆に苦しくなる 本当におかしい クラスの関係の設計を軽減するためにクラスには最低限の機能しか実装しないようになっていく インターフェイスを考えた上の設計がないと後で詰まる 当たり前に思ってるけどそれはオブジェクト指向の限界というか弊害 つまりクラス間の関係を排除して、Mix-inだけできるようになればいいのかな >>140 境界定義なんて、モノリシックアプリでも必須なんだが? その認識もないままオブジェクト指向とかマイクロサービスに手を出すとグダる。 開発チームを苦しめるマイクロサービス(翻訳) https://techracho.bpsinc.jp/hachi8833/2018_01_29/51135 >>142 限界? 弊害? >>142 のどこに限界や弊害が書いてあるの? >>145 あんまりそこにしっかり書かれていないから語弊ありきで言うんだが その抽象的間接的に作らなきゃいけないてことやな 作ってもいい、じゃなくて作らなきゃいけないという >>146 そりゃ大規模プログラムをメンテナンス性あげて作ろうとしたら オブジェクト指向に限らず、考えなきゃいけないことだろな。 でも破綻していいなら、別に抽象的間接的に作らなくていい。 小さなツール程度ならゴットクラスで破綻状態でもなんとかできるだろうさ そういう点で、オブジェクト指向の限界でも弊害でも何でも無い >>147 いや俺の言う破綻てのは別にオブジェクトオンリーにこだわって 細かいとこをクロージャで逃げたり、その場しのぎ的に小さいオブジェクトで茶を濁すのもダメって意味じゃないんよ 小さいオブジェクトならオブジェクト同士やシステムが密結合になりえないだろうしな オブジェクト指向の問題や破綻てのはやはし密結合の時にだけ起こるな > オブジェクト指向の問題や破綻てのはやはし密結合の時にだけ起こるな 因果関係が逆 密結合の時・・・問題や破綻が起きる(オブジェクト指向に限らない) 話はこれだけだろう?単純だろうが まあオブジェクト指向は密結合を観察する際の一つの指針にはなるかな。 〜指向全般に言えるけれど、結局は一つの指標みたいなもんで 指標上げることが目的になったらクソになるのは当たり前だよね。 オブジェクト指向に継承って要る? もともとのオブジェクト指向の発想からすれば、別に無くてもいいっていうか、むしろ邪魔じゃね? >>154 継承でコードを書く量を減らせるってのはあるが、他の仕組みで代わりになるなら無くても良い ああでもルートクラスのメソッドを全部で使えるってのはでかいかなあ >>149 ちゃうねん 複雑で大規模なモノは何で組もうが問題や破綻が起きやすくなる、って話と オブジェクト指向は複雑で 大規模なモノを作ると破綻する、ってのは意味が違う 何故ならオブジェクト指向そのものが大規模で複雑なモノを作るため”だけ”の物だからよ。話の流れで言うと前者により後者が悪質な形で発動する ただ当然理想論言えば問題を元々起こさなきゃいいっちゃいい話よ理想を言えば > 何故ならオブジェクト指向そのものが大規模で複雑なモノを作るため”だけ”の物だからよ。 前提が間違っているから話にならん。 まず標準ライブラリの時点ですでに大規模で複雑 それが隠蔽されてるから単純に見えるってことに気づいていない 大規模で複雑なものを作るためだけのものだからというのなら、 ほとんどのものが大規模で複雑なんだから、オブジェクト指向を 使うのは当然ということになる そして隠蔽されている部分は無視するという話なら、(オブジェクト指向の) 標準ライブラリを使うだけの簡単なコードは作れる 例えば、Rubyでprint "hello world"と書いただけでもオブジェクト指向が使われてる オブジェクト指向であっても、小規模で単純なものを作れるものである証拠 >>158 オブジェクト指向言語の標準ライブラリとか1番破綻しないオブジェクト指向のパターンじゃないか? そりゃ全てのオブジェクト指向で作った物が全て破綻することはないだろう 大規模に向いてるオブジェクト指向をあえて小規模なもの作るに都合いいから流用するのはいい事だろう。個人的には自分で作ったクラスを多数のところで使い回してるならそれぞれ小規模でも全体でみたら中、大規模じゃんってなる所はあるけども とわいえ、それでもやっぱりオブジェクト指向は大規模なものの為”だけ”にあって、そのため”だけ”の機能があって、そのせいで破綻するってのが俺の考えよ >>159 だからオブジェクト指向で小規模なものを作る例あげたじゃん。 馬鹿なの? 大規模なら破綻するのは、オブジェクト指向で無くても同じ つまりお前の理屈は オブジェクト指向・・・小規模は作れない、大規模は作れる ???指向・・・小規模は作れる、大規模も作れる って言ってるだけでしょ で大規模であれば、破綻するのはどちらも同じなんだから 大規模に置いてはオブジェクト指向も???指向も変わらない だからオブジェクト指向で、小規模は作れないと言ってるだけだよね? (実際にはオブジェクト指向で小規模なものが作れる) この原則さえ守れば破綻は回避できる 大体の大きな問題は起きなくなる @公開インタフェースは可能な限り少なくする A原則として、よほど適切な理由がないかぎり、可能な限り継承よりコンポジション使う B下位階層(ここでの階層は>>101 >>106の意味)のクラスが上位階層のクラスのインターフェースに絶対に直接アクセスしてはいけない ※ 当然、下位クラスが上位クラスのインターフェースを直接呼びだすようなリフレクションは禁止 C下位階層のインスタンスが非同期で上位のインスタンスに処理を依頼したい状況が発生した場合(可能な限りこんな状況が起きる設計は当然避けるべき)、 処理のやりとりはメッセージキューで行い、可能な限り少ない回数で簡潔なメッセージを用いて簡単に完結できるようにする、複雑なメッセージシーケンスも禁止 (コレは並立するインスタンス間でも同じ) D同じ階層に並立するインスタンスをムダに乱立させるのは当然禁止 コンポジションとメッセージシーケンス、クラスの階層(ここでの階層は>>101 >>106の意味)、インスタンスの生存期間さえ ドキュメントで適切におさえることができる状態になっていれば 問題やエンハンスが発生しても持続可能対応できる >>160 そりゃ作れないなんて言ってないがな。 「オブジェクト指向は大規模なモノを作る為だけにある」って話であって「オブジェクト指向は小規模なモノは絶対に作れない」とはならんからな ただオブジェクト指向で小規模なモノ作ったらデータをオブジェクトでラッピングしやすいてのがあるけど あれ完全に全くの偶然でデータをオブジェクトにまとめるのがオブジェクト指向の本丸じゃないように、オブジェクト指向の本丸ではないサブシステムが運良くそこにハマったってだけで 特にそこもオブジェクト指向は大規模なモノを作る為”だけ”にあるってのは意味は変わってないからな 俺が言ってるのは一般的にモノが複雑になれば破綻しやすいという話ではなくて 、”その上で更に”オブジェクト指向は独特の破綻を招くって話であって >>163 あー、わかったわかった、つまりこういうことだろ? 墜落事故は飛行機特有の問題だ 自動車は飛べないから墜落自体ありえない 自動車で遠くにいくなら時間はかかるし 距離も長いから事故の確率も上がるし大変だが 飛べないから墜落事故は起きないのだ そう主張することで、飛行機の何を否定しているのかわからんのと どうように、オブジェクト指向の何を否定しているのかわからんがなw おまえら破綻しすぎじゃね?w どうやったらそんなに破綻を量産できんねんw >>164 オブジェクト指向の話で悪い例え話したら1番イカンやろ。抽象的なもんの取り扱いなんだから。しかも何言ってるかわからんけど多分それは違うしな >>166 いやまさにそういう事よ。多人数が動く大規模で抽象的な流れは上手くいくはずがないわ。しかも間違い失敗のリカバリーはオブジェクト指向のメリットの規制隠蔽が裏目に出てより悪化する >>167 > オブジェクト指向の話で悪い例え話したら1番イカンやろ。 は?なんで? 反論できない言い訳にもほどがあるわ > しかも間違い失敗のリカバリーはオブジェクト指向のメリットの規制隠蔽が裏目に出てより悪化する しない。 オブジェクト指向を使わないほうが破綻するし、 破綻した後のリカバリーはオブジェクト指向よりも大変 お前は単に両方とも破綻するが オブジェクト指向的破綻をするのはオブジェクト指向だけと言ってるだけだろ 破綻する時点で問題なんだよ。オブジェクト指向の方が破綻しない >>169 >オブジェクト指向的破綻をするのはオブジェクト指向だけと そういう事や。楽をするためにそれをするメリットが上回ってデメリットのが下回らなきゃいけないのはオブジェクト指向の完全必須項目なんだが 大規模複雑はこの完全必須項目がどんどん難易度が上がってくる。 途中の間違い失敗のリカバリのコストは確実にオブジェクト指向のが上 理想論一般論で言えば間違えなくちゃんと作ればいい、どの作り方でも大きいのは大変は大変、以上!て言えばそりゃそうだが その問題を防ぐための記法が裏目に出て逆効果なら理想論一般論で片付けたらいかんでしょ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる