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

■ このスレッドは過去ログ倉庫に格納されています
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/19(金) 06:36:33.75ID:wpvtDg0l
>>48
ちょっと違うな
ST80でもOWでもVWでも共通だが
privateはあくまでもプロトコルの一つという設計だから外部からアクセスできるように・・という考え方ではないよ
具体的な扱われ方としてはインスタンス専用のローカルメソッドのような使われ方をする

なおprivateプロトコルは全てではないが
他のオブジェクトからコールするとデバッガに落ちるように仕組んでたりする
(外部からは使わせないよってこと)
2020/06/19(金) 07:02:17.44ID:wpvtDg0l
>>49
データを誰が保持するのかって問題はMVCの当初から大問題にはなってたからね
単純にModelが必ず持つという形にすると指摘した問題が必ず発生するから

経緯的にPluggableMVCへと変遷しどこからでもupdateプロトコルを受け付けることができるようになった
データはMVCのどれも保持しなくなり、ひとまずの決着がついたが
この形式であっても誰がどのようにupdateをかけているのか逐一コーディングしなければならない問題が残ってた

そこで現在ではデータを保持するAspectAdaptor系は
いわゆるアクセサを書く必要もなくなり通知を受け取るだけで動作するようになっている
(updateのためにアクセサを呼ぶなどということはしない)
2020/06/19(金) 07:18:54.82ID:gQU/M+Sr
>>51
> 他のオブジェクトからコールするとデバッガに落ちるように仕組んでたりする

殆どの言語はprivateにアクセスできる
2020/06/19(金) 07:22:21.49ID:XaRstyom
OOは業務システム向き
組み込みだと細分化し過ぎるんじゃね?
2020/06/19(金) 09:36:31.93ID:wpvtDg0l
>>53
目的が違うので
private配下のメソッドは外部から呼ばれることを意図しない(ことになっている)
のとbehaviorにさえアクセスを許さなかったりする

ただこれは言語仕様としてコントロールしているわけではないので
あくまでも慣例として扱われてる
適当なクラスを作ってprivateプロトコルに適当なメソッドを組めば好きに外部から呼び出すことは出来る

そうは言っても慣例破ってるコードはすぐ見つかってしまうのでまあよろしくないことになる
2020/06/19(金) 11:11:36.05ID:t8sp3Lp3
>>11
アランケイのは、完璧なものから取り除いていくような感じだったな
2020/06/19(金) 11:46:38.71ID:gQU/M+Sr
>>55
private配下のメソッドは外部から呼ばれることを意図しない(ことになっている)
頭文字にアンダースコアを付けるなどの命名規則で縛る程度のも、外部から呼ばれることを意図しない(ことになっている)
2020/06/19(金) 11:54:17.24ID:I4TvFtlH
>>54
業務システムだとDBいじくるだけだから深い階層構造に関わることはまずないだろ。
DBというグローバル変数をクラスという名の構造体にコピーして、編集して、書き戻すという単純作業の繰り返し。
2020/06/19(金) 12:44:14.84ID:dtaC8DdL
隠蔽って言うからおかしくなる
privateは一貫性を守るために変更可能性のスコープをオブジェクト内部に限定するためのものであって、内部状態の秘匿が目的じゃない
というかオブジェクトの内部状態が外から分からないようなものはテスト出来ないでしょ
ダメだろそんなクラス
2020/06/19(金) 16:09:36.39ID:sPM5NjRd
>>50
>そのアプリを複数人でいじってるんなら、ライブラリやらの恩恵と同じ効果があるんじゃね?
個々のクラスをじっくり丁寧に作って、データを変更する専用のメソッドをきっちり
作り上げれば安全性は確かに高まる。
これは、人数の多いプロジェクトなら可能だと思われる。
ただ、個人製作のアプリだと、そこまでクラスを作りこむのは時間が掛かりすぎてとても
効率が悪くなる。
結局、個人製作レベルだと、ファイルツリーニューの中のデータを変更する際にやってはいけないことなどの注意事項をどこかのテキストファイルなどに書いておいて
データはpublicにしておいて、それに気をつけながら、アプリの他のクラスからでも普通に書き込みアクセスするように
した方が開発時間は少なくて済むようだ。
2020/06/19(金) 16:12:27.76ID:sPM5NjRd
>>59
その気持ちも分かる。
しかし、その一方で、例えば fopen()のようなライブラリ関数を使う際、
FILE構造体の中身までしっかり公開されてなくても、fopenの使い方が
しっかり説明されいればそれで十分であり、逆にFILE構造体の中を勝手に見て、
それを前提にプログラムしすぎることは、FILE構造体の中身が変更になった
場合に問題となる。
2020/06/19(金) 17:22:18.89ID:gQU/M+Sr
>>60
> 結局、個人製作レベルだと、ファイルツリーニューの中のデータを変更する際にやってはいけないことなどの注意事項をどこかのテキストファイルなどに書いておいて

