カプセル化の有害性、オブジェクト指向は愚かな考え

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/06/18(木) 23:47:36.69ID:l/2SQUll
カプセル化(英語: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)
2020/06/27(土) 15:23:36.87ID:qJyof1ZF
>>327
“カプセル化可能” == “言語仕様でカプセル化を禁止している”
#=> False
329デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:25:23.02ID:kHv6hhb8
>>328
だからさー君のカプセル化の定義を知らないしそれを言ってもらわないことには
真偽値だけ言われても僕どうしたらいいかわからないよーえーん(T_T)
330デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:26:25.05ID:kHv6hhb8
カプセル化とはアクセス修飾子でprivateにできることを言います
2020/06/27(土) 15:28:46.34ID:UrcM2fcl
本当に?
2020/06/27(土) 15:31:32.87ID:qJyof1ZF
>>326

>>310
>一般的な業務システムはデータベースに出し入れするだけだから深い階層構造にはならない。

このレスに書いてる”階層構造”の定義を聞いてるに
全く違う”階層化”の話を出されても困る
特に考えてなかったんなら別にそれで構わない
2020/06/27(土) 15:32:44.69ID:qJyof1ZF
>>328
バグってた

“カプセル化不可能” == “言語仕様でカプセル化を禁止している”
#=> False
2020/06/27(土) 15:40:51.44ID:Z/pHF8i9
>>332
データベースで深い階層化が起こるとすれば、
・データベースの出し入れはストアドプロシージャ経由のみ
・誰かが作ったストアドプロシージャを叩くライブラリ
・末端開発者が見えるのはライブラリのみ

という状況
335デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:45:38.60ID:kHv6hhb8
>>331
ホントっす
2020/06/27(土) 15:46:26.65ID:ut+wnsgT
ちがうよ
337デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:46:32.04ID:kHv6hhb8
>>333
なんでFalseになるか説明できる?
できないんだったら君は間違ってる
338デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:47:10.15ID:kHv6hhb8
>>336
何が違うんですか!?なんでですか?説明してください!
2020/06/27(土) 15:47:49.36ID:UrcM2fcl
内包してない?
2020/06/27(土) 15:48:03.17ID:ut+wnsgT
>>338
定義が違うから説明しろと言われても困る
341デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:48:32.24ID:kHv6hhb8
>>340
説明くらいできるだろハゲ、横着すんな
342デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:48:33.70ID:PPBVSkWl
ぬるぽ
2020/06/27(土) 15:52:34.57ID:ut+wnsgT
>>341
>>294
2020/06/27(土) 15:53:17.57ID:ut+wnsgT
>>341
安価ミス
>>297
345デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:53:25.63ID:kHv6hhb8
>>343
なるほどね、アレルギーが、そういうことね
346デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:53:46.87ID:kHv6hhb8
恥かいた
347デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:54:37.70ID:kHv6hhb8
安価ミスってんじゃないよ!!
納得した僕が馬鹿みたいでしょうが!!
2020/06/27(土) 15:55:00.35ID:ut+wnsgT
馬鹿なんじゃないの?
349デフォルトの名無しさん
垢版 |
2020/06/27(土) 15:56:18.48ID:e0+LQFD/
ああもうめちゃくちゃだよ!
2020/06/27(土) 16:01:21.18ID:7UzCd1n0
何やってんだおめーら。
そのへんでやめとき。
351デフォルトの名無しさん
垢版 |
2020/06/27(土) 16:02:43.02ID:kHv6hhb8
カプセル化には強度があります。

C言語のヘッダやJavaのprivateといった言語機能として
カプセル化できることを強カプセル化と言います

JavaScriptやPythonのように命名規則によって使用者に
知らせるカプセル化のことを弱カプセル化と言うのです。

>>348 僕のこと見直してくれてもいいです
2020/06/27(土) 17:08:00.05ID:WDOSBdwF
カプセル化こそ
すでに時代遅れだったんじゃねーの?
2020/06/27(土) 17:38:28.03ID:ut+wnsgT
>>351
頭悪そう
354デフォルトの名無しさん
垢版 |
2020/06/27(土) 17:59:51.27ID:kHv6hhb8
>>353
嘘つき!
355デフォルトの名無しさん
垢版 |
2020/06/27(土) 18:27:35.27ID:e0+LQFD/
>>351
これまでの話を統合した結論として、

いまはgitなどバージョン管理差分確認ツールや
エディタやIDEの機能が充実してるから

