「カプセル化(プログラミング)」の版間の差分
imported>Administrator |
Administrator (トーク | 投稿記録) |
||
(5人の利用者による、間の17版が非表示) | |||
1行目: | 1行目: | ||
'''カプセル化'''([[英語]]:encapsulation)とは、[[オブジェクト指向]]を構成する概念の一つで、[[オブジェクト]]内部の[[データ]]を隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることをいう。 | '''カプセル化'''([[英語]]:encapsulation)とは、[[オブジェクト指向]]を構成する概念の一つで、[[オブジェクト]]内部の[[データ]]を隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることをいう。 | ||
− | + | == 危険性 == | |
+ | かつて偏差値の低い学校向けの情報処理系教科書において「カプセル化は大変すばらしいものであり絶対に使うように」と大体的に宣伝された。 | ||
− | + | 一方、カリフォルニア大学バークレー校の有識者を中心とした「[[インターネット]]を作った人たち」は「[[階層化の有害性]]([[rfc:3439|RFC 3439]])」として「カプセル化は絶対にやめろ」としている。 | |
− | オブジェクト指向の発案者である[[アラン・ケイ]]も[[コーディング規約]](頭文字にアンダースコアを付けるなどの命名規則)で縛る程度にすることを推奨しており、アラン・ケイが関わった[[オブジェクト指向プログラミング言語]] | + | 大雑把にいうと、教科書の上では素晴らしく、開発を始めた最初のうちは良いが、将来的な改修の際に隠蔽された[[データ]]にアクセスできないと解決できない問題が出てきて、非常に高確率で[[デスマーチ]]に陥るというのである。 |
+ | |||
+ | オブジェクト指向の発案者である[[アラン・ケイ]]も[[コーディング規約]](頭文字にアンダースコアを付けるなどの命名規則)で縛る程度にすることを推奨しており、アラン・ケイが関わった[[オブジェクト指向プログラミング言語]]にはどれも「private」などという概念はない。 | ||
[[ソースコード]]が存在し改修が可能であればカプセル化しても問題ない。[[ソースコード]]があっても[[ライセンス]]的に改修できない場合や、そもそも[[バイナリ]]の[[ライブラリ]]しかない場合などは絶望的である。 | [[ソースコード]]が存在し改修が可能であればカプセル化しても問題ない。[[ソースコード]]があっても[[ライセンス]]的に改修できない場合や、そもそも[[バイナリ]]の[[ライブラリ]]しかない場合などは絶望的である。 | ||
+ | |||
+ | === 実例 === | ||
+ | [[XNA]]([[MonoGame]])では標準で3Dモデルを手軽に扱えるModelクラスが用意されている。 | ||
+ | 1行で読み込み、1行で描画できる素晴らしいものだ。 | ||
+ | |||
+ | ただしこのModelクラスを使うと[[頂点データ]]は遮蔽されておりアクセスできない。 | ||
+ | [[物理演算エンジン]]に食わせるのにどうしても[[頂点データ]]が必要なのにだ。 | ||
+ | |||
+ | 世界中の誰もが同じ問題で悩んでいるようで[[stackoverflow]]に回避策が書いてあった。内部で[[GPU]]へ送信したときに使用した[[GPU]]にアクセスする関数ポインタは公開されているのでGetData関数でそのまま返してもらうトリッキーな[[コード]]でめでたく回避できた。 | ||
+ | |||
+ | しかし、時は流れこの方法では動かない環境が登場した。[[iOS]]や[[Android]]だ。こいつらが採用する[[OpenGL ES]]はGPUとの通信が一方通行だ。そこで事前に3Dモデルから頂点データを抜き出し別[[ファイル]]に保存しておくという一段とトリッキーな方法で回避する。みごと1モデルのファイルが2個になりました。 | ||
+ | |||
+ | さらに時は流れた。あるとき謎の不具合が発生。連日連夜のデバッグ作業。原因は片方のファイルの更新を忘れていただけでした。 | ||
+ | |||
+ | カプセル化は恐ろしいね!! | ||
== 関連項目 == | == 関連項目 == | ||
13行目: | 31行目: | ||
** [[カプセル化(プログラミング)]] | ** [[カプセル化(プログラミング)]] | ||
** [[カプセル化(通信)]] | ** [[カプセル化(通信)]] | ||
+ | * [[Bjarne Stroustrup インタビュー]] |
2020年6月29日 (月) 02:01時点における最新版
カプセル化(英語:encapsulation)とは、オブジェクト指向を構成する概念の一つで、オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることをいう。
危険性[編集 | ソースを編集]
かつて偏差値の低い学校向けの情報処理系教科書において「カプセル化は大変すばらしいものであり絶対に使うように」と大体的に宣伝された。
一方、カリフォルニア大学バークレー校の有識者を中心とした「インターネットを作った人たち」は「階層化の有害性(RFC 3439)」として「カプセル化は絶対にやめろ」としている。
大雑把にいうと、教科書の上では素晴らしく、開発を始めた最初のうちは良いが、将来的な改修の際に隠蔽されたデータにアクセスできないと解決できない問題が出てきて、非常に高確率でデスマーチに陥るというのである。
オブジェクト指向の発案者であるアラン・ケイもコーディング規約(頭文字にアンダースコアを付けるなどの命名規則)で縛る程度にすることを推奨しており、アラン・ケイが関わったオブジェクト指向プログラミング言語にはどれも「private」などという概念はない。
ソースコードが存在し改修が可能であればカプセル化しても問題ない。ソースコードがあってもライセンス的に改修できない場合や、そもそもバイナリのライブラリしかない場合などは絶望的である。
実例[編集 | ソースを編集]
XNA(MonoGame)では標準で3Dモデルを手軽に扱えるModelクラスが用意されている。 1行で読み込み、1行で描画できる素晴らしいものだ。
ただしこのModelクラスを使うと頂点データは遮蔽されておりアクセスできない。 物理演算エンジンに食わせるのにどうしても頂点データが必要なのにだ。
世界中の誰もが同じ問題で悩んでいるようでstackoverflowに回避策が書いてあった。内部でGPUへ送信したときに使用したGPUにアクセスする関数ポインタは公開されているのでGetData関数でそのまま返してもらうトリッキーなコードでめでたく回避できた。
しかし、時は流れこの方法では動かない環境が登場した。iOSやAndroidだ。こいつらが採用するOpenGL ESはGPUとの通信が一方通行だ。そこで事前に3Dモデルから頂点データを抜き出し別ファイルに保存しておくという一段とトリッキーな方法で回避する。みごと1モデルのファイルが2個になりました。
さらに時は流れた。あるとき謎の不具合が発生。連日連夜のデバッグ作業。原因は片方のファイルの更新を忘れていただけでした。
カプセル化は恐ろしいね!!