それをソースコードの中に書くんでしょ? privateって
2020/06/19(金) 17:31:41.22ID:I4TvFtlH
結論:privateにしたら、必ずgetterを用意しておきましょう。
64デフォルトの名無しさん
垢版 |
2020/06/19(金) 17:34:28.47ID:sPM5NjRd
>>62
昔から言われていることなんだけど、ソースコード以外の場所にちゃんと
フローチャートなり、データの構造や関数の関係図、何らかの図など
プログラム中に書きにくい注意事項をどこかに予め書いておくと、
プログラムにとても役立つんだ。
2020/06/19(金) 22:59:31.97ID:wpvtDg0l
>>60
そこは考え方次第だからねー
asyncでいいならファイルツリーはすべてNodeクラス配下で汎用的に扱う方が楽なので
俺ならそうする
コードも少なくて済むし扱いやすい
常にsyncって話になるとfsevent見て反映させる

カプセル化のメリットは全体像を知らなくても扱えるように理解して努力していれば
結果的にコストが下がることにあるけれど
オブジェクト扱ってるのに中身は関数で組んでいる人が混じると割と悲惨なことに(なった)
2020/06/19(金) 23:03:14.16ID:wpvtDg0l
>>64
それよりもテストコードが含まれてないソースは信用できないね個人的に
コードが更新される時ドキュメントも更新されるとは限らないし
ドキュメントには本当に必要な情報がなかったりもする・・
67デフォルトの名無しさん
垢版 |
2020/06/20(土) 18:55:53.44ID:EGdSCTAj
こっちでも始まったのか
2020/06/20(土) 19:10:33.56ID:Zs4RBEp5
>>66
でもチェックしにくいとこってデバイス絡みや使ってるUIのライブラリの変な仕様のとこだろ
テストコードなんて動くの?
2020/06/20(土) 19:23:07.65ID:H+D2eLk6
>>68
デバイスを使う「ソフトウェアコード」のテストをするんだから、
デバイスのテストをしても意味がないぞ

「デバイス」のテストなのか、デバイスを使う「ソフトウェア」のテストなのか
どちらを対象としたテストなのかをはっきりさせよう

デバイスのテストはデバイスのテストで別にやる
両方を同時にテストしようとするな
2020/06/20(土) 19:47:22.29ID:Zs4RBEp5
>>69
でも全部ひっくるめて正常に動いて欲しいんだろ?
どう組んだら正しいのか誰もわからないものでプログラマをぶん殴る口実がほしいと
71デフォルトの名無しさん
垢版 |
2020/06/21(日) 21:47:24.01ID:yZ1Fm+rk
>>64
> プログラム中に書きにくい注意事項をどこかに予め書いておく
これが必要になる場面って大抵は設計が歪んでいる
2020/06/21(日) 22:27:56.93ID:TM3DTGpo
>>68
>でもチェックしにくいとこってデバイス絡みや使ってるUIのライブラリの変な仕様のとこだろ
そういうところを切り出してモックなら動くことを示してソフト側は悪くないって
言い張るための技術だぞ。
2020/06/23(火) 01:08:56.89ID:hoXOIHD6
https://video.twimg.com/ext_tw_video/1273820540352909313/pu/vid/270x478/HZq8qYhba4upqVyw.mp4
2020/06/23(火) 14:03:05.97ID:Amhn2FuL
頭が悪いやつが多い業界だし、カプセル化は有用だと思うがな
勝手に変更させない、有用に変更しても理解できないので変更しないほうがいいって
2重の意味で
2020/06/23(火) 15:11:05.61ID:o6bKn79R
>>1
そのカリフォルニア大学ソースどこ?
むしろ、彼らの作成するソース(github)を見るとオブジェクト指向で、@private(JSDoc)を律儀に記述しているけど。
ん?JavaScript以外?C#やJava?
privateをサポートする言語でカプセル化しない馬鹿なんてこの世に存在するの?
76デフォルトの名無しさん
垢版 |
2020/06/23(火) 23:33:42.34ID:JaUjApVc
>>74
そういうクラスを作る側が頭が良くて
利用する側がどうせ頭が悪いという傲慢さが
オブジェクト指向が批判される原因だと思うわ。