言語機能でカプセル化して
「内部を意識しない」ように隠蔽したり制限するのではなく
開発ツールを駆使して内部を意識はするけど
ソースの仕様変更切り替えに対応しやすくなっている
やり方が主流

開発ツール進化によりカプセル化はその役割を終えた。
継承や抽象クラスやオーバーライドも非推奨
これをやると同じ名前のメソッドが沢山あって
IDEによるプロジェクト内キーワード全文検索を
阻害するから
356デフォルトの名無しさん
垢版 |
2020/06/27(土) 18:38:03.92ID:kHv6hhb8
>>355
カプセル化しなかったら仕様変更がしやすいのか、なるほど
357デフォルトの名無しさん
垢版 |
2020/06/27(土) 18:45:55.84ID:e0+LQFD/
>>356
読解を間違えています

カプセル化をしないことで仕様変更しやすくなるのではなく

カプセル化を「しなくても」代わりに
開発ツールが充実してるから
ブランチ切り替えや差分確認でスマートな
仕様変更と仕様切り替えが可能です。
だからカプセル化はもう不要になりました。
2020/06/27(土) 18:50:33.85ID:UrcM2fcl
それはカプセル化の使用有無に関係ないのでは
359デフォルトの名無しさん
垢版 |
2020/06/27(土) 18:52:34.90ID:kHv6hhb8
>>357
カプセル化せずに発生するオブジェクトを破壊するような変更を
差分確認で見つけ出せるわけですね、差分確認が重要ですね
2020/06/27(土) 18:54:31.03ID:twDHZDh4
>>355
×これまでの話を統合した結論として
◯これまでの話はすっ飛ばしてボクの言いたいことだけを言うと
2020/06/27(土) 19:01:29.07ID:7UzCd1n0
IDEの助けがあるとは言え、grepした時の重複は勘弁して欲しい。
どれやねんっていつも思う。
本当にOOPってメンテしやすいんだろうか?
362デフォルトの名無しさん
垢版 |
2020/06/27(土) 19:03:28.66ID:kHv6hhb8
わかりました、grepを禁止します!
363デフォルトの名無しさん
垢版 |
2020/06/27(土) 19:07:51.73ID:kHv6hhb8
世界的超人気言語はC言語、Java、Pythonと変遷していってるわけだけれども
たしかにカプセル化の機能は時代とともに弱まってるように見える
364デフォルトの名無しさん
垢版 |
2020/06/27(土) 19:10:52.99ID:e0+LQFD/
>>359
そのオブジェクト破壊って一体何を意味してる?

多少オブジェクトが破壊されたところで
アプリは動くし すぐバグになる訳じゃないだろう。
多少経験あるプログラマなら知らないオブジェクトへの
破壊的代入は軽率にはやらないだろうし、
オブジェクトのバックアップ変数作ったり少し考えれば
それくらいやるだろう。

