■危険性
かつて偏差値の低い学校向けの情報処理系教科書において「カプセル化は大変すばらしいものであり絶対に使うように」と大体的に宣伝された。
一方、カリフォルニア大学バークレー校の有識者を中心とした「インターネットを作った人たち」は「階層化の有害性(RFC 3439)」として「カプセル化は絶対にやめろ」としている。
大雑把にいうと、教科書の上では素晴らしく、開発を始めた最初のうちは良いが、将来的な改修の際に隠蔽されたデータにアクセスできないと解決できない問題が出てきて、非常に高確率でデスマーチに陥るというのである。
オブジェクト指向の発案者であるアラン・ケイもコーディング規約(頭文字にアンダースコアを付けるなどの命名規則)で縛る程度にすることを推奨しており、アラン・ケイが関わったオブジェクト指向プログラミング言語にはどれも「private」などという概念はない。
ソースコードが存在し改修が可能であればカプセル化しても問題ない。ソースコードがあってもライセンス的に改修できない場合や、そもそもバイナリのライブラリしかない場合などは絶望的である。
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/07/29(水) 17:17:58.13ID:u638n5uE102デフォルトの名無しさん
2020/08/08(土) 04:14:12.26ID:2Yg/dKbJ >>101はチンコ動画でした
103デフォルトの名無しさん
2020/08/08(土) 16:34:38.41ID:DwZ6ejE/ staticおじさんを全面肯定するわけではないが擁護するわ
インスタンスを生成するタイプのクラスは
本当はかなり作るのが難しくて
高度な設計技術と計画性を要すると思う
そういう意味ではstaticおじさんは自分の力量を弁えていて
賢明だと思う
インスタンスを作るタイプのクラスをそうそう
乱発製造すべきではないと思う
インスタンスを生成するタイプのクラスは
本当はかなり作るのが難しくて
高度な設計技術と計画性を要すると思う
そういう意味ではstaticおじさんは自分の力量を弁えていて
賢明だと思う
インスタンスを作るタイプのクラスをそうそう
乱発製造すべきではないと思う
104デフォルトの名無しさん
2020/08/08(土) 18:24:14.86ID:mdJspHbv105デフォルトの名無しさん
2020/08/08(土) 21:02:47.33ID:bKK8FlY/ オブジェクト指向の考え
オブジェクト内に状態(フィールド)を持ったり
オブジェクト内の状態を内部で操作するような
処理は外部から勝手に操作されると
不具合の元だから隠蔽しないといけない
(でも操作したくなることもあるから
ゲッターやセッターを作る)
しかし、オブジェクト指向の一番の問題点は
隠蔽さえすれば、状態をもつたり、
内部状態を操作する行為自体は許容してるという点。
staticおじさんや純粋関数型プログラミングの考え方
そもそもオブジェクト内に状態を持つこと、
内部状態を操作すること自体がシステムがめんどくさくなったり
不具合の原因なんだから、そんなこと自体極力やめた
方がいい。という考え方。
クラスにやたらめったらフィールドを定義するから
それらの管理が大変になるんでしょ?
じゃあそもそも不必要にフィールドをたくさん定義するのは
やめようってこと。
オブジェクト内に状態(フィールド)を持ったり
オブジェクト内の状態を内部で操作するような
処理は外部から勝手に操作されると
不具合の元だから隠蔽しないといけない
(でも操作したくなることもあるから
ゲッターやセッターを作る)
しかし、オブジェクト指向の一番の問題点は
隠蔽さえすれば、状態をもつたり、
内部状態を操作する行為自体は許容してるという点。
staticおじさんや純粋関数型プログラミングの考え方
そもそもオブジェクト内に状態を持つこと、
内部状態を操作すること自体がシステムがめんどくさくなったり
不具合の原因なんだから、そんなこと自体極力やめた
方がいい。という考え方。
クラスにやたらめったらフィールドを定義するから
それらの管理が大変になるんでしょ?
じゃあそもそも不必要にフィールドをたくさん定義するのは
やめようってこと。
106デフォルトの名無しさん
2020/08/08(土) 22:44:55.21ID:OT1M6D83 1クラス1フィールドの原則な。
107デフォルトの名無しさん
2020/08/08(土) 23:32:20.53ID:v8N9JR44 そのフィールドがhashmapのhashmap
108デフォルトの名無しさん
2020/08/09(日) 02:13:07.67ID:m2kgymdR >>105
結局グローバル変数の弊害と変わらないってわけだ
イベント駆動プログラムにはオブジェクト指向が向くとされてるから
現在主流の言語はほぼオブジェクト指向になってしまった
オブジェクト指向を避けてイベント駆動を実現できればなあ…
結局グローバル変数の弊害と変わらないってわけだ
イベント駆動プログラムにはオブジェクト指向が向くとされてるから
現在主流の言語はほぼオブジェクト指向になってしまった
オブジェクト指向を避けてイベント駆動を実現できればなあ…
109デフォルトの名無しさん
2020/08/09(日) 08:47:05.41ID:B3aIWQ09110デフォルトの名無しさん
2020/08/09(日) 08:53:36.03ID:gwNRWHAq staticなら何の問題も起きないのにバカがメンバに持つ
111デフォルトの名無しさん
2020/08/09(日) 08:54:09.82ID:gwNRWHAq あ、メソッドをpublic staticね
112デフォルトの名無しさん
2020/08/09(日) 09:00:00.94ID:a7MhRm2l カプセル化が不十分というだけ。
XNA は使い方を間違えている。
XNA は使い方を間違えている。
113デフォルトの名無しさん
2020/08/09(日) 09:20:34.38ID:+PyqObml そもそも処理を仕方がない理由もなく
入力→処理→出力
で入力と出力でチェックできない形にしてしまうのは悪手
入力→処理→出力
で入力と出力でチェックできない形にしてしまうのは悪手
114デフォルトの名無しさん
2020/08/09(日) 11:42:28.37ID:e3BzhtQg115デフォルトの名無しさん
2020/08/10(月) 02:59:21.35ID:l5zwQhnu アンサイクロペディアでやれ
116デフォルトの名無しさん
2020/08/11(火) 00:29:12.66ID:jdRsH5YI そもそもJavaScriptや
python使ってると
「あれ?クラスって必要なくね?」
って思うことが多いよ
(クラスというかフィールドやコンストラクタや
インスタンス化の必要性)
複数種のデータをセットで持ちたいなら
連想配列や辞書で持てばいい話で
クラス型なんて無名で言いじゃん。
JSONやローカルストレージやDBなど
格納方法には色々選択肢があるわけで
連想配列を引数に与えてやりとりすればいい
もちろんJavaだとMapのキーと値にも
型の宣言が必要で不便だから
JavaScriptやPyを使ったほうがいいね
python使ってると
「あれ?クラスって必要なくね?」
って思うことが多いよ
(クラスというかフィールドやコンストラクタや
インスタンス化の必要性)
複数種のデータをセットで持ちたいなら
連想配列や辞書で持てばいい話で
クラス型なんて無名で言いじゃん。
JSONやローカルストレージやDBなど
格納方法には色々選択肢があるわけで
連想配列を引数に与えてやりとりすればいい
もちろんJavaだとMapのキーと値にも
型の宣言が必要で不便だから
JavaScriptやPyを使ったほうがいいね
117デフォルトの名無しさん
2020/08/11(火) 02:32:11.74ID:Yoj/uuKw Hooks API来てから皆Function Component。誰もClass Componentつかわなくなった@React
118デフォルトの名無しさん
2020/08/11(火) 10:11:56.23ID:PBDRLAp9 privateとかpublicじゃなくて775とかパーミッション設定したい。
119デフォルトの名無しさん
2020/08/11(火) 10:25:23.64ID:DyHWpKfR Java.classファイルのパーミッション?
120デフォルトの名無しさん
2020/08/11(火) 12:40:18.13ID:VjXaeZPI >>114
もともとの議論知らんのならだまってりゃいいのに。
あきらかに元ネタはstatic変数を使ってシングルトンやることをマンセーしとるわ。
クラス使えばいいってもんじゃないが、結合時のバグを気にしすぎてテストしずらい構造つくってるってのが
この手の問題なわけよ。
もともとの議論知らんのならだまってりゃいいのに。
あきらかに元ネタはstatic変数を使ってシングルトンやることをマンセーしとるわ。
クラス使えばいいってもんじゃないが、結合時のバグを気にしすぎてテストしずらい構造つくってるってのが
この手の問題なわけよ。
121デフォルトの名無しさん
2020/08/11(火) 13:45:14.16ID:zGJr4AFR staticおじさんの逆襲
https://qiita.com/minebreaker/items/45ffaaa5e8729e16cfb4
https://qiita.com/minebreaker/items/45ffaaa5e8729e16cfb4
122デフォルトの名無しさん
2020/08/11(火) 13:45:31.32ID:zGJr4AFR お前ら論破されてんじゃん
123デフォルトの名無しさん
2020/08/11(火) 17:56:32.40ID:K2Zt4r5r 別に論破はされてないなぁ
要するにデータをどう持つかの話で
データが必要なものはオブジェクトに持たせたほうがいいし
データが必要ない(引数程度)ならstaticにすると言うだけの話
この「引数」はシンプルな値型に限る。
いやだってstaticにするために引数にしてデータを持たないオブジェクトにしたのに
データを持つオブジェクトを渡すとか本末転倒やろ?w
ようはデータが有るかどうかって話で、ないならstaticでいいけど
あるなら普通にオブジェクトにしましょうってだけ
データが有るのに頑張ってstaticにするとか無駄
要するにデータをどう持つかの話で
データが必要なものはオブジェクトに持たせたほうがいいし
データが必要ない(引数程度)ならstaticにすると言うだけの話
この「引数」はシンプルな値型に限る。
いやだってstaticにするために引数にしてデータを持たないオブジェクトにしたのに
データを持つオブジェクトを渡すとか本末転倒やろ?w
ようはデータが有るかどうかって話で、ないならstaticでいいけど
あるなら普通にオブジェクトにしましょうってだけ
データが有るのに頑張ってstaticにするとか無駄
124デフォルトの名無しさん
2020/08/11(火) 21:32:59.34ID:nKBbqh2w ケースバイケース、適材適所で設計すれば良いというだけの話なのにね。
教条主義、原理主義の奴らは必ず◯◯すべし!◯◯すべからず!と声高に叫んでるだけでまともな議論にはならないし、スルーするのが一番かと思われる。
教条主義、原理主義の奴らは必ず◯◯すべし!◯◯すべからず!と声高に叫んでるだけでまともな議論にはならないし、スルーするのが一番かと思われる。
125デフォルトの名無しさん
2020/08/12(水) 11:17:16.33ID:lWgXenAf126デフォルトの名無しさん
2020/08/12(水) 11:39:55.90ID:IJKCUlyt >>125
staticおじさんはjavaのstaticな
staticおじさんはjavaのstaticな
127デフォルトの名無しさん
2020/08/15(土) 22:05:11.13ID:HPBTZIIs スタティックでマルチスレッドはキツイぞ
128デフォルトの名無しさん
2020/08/15(土) 22:52:56.43ID:pyil6gDT マルチスレッドと関係ねえw
129デフォルトの名無しさん
2020/08/15(土) 23:11:43.21ID:67hbQA2K バカっていっつも関係ないこと紐付けるよな
130デフォルトの名無しさん
2020/08/15(土) 23:14:58.03ID:Ob8esEzA バカって関係あることを紐付けるバカも居るだろ
131デフォルトの名無しさん
2020/08/17(月) 08:38:19.59ID:+Ou9g0gb 義経「馬も鹿も四脚」
132デフォルトの名無しさん
2020/08/17(月) 20:03:48.21ID:aKA3oP69 >>119
chmodとかで設定するパーミッションな。
↓こんなイメージ。
664: // 基底クラスと派生クラスが読み書き可能。その他はよむことだけOK。
int a;
640: // 基底クラス読み書き可能。派生クラス読み込み可能。その他はアクセス不能。
int b;
chmodとかで設定するパーミッションな。
↓こんなイメージ。
664: // 基底クラスと派生クラスが読み書き可能。その他はよむことだけOK。
int a;
640: // 基底クラス読み書き可能。派生クラス読み込み可能。その他はアクセス不能。
int b;
133デフォルトの名無しさん
2020/08/18(火) 16:33:07.58ID:b4wiyhNa134デフォルトの名無しさん
2020/08/18(火) 22:19:04.69ID:ZCkQ8Dn9 そもそもフィールドで持つ必要がある
データってこのブログで紹介されてるような
キャラHP,MPや貯水量、現金残高
みたいな上下限をもった数値の増減みたいな
ものだけだと思う。
境界値バグに関係しうるパラメータね。
こればっかりはstaticおじさんはやりにくいと思うわ。
カプセル化とはなにか?超わかりやすく解説します!
https://jpazamu.com/encapsulation/
あと考えられるのは 装備品みたいな
魔法使いジョブには剣を装備させてはいけないなど
特有の細かなルールがあるときはカプセル化が必要か。
それ以外の人名とかIDとかメモリ内で変動しないような値を
わざわざフィールドを用意する必要もなければ
privateで保護する必要もないしstaticおじさんで
なんの問題もないよね。
基本的に「演算」がないデータだから
連想配列やJSONでまとめてやり取りすればいいと思う。
あとバグを引き起こすのは値の変更で
あって参照って無害なのでは?
データってこのブログで紹介されてるような
キャラHP,MPや貯水量、現金残高
みたいな上下限をもった数値の増減みたいな
ものだけだと思う。
境界値バグに関係しうるパラメータね。
こればっかりはstaticおじさんはやりにくいと思うわ。
カプセル化とはなにか?超わかりやすく解説します!
https://jpazamu.com/encapsulation/
あと考えられるのは 装備品みたいな
魔法使いジョブには剣を装備させてはいけないなど
特有の細かなルールがあるときはカプセル化が必要か。
それ以外の人名とかIDとかメモリ内で変動しないような値を
わざわざフィールドを用意する必要もなければ
privateで保護する必要もないしstaticおじさんで
なんの問題もないよね。
基本的に「演算」がないデータだから
連想配列やJSONでまとめてやり取りすればいいと思う。
あとバグを引き起こすのは値の変更で
あって参照って無害なのでは?
135デフォルトの名無しさん
2020/08/18(火) 22:22:09.47ID:wUa7ucBR バカじゃね
最近のソシャゲなんて全部DBのテーブルに入れなきゃいけないのにクラスの階層構造なんてテーブルに格納するときやりにくくて死ぬだろ
最近のソシャゲなんて全部DBのテーブルに入れなきゃいけないのにクラスの階層構造なんてテーブルに格納するときやりにくくて死ぬだろ
136デフォルトの名無しさん
2020/08/18(火) 22:30:21.66ID:lDffCv4W137デフォルトの名無しさん
2020/08/19(水) 01:42:01.09ID:hBlUyArs その界隈はスケールアウト重視でRDBよりさらにフラットなのが主流だからな。
それこそ学校で教えるデータベース正規化の真逆、「逆正規化こそ正義」という世界だし。
「正規化は愚かな考え」というスレを立てようぜ
それこそ学校で教えるデータベース正規化の真逆、「逆正規化こそ正義」という世界だし。
「正規化は愚かな考え」というスレを立てようぜ
138デフォルトの名無しさん
2020/08/19(水) 07:15:17.32ID:OrygHj4v 最近気が付いたんだけど。
STLならどうなるか?と考えるのも、一つの分析手法だな。
STLならどうなるか?と考えるのも、一つの分析手法だな。
139デフォルトの名無しさん
2020/08/19(水) 20:19:37.01ID:1TMyVKY8 カプセル化が悪いんじゃなくて設計ミスってるだけじゃん
経験積んで未来予知の精度上げるしかないかな
経験積んで未来予知の精度上げるしかないかな
140デフォルトの名無しさん
2020/08/19(水) 20:29:39.11ID:1TMyVKY8 あとgetter、setterてカプセル化の思想とは関係なく、
便宜上の何かしらの理由(フレームワーク都合、トレースしやすい)で
慣用的に使われてるイメージある
便宜上の何かしらの理由(フレームワーク都合、トレースしやすい)で
慣用的に使われてるイメージある
141デフォルトの名無しさん
2020/08/19(水) 20:58:57.98ID:bIJ+SeFj その未来予知や
設計ミスで後悔する要素とか
フレームワーク依存要素を排除したいから
純粋関数型で余計な状態を持たずに
機械的にプログラミングする方が
いいと言ってるじゃないか。
設計ミスで後悔する要素とか
フレームワーク依存要素を排除したいから
純粋関数型で余計な状態を持たずに
機械的にプログラミングする方が
いいと言ってるじゃないか。
142デフォルトの名無しさん
2020/08/19(水) 21:05:37.71ID:1TMyVKY8 え、純粋関数型しばり?w
143デフォルトの名無しさん
2020/08/19(水) 21:09:50.93ID:AMkDCrIJ > 純粋関数型で余計な状態を持たずに
> 機械的にプログラミングする方が
> いいと言ってるじゃないか。
↑間違い
状態を持たないものは
純粋関数型で簡単に作れるが
世の中には状態を持っているものがたくさんある
純粋関数型は状態を持たないものは簡単に作れるが
状態を持つものは簡単に作れない
状態を排除することは不可能なので
結局状態を持つものを管理しやすい
オブジェクト指向を併用することになる
> 機械的にプログラミングする方が
> いいと言ってるじゃないか。
↑間違い
状態を持たないものは
純粋関数型で簡単に作れるが
世の中には状態を持っているものがたくさんある
純粋関数型は状態を持たないものは簡単に作れるが
状態を持つものは簡単に作れない
状態を排除することは不可能なので
結局状態を持つものを管理しやすい
オブジェクト指向を併用することになる
144デフォルトの名無しさん
2020/08/19(水) 21:11:56.89ID:1TMyVKY8 純粋関数型のプログラム書いたことないけど
例えばカウンタ(内部に整数型データ保持)とかどういう実装になるんだろ?
って調べたら↓が見つかった
https://riptutorial.com/ja/haskell/example/25413/%E3%83%A2%E3%83%8A%E3%83%87%E3%82%A3%E3%83%83%E3%82%AF%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF%E3%83%BC
結構面倒だな
例えばカウンタ(内部に整数型データ保持)とかどういう実装になるんだろ?
って調べたら↓が見つかった
https://riptutorial.com/ja/haskell/example/25413/%E3%83%A2%E3%83%8A%E3%83%87%E3%82%A3%E3%83%83%E3%82%AF%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF%E3%83%BC
結構面倒だな
145デフォルトの名無しさん
2020/08/19(水) 21:13:46.83ID:1TMyVKY8 状態を多用する場面で純粋関数型は向かないってことかな?
146デフォルトの名無しさん
2020/08/19(水) 21:14:49.28ID:AMkDCrIJ 純粋関数型言語を使えば状態を持たなくて良くなるわけじゃないんだよ
状態があるのとないのであれば、状態がない場合は
テストも簡単でシンプルに作れることが出来るだろう
しかし実際のシステムは状態があるんだよ
状態がないもの(つまり簡単なもの)を簡単に作れることを目指しても有り難みがない
状態があるもの(複雑なもの)を簡単に作れるもののほうがありがたい
状態があるのとないのであれば、状態がない場合は
テストも簡単でシンプルに作れることが出来るだろう
しかし実際のシステムは状態があるんだよ
状態がないもの(つまり簡単なもの)を簡単に作れることを目指しても有り難みがない
状態があるもの(複雑なもの)を簡単に作れるもののほうがありがたい
147デフォルトの名無しさん
2020/08/19(水) 21:28:46.66ID:1TMyVKY8 関数型言語のエッセンス(イミュータビリティ)を部分的に取り入れると
いい感じだけど全部置き換えたら破綻するね
いい感じだけど全部置き換えたら破綻するね
148デフォルトの名無しさん
2020/08/19(水) 21:37:00.69ID:bIJ+SeFj 状態を持つ必要が有るとしても
極力少なめに厳選すべき
データベースのカラムは
全部オブジェクトのフィールドとして保持して
コンストラクタ経由で引数をフィールドに移し替えて
全部ゲッターセッター用意して
見ればわかるメソッドに全部Javadoc記述して
とかどう考えても馬鹿でしょ
personオブジェクトの
人名、年齢、身長、体重
とかがプログラムが動いてる短い期間に目まぐるしく
変動するんですか?
オブジェクト指向の教科書見るとそうやって教えてるんだぜ?
極力少なめに厳選すべき
データベースのカラムは
全部オブジェクトのフィールドとして保持して
コンストラクタ経由で引数をフィールドに移し替えて
全部ゲッターセッター用意して
見ればわかるメソッドに全部Javadoc記述して
とかどう考えても馬鹿でしょ
personオブジェクトの
人名、年齢、身長、体重
とかがプログラムが動いてる短い期間に目まぐるしく
変動するんですか?
オブジェクト指向の教科書見るとそうやって教えてるんだぜ?
149デフォルトの名無しさん
2020/08/19(水) 21:39:15.87ID:meyBYzW3 >>147
別に破綻しないよ
状態が必要なら、状態ごと受け取って状態を含めた出力をするような関数を作る
データとそれを使う関数を1つの単位(クラス)にまとめたほうがいいのか
それともデータはデータ、関数は関数で分けて管理したほうがいいのかという違い
(関数型でも必要ならある種のデータ型とそれに密接に関係する関数群をモジュールとしてまとめる)
どちらかが常にいいというわけじゃなくトレードオフだから
それを理解してドメインに応じて使い分ければいい
別に破綻しないよ
状態が必要なら、状態ごと受け取って状態を含めた出力をするような関数を作る
データとそれを使う関数を1つの単位(クラス)にまとめたほうがいいのか
それともデータはデータ、関数は関数で分けて管理したほうがいいのかという違い
(関数型でも必要ならある種のデータ型とそれに密接に関係する関数群をモジュールとしてまとめる)
どちらかが常にいいというわけじゃなくトレードオフだから
それを理解してドメインに応じて使い分ければいい
150デフォルトの名無しさん
2020/08/19(水) 21:42:50.48ID:AMkDCrIJ > 状態が必要なら、状態ごと受け取って状態を含めた出力をするような関数を作る
んで、その最終形態が
メモリの内容を全部渡して、書き換え済みのメモリを返す
それを永続化する。
つまりはグローバル変数と同じ状態になるわけだ
んで、その最終形態が
メモリの内容を全部渡して、書き換え済みのメモリを返す
それを永続化する。
つまりはグローバル変数と同じ状態になるわけだ
151デフォルトの名無しさん
2020/08/19(水) 21:44:22.03ID:AMkDCrIJ 結局書き方の違いでしか無いんだよね
状態 = 関数(状態)にするか
状態.関数() にするかという書き方が違うだけ
状態 = 関数(状態)にするか
状態.関数() にするかという書き方が違うだけ
152デフォルトの名無しさん
2020/08/19(水) 21:47:30.11ID:AMkDCrIJ そして行き着く先は
状態 = 関数(状態)の形で
大規模なものを人間が統治管理できるのか?って話
人間がってのが重要な所
理論的には出来る。コンピュータにも出来る。
だが人間がそれをやれなきゃ意味がない
簡単な足し算でも、それが何万個もあれば人間はミスをする
状態 = 関数(状態)の形で
大規模なものを人間が統治管理できるのか?って話
人間がってのが重要な所
理論的には出来る。コンピュータにも出来る。
だが人間がそれをやれなきゃ意味がない
簡単な足し算でも、それが何万個もあれば人間はミスをする
153デフォルトの名無しさん
2020/08/19(水) 21:49:27.84ID:meyBYzW3154デフォルトの名無しさん
2020/08/19(水) 21:55:27.63ID:1TMyVKY8 結局外から整数渡すのか
155デフォルトの名無しさん
2020/08/19(水) 22:08:23.64ID:1TMyVKY8156デフォルトの名無しさん
2020/08/19(水) 22:33:08.34ID:yE6ycl6R 昔のC言語は状態なんか持たなくても動いてたよw
前提が間違ってるじゃん
前提が間違ってるじゃん
157デフォルトの名無しさん
2020/08/19(水) 22:34:39.94ID:1TMyVKY8 >ソースコードが存在し改修が可能であればカプセル化しても問題ない。
>ソースコードがあってもライセンス的に改修できない場合や、そもそもバイナリのライブラリしかない場合などは絶望的である。
ライブラリが担うべき要件でもないし他の探すか自分で作るか改修依頼するかしかないでしょ
なんでカプセル化が悪の権化みたいなことになってんのw
>ソースコードがあってもライセンス的に改修できない場合や、そもそもバイナリのライブラリしかない場合などは絶望的である。
ライブラリが担うべき要件でもないし他の探すか自分で作るか改修依頼するかしかないでしょ
なんでカプセル化が悪の権化みたいなことになってんのw
158デフォルトの名無しさん
2020/08/19(水) 22:35:36.18ID:OrygHj4v 純粋でなければ、利点として宣伝されるものの多くが実現されなくなるからな。
もっとも、純粋であっても、現時点では実現されていないのだが。
もっとも、純粋であっても、現時点では実現されていないのだが。
159デフォルトの名無しさん
2020/08/19(水) 22:36:45.75ID:1TMyVKY8 C言語とかバリバリ状態変数使ってるでしょ
160デフォルトの名無しさん
2020/08/19(水) 22:39:11.93ID:1TMyVKY8 その状態の管理方法がオブジェクト指向でも純粋関数型でもないだけで
161デフォルトの名無しさん
2020/08/19(水) 22:56:55.74ID:c5gUks+P >>140
getter/setterはJavaBeansの仕様だからね
JavaBeansはGUIツールでポトペタで操作できるようにするためのもの
GUIのツールでプロパティ書き換えたりイベントリスナー書いたりするのが目的
だからJavaBeansの情報を取得するBeanInfoにはgetIconメソッドがあったりする
JavaBeansではプロパティに値をセットしたら値が変更されましたイベントを発火したりするから
getter/setter経由でアクセスすることは理に適っていた
それがいつの間にかオブジェクト指向のプログラムではgetter/setterを書くんだーになってしまった
JavaBeansのようなコンポネントの作法はライブラリ内部で使われるようなオブジェクトには必要ない
デスクトップアプリの開発が衰退したおかげかいまはだいぶその認識が広まってる
getter/setterはJavaBeansの仕様だからね
JavaBeansはGUIツールでポトペタで操作できるようにするためのもの
GUIのツールでプロパティ書き換えたりイベントリスナー書いたりするのが目的
だからJavaBeansの情報を取得するBeanInfoにはgetIconメソッドがあったりする
JavaBeansではプロパティに値をセットしたら値が変更されましたイベントを発火したりするから
getter/setter経由でアクセスすることは理に適っていた
それがいつの間にかオブジェクト指向のプログラムではgetter/setterを書くんだーになってしまった
JavaBeansのようなコンポネントの作法はライブラリ内部で使われるようなオブジェクトには必要ない
デスクトップアプリの開発が衰退したおかげかいまはだいぶその認識が広まってる
162デフォルトの名無しさん
2020/08/19(水) 23:05:18.29ID:EjRsdu11 単にそのクラスに必要な操作のみ公開するという思想は良いと思うが
頭の硬いやつがいると理解出来ないからか文句を言ってくる
頭の硬いやつがいると理解出来ないからか文句を言ってくる
163デフォルトの名無しさん
2020/08/19(水) 23:25:59.69ID:yE6ycl6R >>162
結局入力と出力を
メンバ変数に入力や出力を内包されると単純に動作が把握し難いだけで
全くメリットがない
内包されたデータを見ないで修正してもいいのか?
お前の会社はそれでいいとは言わないだろう
だとしたら入力や出力を隠蔽するのは誰にとっても迷惑にしかならない
結局入力と出力を
メンバ変数に入力や出力を内包されると単純に動作が把握し難いだけで
全くメリットがない
内包されたデータを見ないで修正してもいいのか?
お前の会社はそれでいいとは言わないだろう
だとしたら入力や出力を隠蔽するのは誰にとっても迷惑にしかならない
164デフォルトの名無しさん
2020/08/19(水) 23:41:19.27ID:1TMyVKY8 そのクラスの責務(入力に対する出力の仕様)がわかっていれば
具体的な内部の動きを把握する必要がそもそもない
把握する必要ないから楽
具体的な内部の動きを把握する必要がそもそもない
把握する必要ないから楽
165デフォルトの名無しさん
2020/08/19(水) 23:48:14.52ID:AMkDCrIJ >>163
システムの規模が大きくなった時
どう管理するかって話だからその理屈は全く関係ないんだよな
内包されたデータを見ないで修正してもいいか?
オブジェクト指向であれば、それがある単位で分割されているから
そこだけを見ればいい
システムの規模が大きくなった時
どう管理するかって話だからその理屈は全く関係ないんだよな
内包されたデータを見ないで修正してもいいか?
オブジェクト指向であれば、それがある単位で分割されているから
そこだけを見ればいい
166デフォルトの名無しさん
2020/08/20(木) 00:39:03.89ID:Ha0cLvqC167デフォルトの名無しさん
2020/08/20(木) 00:40:27.24ID:Ha0cLvqC >>165
お前が作ったクラスの動作がおかしいときどうすればいいの?
お前が作ったクラスの動作がおかしいときどうすればいいの?
168デフォルトの名無しさん
2020/08/20(木) 00:43:54.72ID:x6SYzBHh >>167
テストコード書いて直すだけ
テストコード書いて直すだけ
169デフォルトの名無しさん
2020/08/20(木) 00:44:38.43ID:x6SYzBHh170デフォルトの名無しさん
2020/08/20(木) 00:50:30.84ID:ecAQ66Lj 適切な単位で分割されてると修正も楽
それこそ「そのクラスの責務(入力に対する出力の仕様)」だけ
満たすことを考えればいい
それこそ「そのクラスの責務(入力に対する出力の仕様)」だけ
満たすことを考えればいい
171デフォルトの名無しさん
2020/08/20(木) 00:53:30.10ID:ecAQ66Lj 内部で関係する変数とかを閉じててくれないと
そのクラスに値を設定する部分を見て回らないといけなくなる
そのクラスに値を設定する部分を見て回らないといけなくなる
172デフォルトの名無しさん
2020/08/20(木) 00:58:14.66ID:nfJPehze クラスに値を設定する部分は、そのクラスを見るだけでいい
引数として独立していると、その引数を使ってる部分を全部調べなければいけなくなる
戻り値が変わると、その戻り値を使ってる部分全てだ
引数として独立していると、その引数を使ってる部分を全部調べなければいけなくなる
戻り値が変わると、その戻り値を使ってる部分全てだ
173デフォルトの名無しさん
2020/08/20(木) 00:59:25.71ID:Ha0cLvqC174デフォルトの名無しさん
2020/08/20(木) 01:09:23.46ID:Eg0HvHSQ 一クラス一メソッドの原則な。
175デフォルトの名無しさん
2020/08/20(木) 01:10:33.08ID:ecAQ66Lj メンバ変数statesがprivateだったらそのクラス内に閉じた問題だから
単純にそのクラスのメソッド内でstatesとnoneを比較するようなとこを
洗い出せばいいんじゃないの?
単純にそのクラスのメソッド内でstatesとnoneを比較するようなとこを
洗い出せばいいんじゃないの?
176デフォルトの名無しさん
2020/08/20(木) 01:20:32.10ID:qjxJt4Hn >>170
その責務って奴が言葉だけは聞こえがいいが
現実論として関わるプログラマや関係者の間で
認識がバラバラになる最大のポイントなんだわ。
プログラムやコンピュータを計算機として見てないんだわ。
「この処理を果たしてこの場所で書いていいものか…」
なんて余計な事で頭を悩ます最大の原因なんだわ。
それよりももっとシンプルに、
任意の場所に、受け取った引数を使って
結果を返す関数を作って関数に要求させた演算を
投げて結果だけ受け取った方が生産的だよね?
関数を連鎖的に組み合わせればどんな複雑な演算も
成し遂げることが出来る。
その責務って奴が言葉だけは聞こえがいいが
現実論として関わるプログラマや関係者の間で
認識がバラバラになる最大のポイントなんだわ。
プログラムやコンピュータを計算機として見てないんだわ。
「この処理を果たしてこの場所で書いていいものか…」
なんて余計な事で頭を悩ます最大の原因なんだわ。
それよりももっとシンプルに、
任意の場所に、受け取った引数を使って
結果を返す関数を作って関数に要求させた演算を
投げて結果だけ受け取った方が生産的だよね?
関数を連鎖的に組み合わせればどんな複雑な演算も
成し遂げることが出来る。
177デフォルトの名無しさん
2020/08/20(木) 01:27:25.42ID:ecAQ66Lj それはチーム編成とか統制の問題では
レベルが低い集団だと統制とれずク○の山が積み上がって
収集つかなくなるんだろうな
レベルが低い集団だと統制とれずク○の山が積み上がって
収集つかなくなるんだろうな
178デフォルトの名無しさん
2020/08/20(木) 01:32:57.21ID:Ha0cLvqC >>175
privateメンバ変数は見なくていいって話じゃなかったん?
privateメンバ変数は見なくていいって話じゃなかったん?
179デフォルトの名無しさん
2020/08/20(木) 01:36:01.29ID:ecAQ66Lj クラス外からは気にしなくていいけどクラスを修正するときは見なきゃだめでしょ
privateなら見るべき範囲はクラス内って絞ることができる
privateなら見るべき範囲はクラス内って絞ることができる
180デフォルトの名無しさん
2020/08/20(木) 01:44:41.21ID:Ha0cLvqC >>179
じゃあ、結局見るんじゃんバーカ
じゃあ、結局見るんじゃんバーカ
181デフォルトの名無しさん
2020/08/20(木) 01:48:58.64ID:ecAQ66Lj え
182デフォルトの名無しさん
2020/08/20(木) 01:52:46.09ID:ecAQ66Lj まあ理解できもしないのに真似事みたいなことするのが一番迷惑だから
やりたいようにやりなさい
やりたいようにやりなさい
183デフォルトの名無しさん
2020/08/20(木) 02:03:10.41ID:ecAQ66Lj そもそも>>173の質問がバカ丸出しなのに自覚ないとか
184デフォルトの名無しさん
2020/08/20(木) 07:00:11.09ID:X1nNk3cj >>161
プロパティって、どういうプロパティが存在するかを実行時にインスペクトできるというのも重要な性質だな。
BeansはJavaのリフレクションでそれを実現していたけど、単なるgette/setterではそういうのも忘れられている。
プロパティって、どういうプロパティが存在するかを実行時にインスペクトできるというのも重要な性質だな。
BeansはJavaのリフレクションでそれを実現していたけど、単なるgette/setterではそういうのも忘れられている。
185デフォルトの名無しさん
2020/08/20(木) 07:31:18.16ID:Ha0cLvqC186デフォルトの名無しさん
2020/08/20(木) 07:59:40.26ID:i/J3/2zN >>176
それって、ちゃんと考えて設計するの面倒だから全部グローバル変数でやります、生産性高いよね!といってるのと変わらないじゃないかw
それって、ちゃんと考えて設計するの面倒だから全部グローバル変数でやります、生産性高いよね!といってるのと変わらないじゃないかw
187デフォルトの名無しさん
2020/08/20(木) 08:08:01.01ID:Ha0cLvqC >>186
比較するものがグローバル変数使用のソースしか無くなった?
比較するものがグローバル変数使用のソースしか無くなった?
188デフォルトの名無しさん
2020/08/20(木) 08:33:25.88ID:ecAQ66Lj >>185
> さらにpublic staticならグローバル変数不使用なら
どうせその前提だとそれはクラス内部に状態を持つ必要ない単なるUtilityクラス
内のメソッドだろ?
状態をどうやって管理するかの話だったのに、状態を排除した前提を持ち出してきて
何を認めさせたいの?反論することだけが目的?
> さらにpublic staticならグローバル変数不使用なら
どうせその前提だとそれはクラス内部に状態を持つ必要ない単なるUtilityクラス
内のメソッドだろ?
状態をどうやって管理するかの話だったのに、状態を排除した前提を持ち出してきて
何を認めさせたいの?反論することだけが目的?
189デフォルトの名無しさん
2020/08/20(木) 08:38:25.78ID:Ha0cLvqC190デフォルトの名無しさん
2020/08/20(木) 10:46:21.05ID:ecAQ66Lj 御託はいいからお前の書いたコード見てみたいわ
グローバル変数を使わないCコードが書けるんだろ?(失笑)
C言語ならグローバル変数はある程度使うべきなんだけどね
グローバル変数を使わないCコードが書けるんだろ?(失笑)
C言語ならグローバル変数はある程度使うべきなんだけどね
191デフォルトの名無しさん
2020/08/20(木) 11:25:12.56ID:Ha0cLvqC192デフォルトの名無しさん
2020/08/20(木) 12:04:17.63ID:ecAQ66Lj 下手なりにかけるとは思うよ下手なりに
ただその方法じゃスケールしない
ここまで言ってわからないならもう相手にしてあげないよ
ただその方法じゃスケールしない
ここまで言ってわからないならもう相手にしてあげないよ
193デフォルトの名無しさん
2020/08/20(木) 12:06:02.57ID:ecAQ66Lj 小さいプログラムしか書いたことないんだろうな
194デフォルトの名無しさん
2020/08/20(木) 12:14:50.55ID:KHHtBj+5 結局大規模なものをカプセル化が有効なんだよね
195デフォルトの名無しさん
2020/08/20(木) 12:49:31.45ID:tyNv301J Information Hidingの意味でカプセル化と言ってるやつと
データとメソッドをオブジェクトという構造にひとまとめにすることをカプセル化と言ってるやつがいるから
話が噛み合ってない
前者はオブジェクト指向に関係なくあらゆるプログラミングスタイルで使われてる
規模に関係して重要になってくるのはInformation Hidingの意味でのカプセル化
CでもHaskellでもそれが重要なのは変わらない
後者はオブジェクト指向特有のもの
これはソフトウェアの規模の大小とは関係なく
どういう方向の変化に対して高い柔軟性を確保しておくのがいいかという問題なので
デメリットも考慮しつつ状況に合わせて採用するかどうか判断すべきもの
データとメソッドをオブジェクトという構造にひとまとめにすることをカプセル化と言ってるやつがいるから
話が噛み合ってない
前者はオブジェクト指向に関係なくあらゆるプログラミングスタイルで使われてる
規模に関係して重要になってくるのはInformation Hidingの意味でのカプセル化
CでもHaskellでもそれが重要なのは変わらない
後者はオブジェクト指向特有のもの
これはソフトウェアの規模の大小とは関係なく
どういう方向の変化に対して高い柔軟性を確保しておくのがいいかという問題なので
デメリットも考慮しつつ状況に合わせて採用するかどうか判断すべきもの
196デフォルトの名無しさん
2020/08/20(木) 15:12:12.70ID:ecAQ66Lj Ha0cLvqC ← こいつに関しては
・情報隠蔽
・関心事の局所化
いずれの意味も明らかに理解できていないし、日本語も通じてないから話が噛み合わない
・情報隠蔽
・関心事の局所化
いずれの意味も明らかに理解できていないし、日本語も通じてないから話が噛み合わない
197デフォルトの名無しさん
2020/08/20(木) 16:03:22.57ID:BhReT/u1 お前らのコミュニケーション能力が劣ってるだけだろ
良い大人なんだからきちんと伝わる語彙と文法、論理を示せばわかりあえる
コミュ障のお前らに俺が手本を見せてやるよ
良い大人なんだからきちんと伝わる語彙と文法、論理を示せばわかりあえる
コミュ障のお前らに俺が手本を見せてやるよ
199デフォルトの名無しさん
2020/08/20(木) 17:54:53.75ID:Ha0cLvqC >>196
でも君、メリット説明できないよね?
でも君、メリット説明できないよね?
200デフォルトの名無しさん
2020/08/20(木) 18:34:06.73ID:ecAQ66Lj お前みたいな低能に説明してる時間が無駄
201デフォルトの名無しさん
2020/08/20(木) 19:27:08.80ID:Ha0cLvqC■ このスレッドは過去ログ倉庫に格納されています
