オブジェクト指向は愚かな考え

1 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 16:57:23.25 ID:NaL2qLjhd

カプセル化(英語:encapsulation)とは、オブジェクト指向を構成する概念の一つで、オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることをいう。

かつて偏差値の低い学校向けの情報処理系教科書において「カプセル化は大変すばらしいものであり絶対に使うように」と大体的に宣伝された。

一方、カリフォルニア大学バークレー校の有識者を中心とした「インターネットを作った人たち」は「階層化の有害性」として「カプセル化は絶対にやめろ」としている。

https://monobook.org/wiki/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

2 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 16:57:51.04 ID:NaL2qLjhd

大雑把にいうと、教科書の上では素晴らしく、最初は良くても、将来的な改修の際に隠蔽されたデータにアクセスできないと解決できない問題が出てきて、非常に高確率でデスマーチに陥るというのである。
医学的にいえば「手術ができない存在」であるといえる。
23 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:22:07.01 ID:bbyuj0Yi0
>>2
C++が流行りだしたころに、これ言ったら変な目で見られたわ。
設計能力と未来を見通す能力がある人限定なんだよ。
大人数だと低い方に合わされるから、大人数プロジェクトには不向き。優秀な少数精鋭プロジェクトなら良いんだけどね。
3 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 16:58:05.91 ID:NaL2qLjhd

オブジェクト指向の発案者であるアラン・ケイもコーディング規約(頭文字にアンダースコアを付けるなどの命名規則)で縛る程度にすることを推奨しており、アラン・ケイが関わったオブジェクト指向プログラミング言語にはどれも「private」などという概念はない。
4 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 16:58:30.10 ID:NaL2qLjhd

ソースコードが存在し改修が可能であればカプセル化しても問題ない。ソースコードがあってもライセンス的に改修できない場合や、そもそもバイナリのライブラリしかない場合などは絶望的である。
5 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 16:59:20.41 ID:NaL2qLjhd

実例
XNA(MonoGame)では標準で3Dモデルを手軽に扱えるModelクラスが用意されている。 1行で読み込み、1行で描画できる素晴らしいものだ。

ただしこのModelクラスを使うと頂点データは遮蔽されておりアクセスできない。 物理演算エンジンに食わせるのにどうしても頂点データが必要なのにだ。

そこで頂点データをGPUに送信後にGetData関数で返してもらうというトリッキーなコードで回避する。 しかし、この方法では動かない環境がある。 iOSやAndroidのOpenGL ESなんかがそうだ。 こいつらはGPUとの通信が一方通行。

そこで事前に3Dモデルから頂点データを抜き出し別ファイルに保存しておくトリッキーな方法で回避する。 ファイルが2個になりました。 謎の不具合が発生しています。 片方のファイルの更新を忘れました。

カプセル化は恐ろしいね!