やる時はどうしてもやる時はそうせざるを得ないからやる訳で
破壊するのにもそれなりの理由があるんだよ。
それをprivateとかprotectedするなんて余計なお節介
もいいところ
そして、そういう操作の是非は
gitでコードレビューできるだろ。
2020/06/27(土) 19:13:53.12ID:npRplKHX
カプセル化って一種の安全装置なわけだし、作業性とはトレードオフに
なるわな どちらかを選択するなら当然安全装置を選択するが
2020/06/27(土) 19:26:08.84ID:D2Sdnpa5
使い捨てだの再利用しないだの
素晴らしい含蓄をみずほレベルの巨大案件に適用してれば歴史が変わっていたかも知れない
367デフォルトの名無しさん
垢版 |
2020/06/27(土) 19:29:44.84ID:kHv6hhb8
>>364
Javaでいうところのprivateやprotectedの値を書き換えたり参照したりといったことを
オブジェクトの破壊と言ってます
コードレビューできるっていうのはそれをやらないと洗い出せないってことでしょ
カプセル化の機能を使っていれば実装時に気付けることをレビューまで先延ばしにすることによって
得られることがそんなに多いのですかね
368デフォルトの名無しさん
垢版 |
2020/06/27(土) 19:37:50.49ID:kHv6hhb8
たとえばこの先Pythonが、名前が_から始まるメンバに外からアクセスすると
構文エラーになるようになった場合、動作するプログラムにカプセル化を破壊するような
操作がないことは明白になるのでとても便利だと思います
2020/06/27(土) 19:42:29.28ID:npRplKHX
Pythonぐらいの緩さが一番バランスいい気がする
人気があるのも納得
2020/06/27(土) 19:44:24.05ID:7UzCd1n0
>>368
dart的な感じ?
371デフォルトの名無しさん
垢版 |
2020/06/27(土) 19:50:55.69ID:kHv6hhb8
>>370
そうです、そのdart的な感じです
dartを使ったことがないので僕は知りませんけど
372デフォルトの名無しさん
垢版 |
2020/06/27(土) 19:53:28.59ID:kHv6hhb8
アクセス修飾子でアクセス制限をかけてしまうと
テストすることさえできなくなります
これがカプセル化の圧倒的な弱点です
373デフォルトの名無しさん
垢版 |
2020/06/27(土) 19:55:33.60ID:kHv6hhb8
privateではありつつもテスト時などにアクセス可能なバックドアが必要で、それが現代のプログラミング言語には欠けていると思います
2020/06/27(土) 20:15:27.61ID:7UzCd1n0
>>373
そのへんJavaとかリフレクション駆使して回避してるので構造的、致命的な欠点とは言い切れないと思うよ。
リフレクションがバックドアと言われたらそれはその通りなので反論できないけど。
2020/06/27(土) 20:17:13.10ID:mehAi5n4
グローバル変数使用禁止の
public staticが唯一無二の解決策だというのにわからん奴がいるな
2020/06/27(土) 20:34:22.57ID:gS37C1rZ
>>373
テストでアクセスするならそれはpublicにすべきもの
言い換えると、テストですらアクセスしないものをprivateにする
2020/06/27(土) 20:35:14.22ID:gS37C1rZ
>>372
テストするならpublicにすればいいだけ
378デフォルトの名無しさん
垢版 |
2020/06/27(土) 20:39:11.40ID:e0+LQFD/
まず重要な前提として
システムの仕様変更というのは
appのソースコードの変更だけではない。
データベースの変更や接続してる外部サーバや
ストレージに関連する仕様変更とかもある。

そして、カプセル化を初めとするオブジェクト指向の
設計技法はメモリ内の瞬間的なごく狭い範囲の
事しか考えてない。

外部環境の仕様が変わったり、フェイルオーバーなどの
不具合が起きてシステム全体のデバッグしたり
不具合調査するときに、app層がカプセル化されていたり
オブジェクト指向の技法が使われているほど
それらが邪魔になってやりにくくなるのは
想像に難くないと思う。

仮想化やクラウド化が進んでる最近では
こういう外部環境の隠蔽は逆に困るんだよ。
2020/06/27(土) 20:46:30.95ID:npRplKHX
>>378
オブジェクト指向の技法が使われているほど
それらが邪魔になってやりにくくなるのは
逆説的だがこれが利点の一つなんだ 手続き型だと
直したつもりになることが多々あり 新たなバクを生む
時間が多少かかっても形式的に処理するべき
380デフォルトの名無しさん
垢版 |
2020/06/27(土) 20:59:08.97ID:kHv6hhb8
>>376
それはないわー
テストは全メソッドやるでしょ
全部publicにしなければいけないなんて間違ってると思います!
僕はそれ間違ってると思います!
381デフォルトの名無しさん
垢版 |
2020/06/27(土) 21:00:30.56ID:kHv6hhb8
>>377
publicにしたら別のオブジェクトからアクセスされちゃうじゃん
そのメソッドは内部の状態と深い関わりがあって勝手に呼ばれると困っちゃうの
みたいなことあるじゃんテストのときだけpublicにするのはヤリマンだし
382デフォルトの名無しさん
垢版 |
2020/06/27(土) 21:03:21.73ID:kHv6hhb8
テストを別オブジェクトにするのが間違ってるのかもわからんね
データと関数をセットにしたものをオブジェクトと呼ぶように
データと関数とテストをセットにした自己メンテナンス完結型のものをアクターと呼ぶことにしようよ!
2020/06/27(土) 21:13:44.71ID:gS37C1rZ
>>380
> テストは全メソッドやるでしょ

全メソッドやるかどうかはその人次第
テストするならpublicにする
それだけの話

テストするということは、そのインターフェースは
外部から使用しても良いということを意味する
テストされてるんだから仕様が変わったりしない
2020/06/27(土) 21:14:19.20ID:gS37C1rZ
>>381
> publicにしたら別のオブジェクトからアクセスされちゃうじゃん

アクセスしても問題ないだろ?
アクセスしても問題ないようにテストしてるんだから
385デフォルトの名無しさん
垢版 |
2020/06/27(土) 21:32:11.55ID:kHv6hhb8
>>384
いやいや、公開する必要のないメソッドを公開する意味がない
呼ばれちゃいけないタイミングはある、テストしてるかどうかとは関係ない