大体 既に書かれたコードの記述で
新規プログラマーのコーディングを制限しようと
言う考えが傲慢以外の何物でもない。


お前らの言う頭の悪い奴は元のクラスのprivateを
publicに変えるかもしれないし
Personというクラスの隣に
Person2と言うクラスを複製してそっちの方をpublicに
変えて利用するかもしれない。
でもそれって止められるわけないだろ?
それを言語仕様で止めようとしてる事がどうかしてる
元のクラスが使いにくくて変えたいから変えたいんだよ。

それに5重6重にカプセル化されたオブジェクトなんて
邪魔でしかないんだよ。デバッグしにくいし
2020/06/23(火) 23:58:42.49ID:AMcrD26I
いや、止められるだろ。。そのままリリース出来る方がおかしいだろ
2020/06/24(水) 00:33:12.84ID:Vx2zY5TL
むしろクラスを作る側が>>76みたいな頭の良い人から身を守るために必要
想定してない使用法でバグった時に責任とりたくないもん
Person2に不具合があっても俺には関係ないから好きにやってくれ
2020/06/24(水) 00:57:36.62ID:I5+T+Giv
https://video.twimg.com/ext_tw_video/1266492233030627329/pu/vid/720x1280/AvyTiTS0EeNdp3DS.mp4?tag=10
2020/06/24(水) 01:13:12.47ID:ZBvJ9IFx
カプセル化の弊害とかいいつつ
カプセル化すら理解してなくて草生える
2020/06/24(水) 01:57:06.31ID:W7e3ICMc
>>76を見てると、オブジェクト指向を批判しているのはバカが過剰に騒いでいるだけなんだなと良く分かるw
2020/06/24(水) 02:39:07.65ID:gVxDDgwX
今一番勢いのある言語であるPythonは完全なプライベートじゃ無いんだよな
2020/06/24(水) 03:02:02.88ID:irp07WaX
>>81
匿名性のSNSの限界。
記名性だと色々と能力が分かって、無視される。
2020/06/24(水) 04:52:29.63ID:evfa9tXu
>>76
何がいいたいのか全くわからん。

