カプセル化(英語: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)
カプセル化の有害性、オブジェクト指向は愚かな考え
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2020/06/18(木) 23:47:36.69ID:l/2SQUll2020/06/18(木) 23:48:12.14ID:l/2SQUll
大雑把にいうと、教科書の上では素晴らしく、最初は良くても、将来的な改修の際に隠蔽されたデータにアクセスできないと解決できない問題が出てきて、非常に高確率でデスマーチに陥るというのである。医学的にいえば「手術ができない存在」であるといえる。
2020/06/18(木) 23:48:21.02ID:l/2SQUll
オブジェクト指向の発案者であるアラン・ケイもコーディング規約(頭文字にアンダースコアを付けるなどの命名規則)で縛る程度にすることを推奨しており、アラン・ケイが関わったオブジェクト指向プログラミング言語にはどれも「private」などという概念はない。
2020/06/18(木) 23:49:03.96ID:l/2SQUll
実例
XNA(MonoGame)では標準で3Dモデルを手軽に扱えるModelクラスが用意されている。 1行で読み込み、1行で描画できる素晴らしいものだ。
ただしこのModelクラスを使うと頂点データは遮蔽されておりアクセスできない。 物理演算エンジンに食わせるのにどうしても頂点データが必要なのにだ。
世界中の誰もが同じ問題で悩んでいるようでstackoverflowに回避策が書いてあった。頂点データをGPUに送信した直後にGetData関数でそのまま返してもらうトリッキーなコードでめでたく回避できた。
しかし、時は流れこの方法では動かない環境が登場した。iOSやAndroidだ。こいつらが採用するOpenGL ESはGPUとの通信が一方通行だ。そこで事前に3Dモデルから頂点データを抜き出し別ファイルに保存しておくという一段とトリッキーな方法で回避する。みごと1モデルのファイルが2個になりました。
さらに時は流れた。あるとき謎の不具合が発生。連日連夜のデバッグ作業。原因は片方のファイルの更新を忘れていただけでした。
カプセル化は恐ろしいね!!
XNA(MonoGame)では標準で3Dモデルを手軽に扱えるModelクラスが用意されている。 1行で読み込み、1行で描画できる素晴らしいものだ。
ただしこのModelクラスを使うと頂点データは遮蔽されておりアクセスできない。 物理演算エンジンに食わせるのにどうしても頂点データが必要なのにだ。
世界中の誰もが同じ問題で悩んでいるようでstackoverflowに回避策が書いてあった。頂点データをGPUに送信した直後にGetData関数でそのまま返してもらうトリッキーなコードでめでたく回避できた。
しかし、時は流れこの方法では動かない環境が登場した。iOSやAndroidだ。こいつらが採用するOpenGL ESはGPUとの通信が一方通行だ。そこで事前に3Dモデルから頂点データを抜き出し別ファイルに保存しておくという一段とトリッキーな方法で回避する。みごと1モデルのファイルが2個になりました。
さらに時は流れた。あるとき謎の不具合が発生。連日連夜のデバッグ作業。原因は片方のファイルの更新を忘れていただけでした。
カプセル化は恐ろしいね!!
2020/06/18(木) 23:50:00.80ID:RTNtaITn
仕様変更
それは雲の上で決まったことなので底辺社畜のITドカタにはどうすることもできない。
意見を言おうにも雲の上にいる奴らの顔すら知らない。
それこそが階層化で起きることだ。
オブジェクト指向云々ではない。
それは雲の上で決まったことなので底辺社畜のITドカタにはどうすることもできない。
意見を言おうにも雲の上にいる奴らの顔すら知らない。
それこそが階層化で起きることだ。
オブジェクト指向云々ではない。
2020/06/18(木) 23:50:50.45ID:vbQxaIet
シンプルなほうが解読しやすいよね
散逸して現物しか残ってない場合とか特に
散逸して現物しか残ってない場合とか特に
2020/06/18(木) 23:51:52.81ID:aKnQJHa5
副作用の起きない処理はpublicでも問題ないだろうな
問題が起きるとすれば運用側の問題
問題が起きるとすれば運用側の問題
2020/06/18(木) 23:53:22.90ID:evvN6o0n
データベースに出し入れするだけの業務システムなんかは問題ない。
データベース上のデータなんてグローバル変数となんら変わらない。
クラスは構造体としてしか使わないから深い階層化も起きないし。
データベース上のデータなんてグローバル変数となんら変わらない。
クラスは構造体としてしか使わないから深い階層化も起きないし。
9デフォルトの名無しさん
2020/06/18(木) 23:54:18.03ID:evvN6o0n >>2
C++が流行りだしたころに、これ言ったら変な目で見られたわ。
設計能力と未来を見通す能力がある人限定なんだよ。
大人数だと低い方に合わされるから、大人数プロジェクトには不向き。優秀な少数精鋭プロジェクトなら良いんだけどね。
C++が流行りだしたころに、これ言ったら変な目で見られたわ。
設計能力と未来を見通す能力がある人限定なんだよ。
大人数だと低い方に合わされるから、大人数プロジェクトには不向き。優秀な少数精鋭プロジェクトなら良いんだけどね。
2020/06/18(木) 23:54:53.81ID:evvN6o0n
日本の場合はカプセル化されてようがいまいが基底クラスなんて弄ったら再テストしなきゃいけないから
同じ機能を持ったクラスを作るので意味が無い
同じ機能を持ったクラスを作るので意味が無い
2020/06/18(木) 23:55:28.61ID:/lqvqqb1
そもそもアランケイの考えたものと今のオブジェクト指向が違うっていうね
オブジェクトなんて名前を使ったせいでオブジェクトが重要だと勘違いしてるし全員
よって失敗
ただ発展には貢献したそれだけ
オブジェクトなんて名前を使ったせいでオブジェクトが重要だと勘違いしてるし全員
よって失敗
ただ発展には貢献したそれだけ
12デフォルトの名無しさん
2020/06/18(木) 23:56:10.69ID:TSP7N+np 昔作ったクラスを継承したり再利用したりなんて殆どない
データと関数数個だけで済むものを
無駄にクラス化して
ヘッダと実装にわけて無駄にコード追いにくくするのはあかん
データと関数数個だけで済むものを
無駄にクラス化して
ヘッダと実装にわけて無駄にコード追いにくくするのはあかん
2020/06/18(木) 23:57:06.18ID:MtNDH7Ee
2020/06/18(木) 23:58:55.32ID:YGaYv0dq
2020/06/18(木) 23:59:22.80ID:bx1rTxjv
内部に状態を持つな
2020/06/18(木) 23:59:49.19ID:q6R3f09j
オブジェクト指向で設計やるとしばしば手段が目的化してしまって不必要に複雑化する
2020/06/19(金) 00:00:25.84ID:/31ICsy6
privateの考え方自体は悪くないんだが、
privateの必要性を理解できる人間はそもそもprivateを必要としないんだよ
そしてprivateが必要な人間はprivateの本質を理解せずにおかしな使い方をしてしまう
こういうジレンマは何にでもある
privateの必要性を理解できる人間はそもそもprivateを必要としないんだよ
そしてprivateが必要な人間はprivateの本質を理解せずにおかしな使い方をしてしまう
こういうジレンマは何にでもある
2020/06/19(金) 00:01:18.25ID:+IhkHRGD
カプセル化は机上の空論ってのは頭いい人しかいないチームでしか通用しない
日本のIT土方みたいに想像を絶する馬鹿が無限に湧いてくる現場ではコードを守るために不可欠
日本のIT土方みたいに想像を絶する馬鹿が無限に湧いてくる現場ではコードを守るために不可欠
2020/06/19(金) 00:01:50.77ID:2JP1keJd
無駄に継承しまくるのが害悪なだけ
2020/06/19(金) 00:02:19.49ID:wxIbXk9M
あとになって公開できないなら隠蔽するなってことだろ
ずっと保守し続けて、公開してくれって言われたらすぐ設計変更して公開できるなら別にかまわん
でもずっと保守し続けるかどうかは予算や人事で決まるんだから、それらに関われないと責任持てんわな
ずっと保守し続けて、公開してくれって言われたらすぐ設計変更して公開できるなら別にかまわん
でもずっと保守し続けるかどうかは予算や人事で決まるんだから、それらに関われないと責任持てんわな
2020/06/19(金) 00:03:06.93ID:BXl5HLPF
想像を絶する馬鹿が想像を絶するカプセル化をしてしまうんだよなあ……
2020/06/19(金) 00:04:23.05ID:mHF7j7mX
特定の事例はオブジェクト指向とかクラスが悪いわけじゃなくて
その設計が失敗してるだけですね
その設計が失敗してるだけですね
2020/06/19(金) 00:05:13.42ID:bOeh/ohg
24デフォルトの名無しさん
2020/06/19(金) 00:06:06.77ID:wn9UnRAm OOPにすらついていけない本物のバカには無理ってだけ
まあOOPが無理ならどんなプログラミングも無理だけど
まあOOPが無理ならどんなプログラミングも無理だけど
2020/06/19(金) 00:06:46.04ID:OaIc6ajp
路線バス、タクシー、レンタカー、自家用車の4つを使ってオブジェクト指向を説明して欲しい。
難しすぎて全然頭に入らない。
難しすぎて全然頭に入らない。
2020/06/19(金) 00:07:21.87ID:c3NGwjmZ
時代はDDDって聞いたんだけど
2020/06/19(金) 00:07:51.60ID:cOWnS532
余計な例えは無意味
そもそも変数とか関数とか引数とか理解しとんのか
そもそも変数とか関数とか引数とか理解しとんのか
2020/06/19(金) 00:08:22.59ID:Vry7Dmyh
じなあガンダムで例えてくれ
2020/06/19(金) 00:08:50.90ID:ih59xFoN
オブジェクト思考は糞
関数の引数と戻り値だけ信用すれば良い
オブジェクトに状態持たせるフィールドなんて可読性落ちるだけなのに理解できない一周も二週も遅れてるやつが声高に叫んでるのは笑えるw
関数の引数と戻り値だけ信用すれば良い
オブジェクトに状態持たせるフィールドなんて可読性落ちるだけなのに理解できない一周も二週も遅れてるやつが声高に叫んでるのは笑えるw
2020/06/19(金) 00:09:59.54ID:DxHcuyZI
2020/06/19(金) 00:11:36.72ID:A+kahko2
>>30
>>252
ざっくり見た感じVRAMに送り込んでオリジナルは破棄だな。
もともとXBOX360のフレームワークだからリソースがいまほど潤沢じゃない前提の設計だな。
それがOpenGL ESの「VRAMが書込専用」という追加仕様の襲来で火を吹いた感じだな
https://github.com/MonoGame/MonoGame/blob/develop/MonoGame.Framework/Platform/Graphics/Vertices/VertexBuffer.DirectX.cs
https://github.com/MonoGame/MonoGame/blob/develop/MonoGame.Framework/Platform/Graphics/Vertices/VertexBuffer.OpenGL.cs
>>252
ざっくり見た感じVRAMに送り込んでオリジナルは破棄だな。
もともとXBOX360のフレームワークだからリソースがいまほど潤沢じゃない前提の設計だな。
それがOpenGL ESの「VRAMが書込専用」という追加仕様の襲来で火を吹いた感じだな
https://github.com/MonoGame/MonoGame/blob/develop/MonoGame.Framework/Platform/Graphics/Vertices/VertexBuffer.DirectX.cs
https://github.com/MonoGame/MonoGame/blob/develop/MonoGame.Framework/Platform/Graphics/Vertices/VertexBuffer.OpenGL.cs
2020/06/19(金) 00:12:19.87ID:Z/R3v37q
>>31
そんな仕様変更が入る方がおかしいんじゃないかな
そんな仕様変更が入る方がおかしいんじゃないかな
2020/06/19(金) 00:12:37.66ID:CAQAyB0l
>>32
そのくらいの仕様変更はザラにある
そのくらいの仕様変更はザラにある
2020/06/19(金) 00:12:54.82ID:Vvw9/CQL
おっそろしーなぁ
35デフォルトの名無しさん
2020/06/19(金) 00:13:25.36ID:+NZQ8ymG オブジェクト思考って何?
誰か説明して
誰か説明して
2020/06/19(金) 00:13:53.03ID:0YXkLCwz
カプセル化は新人や増援部隊に変な事させない為の仕組み
開発者全員が高度なプロフェッショナルならただの足枷でしかない
開発者全員が高度なプロフェッショナルならただの足枷でしかない
37デフォルトの名無しさん
2020/06/19(金) 00:14:23.01ID:sx6tbUfu オブジェクト原理主義者のコードを引き継ぐ事になった時の絶望感は異常
2020/06/19(金) 00:15:15.75ID:yjfNCK7+
iPhoneアプリ開発に必須のobjective-cやswiftもカプセル化はできない。
人工知能で大流行のpythonもカプセル化はできないようになってる。
これらはアクセス非推奨だがアクセス自体はできる
人工知能で大流行のpythonもカプセル化はできないようになってる。
これらはアクセス非推奨だがアクセス自体はできる
2020/06/19(金) 00:15:51.85ID:a/1dBbgF
「カプセル化は悪」「カプセル化はオブジェクト指向ではない」というのがやっと広まりだした。
2020/06/19(金) 00:16:10.62ID:GyiKM2YL
仕様変更の恐ろしさは異常
2020/06/19(金) 00:16:29.89ID:sB9nUpkw
未来予測できるが勝負所
2020/06/19(金) 00:17:11.14ID:Xum0r1kt
>>5
深い階層化って利点あるの?
深い階層化って利点あるの?
2020/06/19(金) 00:17:23.63ID:HW2oJRWs
怖いですねえ
2020/06/19(金) 00:20:35.02ID:f1TZFQAl
カプセル化は隠蔽体質ってことですね
2020/06/19(金) 00:30:03.04ID:EiviKE7C
>>4
そもそも設計が間違ってるのをオブジェクト指向のせいにしてるんじゃねーよハゲ
そもそも設計が間違ってるのをオブジェクト指向のせいにしてるんじゃねーよハゲ
2020/06/19(金) 00:49:19.41ID:8/oqYbS2
>>45
XNA作ったマイクロソフトの超エリートたちですら設計ミスをするくらいオブジェクト指向は難しい。
XNA作ったマイクロソフトの超エリートたちですら設計ミスをするくらいオブジェクト指向は難しい。
2020/06/19(金) 01:06:57.53ID:brGXdq3V
ECS
2020/06/19(金) 01:27:35.28ID:gQU/M+Sr
> オブジェクト指向の発案者であるアラン・ケイもコーディング規約
> (頭文字にアンダースコアを付けるなどの命名規則)で縛る程度にすることを推奨しており、
> アラン・ケイが関わったオブジェクト指向プログラミング言語にはどれも「private」などという概念はない。
つまり
1. privateという概念(アンダースコアという概念)自体はOK
2. ただしprivateでも外部からアクセスできるようにすること
という話
> (頭文字にアンダースコアを付けるなどの命名規則)で縛る程度にすることを推奨しており、
> アラン・ケイが関わったオブジェクト指向プログラミング言語にはどれも「private」などという概念はない。
つまり
1. privateという概念(アンダースコアという概念)自体はOK
2. ただしprivateでも外部からアクセスできるようにすること
という話
■ このスレッドは過去ログ倉庫に格納されています