6 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:00:47.29 ID:flnyUul/H
シンプルなほうが解読しやすいよね
散逸して現物しか残ってない場合とか特に
7 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:05:04.14 ID:Bqmv61pE0
逆張りおじさん
8 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:05:51.61 ID:qFzM0+sv0
なんか基本情報技術者止まりの学生さんって感じの文章
9 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:06:00.55 ID:j6NmyjI80
つまりどういうことや
10 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:06:48.13 ID:LKhJ6fPV0
8番のモジュールまだ~?
11 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:07:48.00 ID:2niNRZ0w0
美少女クラスに排便メソッドを実行できない
12 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:08:06.95 ID:cAw3ir+t0
俺が初めてつくったゲーム全体でシングル関数になってて笑う
関数の頭から後ろまでで1フレームの描画だからある意味美しくもあるけど
13 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:09:03.30 ID:5ZAoBBr3M
究極のところアプリケーションの出力を他のアプリから自在に扱えるOSってのが理想
マーケットスピードなんかを利用して
株の自動売買を構築しようと思っても
内部データを読み出せないしな
自前描画のJava製となるとメモリハックも厳しい
14 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:10:04.43 ID:dnF6pZ/50
オブジェクト指向プログラミング出来ない老害はとことん出来ないからな
15 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:10:33.84 ID:zDOwEbSO0
頂点読めないのはプログラムのカプセル化とは関係ないだろ
だいたい、privateにしておこうと思ったようなデータに後からアクセスするようなことしてまともに動くわけがない
それこそデスマーチ確実だろ
16 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:12:15.31 ID:+LO7uNtK0
副作用の起きない処理はpublicでも問題ないだろうな
問題が起きるとすれば運用側の問題
17 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:13:56.19 ID:YPuP8JBe0
オブジェクト志向じゃないとツール使ったテストが難しくなりそうだが
その辺はどうなんだろね
18 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:14:43.47 ID:ZNuYk5620
一般に公開されたライブラリとしてはパブリックな静的メソッドの集合の方が使い勝手が良い場合もあるが
自分たちで作ってるフレームワークとかだとクラス化して責任範囲明確化した方が安全だろ
どうしても後から公開しないといけないデータやメソッドが出てきたら単にソースいじって公開すれば良いだけだし
19 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:15:37.60 ID:S32hCWxi0
ファイルアイコンをクリックしたらアプリが立ち上がるのもオブジェクト指向でいいのか?
20 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:18:31.05 ID:YPuP8JBe0
今更オブジェクト指向やめますって言われても
昔書いてた形で今風のアプリ作れなんて無理だわ、もう体に染み付いちゃたし
21 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:20:14.04 ID:QkWrn8B9d
俺プログラマだけどこういう話全然分かんね
何してたら理解できるようになるんだ?
24 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:24:55.47 ID:bbyuj0Yi0
>>21
まだ経験の少ない若い人なら、もう少し経験積めば良い。
炎上プロジェクトを何度か経験すると、何が原因だとか、何によってコードが複雑化するのか、とかそういうのを考えるようになる。
34 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:41:36.76 ID:aoWeg8VQM
>>21
ほんとにプログラマか?
22 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:20:34.26 ID:xpFFCmFr0
この事例だと導入するライブラリを間違ってるだけでしょ
大量のグローバル変数地獄のほうがきついよ
25 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:25:31.12 ID:arBfmd9Jp
日本の場合はカプセル化されてようがいまいが基底クラスなんて弄ったら再テストしなきゃいけないから
同じ機能を持ったクラスを作るので意味が無い
26 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:25:58.11 ID:URVn5J6O0
振る舞いがわかってるんだから、必要になった時にそのオブジェクトだけ差し替えたら?
27 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:29:20.05 ID:NjDOs+Bl0
そもそもアランケイの考えたものと今のオブジェクト指向が違うっていうね
オブジェクトなんて名前を使ったせいでオブジェクトが重要だと勘違いしてるし全員
よって失敗
ただ発展には貢献したそれだけ
32 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:36:50.16 ID:Ddg/4dXA0
>>27
smalltalkはあんま普及してない?
28 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:30:14.82 ID:bxtsjV91r
Staticおじさんスレ?
29 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:31:34.13 ID:mVcB0Cxb0
よー分からんな
実例の話は始めから触れないと問題ある部分があるのに選択したのが間違いじゃないの?
オブジェクト指向じゃなくても痒いとこに手が届かないみたいなことはあるよね
31 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:35:52.76 ID:YPuP8JBe0
>>29
この実例は良くないよね
Modelクラスが何かにラップされてるならその元を探して改良すべきなのに
それやらないでトリッキーな方法で回避するから余計面倒になってる
30 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:31:39.95 ID:jnrp3qED0
昔作ったクラスを継承したり再利用したりなんて殆どない

データと関数数個だけで済むものを
無駄にクラス化して
ヘッダと実装にわけて無駄にコード追いにくくするのはあかん

33 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:40:49.52 ID:DW2SCuso0
内部に状態を持つな
35 名前:番組の途中ですが翡翠の名無しがお送りします 投稿日時:2020/06/18(木) 17:42:15.76 ID:1vEXKpee0
オブジェクト指向で設計やるとしばしば手段が目的化してしまって不必要に複雑化する

コメント

タイトルとURLをコピーしました