例えばお前が言ってる頭の悪いやつが、
ローカル変数をグローバル変数に変えるかもしれんよな?
そういう場合、なんだっていうんだ?
ローカル変数が悪いって話をしてるのか?
それを止められないからローカル変数は邪魔といいたいのか?
2020/06/24(水) 07:20:27.23ID:ib1NZqNH
>>84
まあ、しょうがねぇよなって話じゃん
2020/06/24(水) 07:21:13.77ID:ib1NZqNH
初めの書き手が悪いんじゃなくてあくまで変更したやつの責任
2020/06/24(水) 12:20:09.25ID:irp07WaX
>>76
というか、MFCみたいに修正が推奨されて無い場合は除いて、
自社開発のプログラムであれば、能力がある人にはあなたが修正するのを
上司が許可してくれると思うんだ。
もし、修正を許可してもらえないなら、実績が足りて無いか能力のアピールが足りてない。
2020/06/24(水) 12:31:25.83ID:bZ0w8eld
オブジェクト指向の肝は擬人化と依頼だからな
頼む相手の内部状態を勝手に変えないってのは
無茶重要でしょ 
2020/06/24(水) 13:17:22.34ID:U8BVWvkL
>>88
>オブジェクト指向の肝は擬人化と依頼だからな
初めて聞いた
2020/06/24(水) 13:54:42.95ID:bZ0w8eld
擬人化キャラ(クラス)の関係性で物語を生成する=オブジェクト指向
そんなかんじで習ってそのまま理解してたな ちなみに学校は恥ずかしくて
言えないような底辺学校
2020/06/24(水) 14:29:54.72ID:+bJy5A36
依頼はどことなく委譲って分かるけど擬人化はただのスケベじゃん
2020/06/24(水) 14:40:07.82ID:bZ0w8eld
>>91
頭わるくてまともな学校にいけない奴らに
教えるために先生が工夫してくれたんだろうね 依頼ってのも困ったら
依存心の高い奴らに教えるのにそういう言い回ししたんだろうね
いま思えばなかなか立派な先生だったな 口は臭かったが
2020/06/24(水) 15:16:35.37ID:W7e3ICMc
>>92
分かりやすく噛み砕いて教える方法としては良いと思うけど、>>88のように一般的に通じるつもりでいきなり独自用語を使うと話が変な方にいくから、不特定多数を相手にするときは一般的な用語を使った方がいいぞ。
2020/06/24(水) 16:47:31.01ID:ZBvJ9IFx
>>91
本来人間相手にしかに使わない依頼や委譲って言葉を使ってる時点で擬人化してる
2020/06/24(水) 16:51:31.16ID:ZBvJ9IFx
擬人化と依頼のメタファは一般的
オブジェクト指向に限らないけどOOを説明する際によく使われたから

Tell Don’t Ask
http://media.pragprog.com/articles/jan_03_enbug.pdf
https://martinfowler.com/bliki/TellDontAsk.html
2020/06/24(水) 19:00:14.27ID:z1f+Mb2g
>>76

> お前らの言う頭の悪い奴は元のクラスのprivateを
> publicに変えるかもしれないし
> Personというクラスの隣に
> Person2と言うクラスを複製してそっちの方をpublicに
> 変えて利用するかもしれない。

ねーよw
もう少し基礎知識学んでから出直してこい。
まず、ライブラリの中身を書き換えること自体、ありえない。

たぶん、見ず知らずの人達が書いたコードを共有する仕組みから知らないのだろう。
2020/06/24(水) 19:25:00.99ID:vlqGopWc
>>96
いや、そもそもできちゃうじゃん
そして別にできてもいいじゃん
それが嫌だとしたらそれをドキュメントに書いとけよ
ソースには書けないし書いても消せるからさ
98デフォルトの名無しさん
垢版 |
2020/06/24(水) 19:30:57.72ID:6CkV8gwI
>>96
いや、周囲や協力会社(依頼元クライアント側プログラマ)
にこれやるやつゴロゴロいるんだって
ソースファイルでもテーブルでも何でも他人が書いたやつ
複製して仕様変更に対応するんだわ。
privateとかカプセル化なんて笑っちまうよマジで
でも意外と何とかなってる、複製したあとはレガシーコードは
全部捨てちまうんだわ

職場で新人研修で「抽象クラスって何のために作るんですか?」
って毎回のように訊かれるけど
「俺にも分からない。必要性を感じたことも、便利だと思った
事も無い。」って正直に答えてる。
オブジェクト指向の入門書に当然のようにabstract紹介
されてるけどそれの有用性を的確に説明している
教科書を見たことがない
interfaceのほうは重要性は分かるしちゃんと説明している
2020/06/24(水) 19:42:39.07ID:J59L1bOF
>>98
abstractは
上の方の人達が未知の設計概要として会議で使う
コーダーじゃない営業や客とのコミュニケーション用
2020/06/24(水) 19:53:36.46ID:GEcMOOIw
>>75
これだろ
https://ja.m.wikipedia.org/wiki/DARPAモデル