テストしてないコードはバグってるよ
人の問題で片付けてはいけない
386デフォルトの名無しさん
垢版 |
2020/06/27(土) 21:33:25.71ID:kHv6hhb8
テストやるときって前提となる状態を作ってからやるじゃん
公開して自由にアクセスできたら前提が成り立たない状態でアクセスされちゃうじゃん
テストエアプかい?
387デフォルトの名無しさん
垢版 |
2020/06/27(土) 21:34:14.35ID:kHv6hhb8
ちなみにだけど僕は自動化テストは書いたことがない
書いたことないけど僕はテストにすごく詳しいんだ、わからないことがあったら聞いて
388デフォルトの名無しさん
垢版 |
2020/06/27(土) 21:36:38.34ID:kHv6hhb8
privateなメソッドにテストが必要ないと思ってる人がいるのが僕は不思議
むしろprivateなメソッドこそテストするべきでpublicなメソッドはただのインターフェース
389デフォルトの名無しさん
垢版 |
2020/06/27(土) 21:38:48.09ID:kHv6hhb8
privateなメソッドにロジックが書かれていてそのテストを内包してるオブジェクトのことをアクターと呼ぶことにしようか
2020/06/27(土) 21:45:24.83ID:OC6QjUii
publicにしたからと言って緩和するだけで結局状態の保持をされて意味不明な動作をするところは変わらんで
staticおじさんの言うことを聞きなさい
2020/06/27(土) 22:12:18.34ID:gS37C1rZ
>>385
> いやいや、公開する必要のないメソッドを公開する意味がない

テストするのだから公開する必要があるだろ
なにいってんだおめぇ
392デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:15:42.36ID:kHv6hhb8
>>391
お前が何いってんだハゲ
privateだとテストできないのが困るのよねえと言ってんだろうが
393デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:16:57.07ID:kHv6hhb8
テストエアプか?
テストのためだけにpublicにするなんてありえない
2020/06/27(土) 22:18:03.01ID:pxtmQ7+k
>>393
じゃあ、どうすんだよ
って聞いてみたい
2020/06/27(土) 22:19:08.38ID:UrcM2fcl
外部からアクセスするテストをしなくて済むのがprivateだと思います^^
396デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:19:09.22ID:kHv6hhb8
>>394
同じオブジェクトにテスト書けば良いと僕は思います
データ、メソッド、テストを備えたオブジェクトを特別にアクターと呼ぶことにしましょうという
のが僕の提案です
2020/06/27(土) 22:20:26.71ID:gS37C1rZ
>>388
テストをするということは、それはインターフェースとして仕様がきっちりしていて
長い期間にわたって変更しない(されにくい)ということなんだよ

インターフェースが適当だったり変わりやすいものは
変わるたびにテストも変えなくてはいけなくなる
つまりテストのメンテナンスのコストが増えてしまう

インターフェースが適当だったり変わりやすいものを作るなという話じゃない
そういうのは作ってもいいがprivateにして、他のpublicメソッドを通して間接的にテストする

privateはテストしなくていいとかテストできないとかじゃなくて
インターフェースが(まだ)明確に決きめずに後回しにできるというメリットが有る

一方テスト可能な段階になったなら、それはインターフェースの仕様が明確に定義されているということ
(明確に定義されてないものをテストなんかできない)
明確に定義されたのならpublicにしていいわけ
2020/06/27(土) 22:20:30.54ID:nVWlQ22s
ジャップにオブジェクト指向は100年早いみたいだな
脳死で全てにpublic staticって書いとけ
399デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:20:37.43ID:kHv6hhb8
>>395
あら、あーたはprivateなメソッドのテストはなさらないの?
それで平気なの?
2020/06/27(土) 22:22:06.34ID:gS37C1rZ
>>393
テストというのはオブジェクトを使用するときの例でもあるんだから
テストがやってることは、テスト以外でもやって良いんだよ
テストでしか呼び出してないからって、privateにする必要はない
401デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:22:39.57ID:kHv6hhb8
>>397
そんなの関係なくメソッド書いたらテストもするでしょ
テストされてないコードはすべてバグだよ