DARPAモデルとは、インターネットの持つべき通信機能を階層構造に分割したモデルである。

アプリケーション層、トランスポート層、インターネット層、ネットワーク層の4層で構成される。

DARPAモデルという呼称は、インターネットの研究開発を行っていたDARPAに由来する。
元々は確固たる仕様や定義はなく、IPやTCPやUDPなどの仕様中に個々に、あるいは暗黙の前提として存在していたものだが、後からRFC 1122で1つにまとめられた。


IP群はプロトコルとサービスをカプセル化する事によって抽象化する。
通常、より上位層のプロトコルはその目的の達成に役立てるために、より下位層のプロトコルを用いる。
これまでIETFはインターネット・プロトコル・スタックをRFC 1122で定義された4層から変更した事はない。
IETFは7層からなるOSI参照モデルに従うような試みはせず、また標準化過程(Standards Track)にあるプロトコル仕様やその他の構造上の文書をOSI参照モデルに対して参照する事もしない。

https://ja.m.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:UDP_encapsulation.svg

RFC 3439では、インターネット構造に関して第3章の序文に"Layering Considered Harmful (階層化の有害性)"と題された節が有り、
「階層化」という考え方が概念的および構造的にさまざまな利点を持っているが、
実装面では層単位で同じような最適化が繰り返し発生することによる無駄な処理により効率的な実装を阻害し、複雑化を招くことがあり、
また低層部分のみに存在するデータにアクセスできない場面が発生するなど、

インターネット・プロトコルの目指す「単純化」という原則に反することもあることが明記された。
2020/06/24(水) 20:04:30.89ID:GEcMOOIw
>>75
ググったら日本語訳もあった
http://www5d.biglobe.ne.jp/stssk/rfc/rfc3439j.html
2020/06/24(水) 21:01:40.99ID:7L466iYI
>>98
抽象クラスは単なるテンプレ
クラスを作る際の約束事を規定できる
具体的には実装忘れやメソッド名を間違えるのを防げる
自分のような忘れぽい人間には役立つ
2020/06/24(水) 22:26:02.81ID:z1f+Mb2g
>>98
> 「俺にも分からない。必要性を感じたことも、便利だと思った事も無い。」って正直に答えてる。

正直なのはいいけど...なんで、privateの有効性がわからないのに、カプセル化を批判するのか。
無知の批判ほど、初心者が誤解を生む原因になるからやめてほしい。

例えばだよ。
何の言語をよく使うのか不明だが...標準ライブラリってあるじゃん?
その標準ライブラリのクラスに「呼び出したら破綻する(内部処理実装用の)メソッドや変数」が定義されていたら、どうする?
クラスを使う人に呼び出してほしくない機能はprivateにするべきでしょ。
実装する側の都合だけじゃなくて、クラスを使うユーザーのことも配慮して使うものだよ。

OOPアンチとOOP活用者の絶対的な違いは自作したクラスを使う人のことを深く考えているかどうか。そこだよ。
2020/06/24(水) 22:30:44.22ID:MQA513Hf
>>103
使う側と作る側が完全に分離した環境に当たったことがない
win32apiや.netframeworkを作る人以外にそんな需要ってあるの?
2020/06/24(水) 22:31:32.44ID:evfa9tXu
>>104
win32apiや.netframeworkを作る人には需要があるって認めたの?
2020/06/24(水) 22:32:45.63ID:z1f+Mb2g
って、わからないのは抽象クラスかいッ!
なんか、アンカを間違えたような間違えていないような微妙な回答をしてしまった...。
まぁ、抽象クラスは>>102に書かれている通りって事で。
2020/06/24(水) 22:34:51.23ID:MQA513Hf
>>105
俺が作るならいらん
状態をクラスのインスタンスが内部に保持してしまうのは害にしかならない
2020/06/24(水) 22:42:26.10ID:MQA513Hf
なんか今までノリでクラスで作ってきたのを止めると物凄くスキルアップするぜ

一度はオブジェクト指向をやってみるのもいいかもなってのは思う
クラス構造で便利なものとそうでないものは当然ながらこの世にはあって
そのほとんどが実はクラスにしないほうがうまくいくものばかりだ
大半の処理は
入力→処理→出力
の繰り返しであってこれのまとまりが
機能となる
ただ極稀にクラス構造で考えた方が便利な構造のものもある
役に立つのはその時だけだ
そしてそのケースは極めて稀である
2020/06/24(水) 22:43:14.13ID:z1f+Mb2g
>>104
.netは勿論、Android、iOSネイティブ、バックエンド node.jsやPython、mbed(組み込み)、
まぁ、一部private機能をサポートしていない環境はあるけど、作る側・使う側の意識は常に持つよ。

.netを知っているってことは、Nugetのことは知っていると思うけど...
gradleとか、npmとか、github等と連携させて他人の作ったライブラリの自動追加及びアップデートの仕組みはいくらでもある。

てか、自分で作ったコードですら、作る側・使う側は意識するよ。
過去に作った自分のソースなんて、他人が作ったソースみたいなものだし。
内部実装を理解していないと使えないソースなんて使いこなせるほど俺の頭はよくないよ。
2020/06/24(水) 22:44:48.06ID:evfa9tXu
>>107
> 俺が作るならいらん
つまり、俺が作らないなら、必要だって言ったのと同じことだよね
2020/06/24(水) 22:47:38.19ID:evfa9tXu
最初からオブジェクト指向は大規模なものを
複数の人で作るためのもので
それをわかってないから、

「俺が一人で作るようなものならいらん」

なんて発言が出てしまうんだよな
2020/06/24(水) 22:52:50.78ID:7L466iYI
>>109
内部実装を理解していないと使えないソースなんて使いこなせるほど俺の頭はよくないよ。
まあこれだよね 
頭いいやつには必要ない技術かもね 凡人には必須だとおもうけどな
あと設計思想とかそんな面倒な話じゃなくてシンプルに補完ができるのが楽 
2020/06/24(水) 22:54:20.40ID:VGKuFIs7
>>107
内部に保持するのが良いとは言わんが外部に公開すれば良いってもんでも無いでしょ
いつ何時外部から状態が変更されても破綻しないように責任持てと言われても
僕は頭が悪いから無理です
2020/06/24(水) 22:55:53.79ID:evfa9tXu
そもそもprivateっていうのはコミュニケーションの道具で
privateって書いていなければ、好き放題アクセスしてOKという意味に
捉えられるかもしれないわけだ。

コメントの高度版なのだからコメントなくてもできるのは当たり前
だがそうすると修正が難しくなる

俺が作るなら〜っていうのはコミュニケーションが
必要ないから言える話
2020/06/24(水) 22:58:49.48ID:z1f+Mb2g
>>112
まぁ、そうだな。
ただ、面白いのが...
頭のいい人がOOPに漬かると、余裕ができた分、コンピューターの仕組みにとらわれずエンドユーザーの事を全力で配慮した品質の高い製品を作れるようになる。
2020/06/24(水) 22:59:48.33ID:z1f+Mb2g
アンカまた間違えた...
2020/06/24(水) 23:00:40.93ID:z1f+Mb2g
間違えてなかった。もうダメだ...
2020/06/24(水) 23:26:13.24ID:MQA513Hf
>>113
構造体でまるっと渡してやるよ
2020/06/24(水) 23:27:50.80ID:MQA513Hf
>>111
逆だな
デカければでかいほどオブジェクト指向で組むのはやめた方がいい
内部の状態遷移を誰も理解できない
2020/06/24(水) 23:31:43.79ID:MQA513Hf
そもそもさ
クラスで状態を保持するソースってさ
実装全部見て
何やるとどう状態遷移が起こるのか把握しないと使えないじゃん
これが最高にダルイ
もう年取ったしこんなの付き合ってらんない面倒臭くて
2020/06/24(水) 23:32:23.15ID:fkg3GZzF
単なるモジュール切り離しのための技術の一つだよ。
バカが騒ぎまくったせいでクソみたいなインターフェイスによる切り離しで
逆に見通しが悪くなることが多くなった。
細かい粒度で使うような技術じゃない。
2020/06/24(水) 23:41:46.40ID:MQA513Hf
>>121
いや、単純に面倒臭いだけでメリット皆無じゃん
2020/06/25(木) 00:13:01.48ID:JeYxH76v
内部に状態変数をもたれたらグローバル変数の比ではないほど厄介。
単体テストやデバッグが壮大なことになる。
2020/06/25(木) 00:16:04.75ID:JeYxH76v
「状態によって挙動が変わる」ものが何十個も何百個も集まったら誰も把握しきれない。誰も制御しきれない。
2020/06/25(木) 01:13:10.51ID:h5MGZkZK
>>119
>内部の状態遷移を誰も理解できない