public通してテストするのは粒度が大きすぎる
2020/06/27(土) 22:23:50.09ID:gS37C1rZ
>>401
だからprivateをテストするということは、
そのメソッドは仕様が明確に決まったということなので
publicにしていいんだよ
2020/06/27(土) 22:23:52.28ID:gUUFl8tS
>>400
じゃあ、全部テストするときは全部publicだね
404デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:24:28.59ID:kHv6hhb8
>>400
テストするときは前提の状態を用意してからやるもので
テストは実装が正しいか確認するためにやる

publicにして他のオブジェクトから自由に呼び出して良いですというものとはわけが違う
テストで呼んだから別のところでも呼んでいんだなんて道理は存在しない
テストエアプか?
405デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:25:10.97ID:kHv6hhb8
>>402
言い訳がない、privateにするのはよそからアクセスさせないため
テストするためにpublicにしていいわけがない、オブジェクト指向エアプか?
2020/06/27(土) 22:25:22.83ID:gS37C1rZ
>>403
仕様が明確に決まってないようなものは
privateにしてテストをサボることができる
サボると言ってもpublicメソッド経由でテストするわけだが
あくまでメソッド単体でのテストをサボるだけ
2020/06/27(土) 22:25:38.25ID:zbAPoACG
>>404
だからどうすんだよ
2020/06/27(土) 22:26:14.09ID:gS37C1rZ
>>405
> privateにするのはよそからアクセスさせないため
テスト(よそ)からアクセスするのでpublicです
409デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:27:02.78ID:kHv6hhb8
>>407
そこで、僕に名案があります
テストを同じオブジェクトの中に用意するんです
そうしてデータ、メソッド、テスト、この3つを備えたオブジェクトをアクターと呼ぶことにしましょう
プログラミングパラダイムはアクターが主流の時代に突入します
410デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:28:17.85ID:kHv6hhb8
>>408
テストのためにpublicにしたらオブジェクトが壊れるため
テストのためにpublicにするのはオブジェクト指向的にありえない
オブジェクト指向エアプか?
2020/06/27(土) 22:28:55.27ID:gS37C1rZ
>>410
> テストのためにpublicにしたらオブジェクトが壊れるため

壊れないよ。
412デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:30:05.59ID:kHv6hhb8
テストという概念がオブジェクト指向の中にないからこのようなジレンマに陥るのです
そこで、オブジェクトの中にテストを入れてしまおうというのが僕が提唱する新時代の
プログラミングパラダイム、アクター指向です
413デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:30:26.61ID:kHv6hhb8
>>411
壊れるに決まってるだろ、いい加減なこと言うなハゲ
414デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:30:40.41ID:kHv6hhb8
privateなめんなよ
2020/06/27(土) 22:30:57.83ID:gS37C1rZ
>>413
なんだよw根拠言えないのかよw
416デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:31:24.07ID:kHv6hhb8
>>415
お前が根拠言えよ
417デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:31:41.00ID:kHv6hhb8
壊れないことを証明してみせろ
2020/06/27(土) 22:32:50.72ID:gS37C1rZ
壊れる要因がないので壊れない
419デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:33:18.25ID:kHv6hhb8
早くしろよおら、全部publicにしてプログラム書いてみろよ、ぶち、壊してやるから
420デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:36:21.73ID:kHv6hhb8
アクセス修飾子はテストのために変えるものじゃない
そこに現行のオブジェクト指向の限界がある
そこでオブジェクト内にテストまで用意しましょうというのが新時代のアクター指向
2020/06/27(土) 22:37:15.69ID:paNjyoZf
現状のオブジェクト指向言語がウンコってことでいいよね
2020/06/27(土) 22:38:06.59ID:gS37C1rZ
> アクセス修飾子はテストのために変えるものじゃない
当たり前だろうw

テストというのは外部からインターフェースの仕様が明確に決まってるからこそできること
外部からのインターフェースの仕様が明確に決まったなら
それはpublicにしてよい
423デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:38:47.14ID:kHv6hhb8
>>422
そんなの当たり前だろ
2020/06/27(土) 22:39:05.28ID:gS37C1rZ
だから当たり前の話をしてる
425デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:40:35.80ID:kHv6hhb8
>>421
はい、そう言わざる得ないのが現状です
言語が悪いんじゃないプログラミングパラダイムにまだ進化の余地があると
前向きに捉えるのが良いと僕は思います
アクター指向言語がこれから出てくることを祈ります
426デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:40:49.92ID:kHv6hhb8
>>424
だから当たり前だろ
427デフォルトの名無しさん
垢版 |
2020/06/27(土) 22:41:07.23ID:kHv6hhb8
あ・た・り・ま・え
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況