使う側は内部の状態遷移なんて理解する必要ない
理解しないと使えないようならその設計が悪い
2020/06/25(木) 01:41:45.27ID:Q34w5rfS
内包してる初期化フラグ一つで
全く同じ入力に対して全く異なる出力が出てくるんだから
こいつは厄介だよ

勘がいいやつはこれだけでこの仕組みを使わない
2020/06/25(木) 03:09:24.52ID:9YSX2wtH
>>124
だからオブジェクト指向で小さくするんだよね
128デフォルトの名無しさん
垢版 |
2020/06/25(木) 03:13:43.10ID:AD4h9H61
>>110 君頭悪いねってよく言われない?
2020/06/25(木) 03:15:57.10ID:9YSX2wtH
>>128
言われない。むしろお前のほうが言われてるだろ。
2020/06/25(木) 04:09:57.03ID:3STWDldz
お前ら頭悪いね
131デフォルトの名無しさん
垢版 |
2020/06/25(木) 05:35:58.45ID:AD4h9H61
レス番まで指摘されても自分のおかしい発言に気づけないとはいとあはれ
2020/06/25(木) 05:40:21.51ID:hNcIaCHg
いいぞ、もっとやれ
2020/06/25(木) 07:10:48.49ID:MncJLzSh
内部を知る必要ない。インターフェースだけ守れ
2020/06/25(木) 07:22:24.62ID:/bWSJldt
彡 ⌒ ミ
(´・ω・`) 頭がなんだって?
2020/06/25(木) 07:30:13.69ID:p+gLKGcc
>>122
めんどくさくて新しい(もう20年以上前からメジャーではあるが...)考え方についていけません、てだけだろw

お前が懸念している内部の状態遷移が見えないというのは、見えなくていいように作り、見えなくていい部分だけを隠すんだよ。
お前の大好きな従来の手続き型だって、下手に作れば手続きを呼び出す順序や渡すべきデータの構造や内容が訳分からない複雑なものになるだろう。

単に自分の知ってる手法では良い設計を知っていて問題点を避けられる、よく知らない手法は問題を回避する方法がわからなくて問題のある手法と思えてしまう、ただそれだけのこと。
2020/06/25(木) 07:32:40.30ID:U43KJZDw
クラスの状態はクラスが知ってれば良い
という思想なんじゃねえの?
オブジェクト指向は?
2020/06/25(木) 07:35:44.39ID:Q34w5rfS
>>136
テストするんですが〜
2020/06/25(木) 07:53:57.86ID:Q34w5rfS
>>135
違うだろ
内部の状態が見えないのにテストなんかできないだろ
そのクラス使ってある限りそいつの状態次第で色んな動作しちまうんだから
はっきり言ってクラスは欠陥製品
特に内部に状態を保持するような使い方は害悪
2020/06/25(木) 08:19:04.16ID:p+gLKGcc
>>138
お前はオブジェクトの状態として、外部に影響を与える外部仕様の状態と、外部に影響を与えない内部仕様としての状態を混同してないか?
文字列のオブジェクトが文字列"abcd"を持つとして、それは外部に影響を与えるものだから、privateのメンバとして保持されていようがテストケースとしてそれを与えて状態を設定してテストすればいい。
一方、その文字列がどういう実装で保持されているか、ヒープなのか固定配列なのか、参照カウンタやさらに複雑な仕組みを使っているのかといった内部仕様的な状態は、このクラスを他と組み合わせてテストする段階ではテストする必要がない。こういう部分は、先にクラス単体のテストで保証しておけば良い。
そういう切り分けができない作りになっているなら、それは設計が悪い。
2020/06/25(木) 08:42:04.56ID:Q34w5rfS
>>139
いや、MSのクラスだってなんかよくわからん動作するのあるし
いいとか悪いとかじゃなくて状態を保持したら地獄行き

覚えといてね
2020/06/25(木) 08:57:56.71ID:rghIsJSV
>>122
めんどくさいのはその通り。
テスト駆動開発の本とか読んでどういうオブジェクトを引数にすると
テストしやすいかが理解できてくるとありがたさがわかってくる。
オブジェクト設計とか言い出す馬鹿は無視しろ。
2020/06/25(木) 08:58:07.22ID:XTsRyKlX
>>120

> そもそもさ
> クラスで状態を保持するソースってさ
> 実装全部見て
> 何やるとどう状態遷移が起こるのか把握しないと使えないじゃん
> これが最高にダルイ
> もう年取ったしこんなの付き合ってらんない面倒臭くて

だ、か、ら、
それを解決するためのオブジェクト指向だ つってんだろ!
クラスをオブジェクト指向も意識せずに、ただただ構造体みたいに実装して使うから、そうなるんだよ。
2020/06/25(木) 09:10:36.57ID:p+gLKGcc
>>140
どのクラスを指して言ってるのか知らないが、それはそのクラスの仕様自体の複雑さかお前の理解不足が原因で正しい挙動が分かってないとか未定義動作をさせているとかでないの?
状態を保持するのが問題なのではなく、知っておくべき状態、情報を知らずに上手くいかないのをオブジェクト指向のせいにしているだけのように見えるぞ。
2020/06/25(木) 09:17:11.38ID:rghIsJSV
状態をできるかぎり持たない方がいいってのはその通り。
ただ通信ソケットみたいなもの実装しようとすればどうしても状態を持つわな。
コネクション張るオーバーヘッドが小さくない時点で、性能出そうと思えば状態をもつしかないので。
2020/06/25(木) 09:21:43.95ID:H2Spozu7
オブジェクト指向って設計手法であると同時に
責任の切り分け手法でもあるんだよね 別の共同体(無償で手伝う気なしって意味で)
と作業する場合は必須でしょ
2020/06/25(木) 10:04:43.33ID:Q34w5rfS
>>142
は?メソッド全部staticにしてみろ
大半の問題が解決する
2020/06/25(木) 10:09:16.30ID:XTsRyKlX
>>146
解決しねーよ!むしろ、問題が多発するわ!
それ以前に、何の問題が解決するんだよ。
2020/06/25(木) 10:09:53.75ID:Q34w5rfS
>>145
いやー、クラス内で状態を保持するクラスが大量に呼ばれてて
本来はそれらの全ケースを網羅する必要があるが作業者の裁量で省略されてる状態じゃないっすか?
切り分けじゃないッスよね?
クラスAとクラスBがそれぞれチェックされててもそれらが合わさったことでバグが発生してる可能性もあるンスから
テストはちゃんとやるのであれば状態全網羅でしょう

ぶっちゃけ無理っすわ
状態を保持をやった時点で地獄行き

覚えた?確定事項よ
2020/06/25(木) 10:11:45.88ID:Q34w5rfS
>>147
グローバル変数さえなければ入力に対してぜってー決まった出力しか出ないのに何が問題出るの?
頭おかしいんじゃない?
○○構造のとき作りにくいってのはあると思うけど
わかりやすさでこれ以上はないよ
2020/06/25(木) 10:18:17.66ID:H2Spozu7
>>148
クラスAとクラスBがそれぞれチェックされててもそれらが合わさったことでバグが発生してる
可能性もあるンスから

こうなったときにAもBも直す必要がないでしょってこと どちらかを直すかは共同体
同士のパワーバランスで決まるんだけどねw そこはまあ大人になるしかない
■ このスレッドは過去ログ倉庫に格納されています