- 1 名前:デフォルトの名無しさん [2018/08/24(金) 13:32:09.36 ID:ifygL6bT.net]
- カプセル化(英語:encapsulation)とは、オブジェクト指向を構成する概念の一つで、
オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、 オブジェクトの実際の型を隠蔽したりすることをいう。 偏差値の低い学校向けの情報処理系教科書において「大変すばらしいものであり絶対に使うように」と大体的に宣伝された。 一方、カリフォルニア大学バークレー校の有識者を中心としたインターネットを作った人たちは「階層化の有害性」として 「絶対に使うな」としている。大雑把にいうと、その時は良くても、将来的な改修の際に隠蔽されたデータに アクセスできないと解決できない問題が出てきて、結果的にデスマーチに陥るというのである。 オブジェクト指向の発案者であるアラン・ケイもコーディング規約(頭文字にアンダースコアを付けるなどの命名規則)で 縛る程度にすることを推奨しており、アラン・ケイが関わったオブジェクト指向プログラミング言語にはどれも「private」 という概念はない。 https://monobook.org/wiki/%E3%82%AB%E3%83%97%E3%82%BB%E3%83%AB%E5%8C%96
- 237 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 21:48:43.99 ID:FEoaRsa5.net]
- 低学歴は無理せずにIT土方やってなさい
- 238 名前:デフォルトの名無しさん [2018/09/24(月) 23:07:18.05 ID:Kxio7RVg.net]
- 転ばぬ先の杖
STOP オブジェクト指向
- 239 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 23:31:05.04 ID:JEGqIfby.net]
- >>230
いびつな答え方するんだがそりゃ間違いなくパーツや責任関係の切り分けからーの作りやすくなるってことやろな 俺は嘘だと思う
- 240 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 08:11:13.05 ID:ffbXNZny.net]
- 色んなサイトでオブジェクト指向の説明してるけど説明が下手すぎねえか?
設計図とか野菜や動物に例えるとか理解してんのかと思うわ 雛形作ってからそこに入力規格を統一したデータをぶち込むって例えでいいだろ
- 241 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 08:46:47.22 ID:Eix7hoc3.net]
- >>235
意味不明すぎてふいた
- 242 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 08:48:25.26 ID:Eix7hoc3.net]
- オブジェクト指向とは雛形作ってそこに入力規格統一したデータをぶち込むってことだぞ
- 243 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 08:48:47.92 ID:Eix7hoc3.net]
- わかってんのかお前ら
- 244 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 11:00:50.48 ID:bhDxFTjN.net]
- さっぱりわからない
オブジェクト指向のメリットとか特に
- 245 名前:デフォルトの名無しさん [2018/09/25(火) 12:27:26.16 ID:6l+mHu1d.net]
- ぶち込んだ経験ないやつには難しいやろな
- 246 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 12:30:49.14 ID:Ti214GxU.net]
- オブジェクト指向とは関数仕様があってそこに仕様通りの引数渡すことなのね。
すごい、ようやく俺でもオブジェクト指向が理解できた!
- 247 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 15:04:59.78 ID:GnoTTlW7.net]
- >>215
>オブジェクト指向って何ですか? オブジェクトを中心に組むこと クラスベースの言語ならクラス Cは関数で組むけどC#はクラスで組む >C言語では できる けどCは向いてない C#とかJavaとか 最初からOOをサポートしてる言語の方がやりやすい
- 248 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 15:05:47.22 ID:GnoTTlW7.net]
- >>230
>オブジェクト指向のメリット プログラムの変更コストが下がること
- 249 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 17:07:50.15 ID:bhDxFTjN.net]
- >>243
どういう理由で? オブジェクト単位に分けると仕様が消えるの?
- 250 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 18:10:21.54 ID:GnoTTlW7.net]
- >>244
疎結合になるから
- 251 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 18:52:32.16 ID:bhDxFTjN.net]
- >>245
それって君が想定した変更のときだけだよね?
- 252 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 18:58:18.78 ID:bhDxFTjN.net]
- そうでなければむしろ最強レベルの苦痛を伴う変更になるんだよね?
無意味じゃない?
- 253 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 19:02:25.86 ID:GnoTTlW7.net]
- >>246
想定外の変更があったとしても オブジェクト単位の方が変更しやすい
- 254 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 19:05:45.05 ID:bhDxFTjN.net]
- >>248
別れてるからこそ変更しにくいって状況になったことがない? 経験不足じゃない?
- 255 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 19:10:47.09 ID:bhDxFTjN.net]
- 例えばさヘッダーと内容と記述者と更新日時がある条件を満たしたときに
ヘッダーにある文字列を入れて欲しいと でもヘッダーは他の全てを知らないので関連するオブジェクト全てに手を入れなければならないと こういうの想像できないの? レベル低くね?
- 256 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 19:16:48.81 ID:GnoTTlW7.net]
- >>249
いやいやそれこそ オブジェクト指向開発での経験不足
- 257 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 19:22:34.13 ID:GnoTTlW7.net]
- >>250
>ヘッダーと内容と記述者と更新日時 たとえばブログのエントリのように それらの情報に関連性があるのであれば ひとつのオブジェクト(クラス)にする そのオブジェクトは当然関連するデータを知っているので 変更もスムーズにできる 一方オブジェクト指向でない場合には それらのデータがバラバラになっているから変更しにくい この場合は疎結合というより高凝集の側面が出ている オブジェクト指向で正しく組むと高凝集疎結合になる
- 258 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 19:28:22.29 ID:bhDxFTjN.net]
- >>252
って変更を各オブジェクトに入れないとできないよね? c言語だと普通に処理書くだけやで
- 259 名前:デフォルトの名無しさん [2018/09/25(火) 19:40:26.69 ID:du+nhKJd.net]
- オブジェクト指向は設計思想として好きだけど
オブジェクト思考的パラドックスに陥っている気がする
- 260 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 19:54:06.59 ID:o8KZiItl.net]
- これだけ前もって言っといた方がええやろ
データとメソッドをオブジェクトで綺麗にまとめることを自慢する輩はオブジェクト指向ですらないと
- 261 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 20:13:12.32 ID:BMMTvniR.net]
- データとメソッドをオブジェクトで綺麗にまとめられるのは事実
別に自慢はしてない オブジェクト指向を勘違いしている人はオブジェクト指向を、 不可能なことを可能にする技術だと勘違いしておいて 不可能なことを可能にしてないと(自分の勘違いを)批判してる オブジェクト指向は従来
- 262 名前:のやり方でも可能ではあるが
大変なことをより分かりやすく簡単に実現するための技術 [] - [ここ壊れてます]
- 263 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 20:53:51.26 ID:GnoTTlW7.net]
- >>253
>c言語だと普通に処理書くだけ 大規模になると「普通に」って言っても 関連のある変数を探すのが大変になってくる だからオブジェクト指向の方が変更しやすい
- 264 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 21:06:16.95 ID:BMMTvniR.net]
- オブジェクト指向は大規模開発のために作られた
だが小規模開発で使用しても問題ない
- 265 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 21:51:35.20 ID:CZcrESgD.net]
- 強制的にOOに慣れるためのプログラミングスタイル、ってありませんか?
- 266 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 21:56:25.48 ID:GnoTTlW7.net]
- >>259
OOコード養成ギブス d.hatena.ne.jp/akkt/20080424/1209051266
- 267 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 22:15:26.66 ID:CZcrESgD.net]
- >>260
thx a lot !!!
- 268 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 22:46:19.22 ID:FLKmzsJJ.net]
- >>256
> オブジェクト指向を勘違いしている人はオブジェクト指向を、 > 不可能なことを可能にする技術だと勘違いしておいて > 不可能なことを可能にしてないと(自分の勘違いを)批判してる こういう意見おなかいっぱい 「OOPのメリットはXXXです」 以外の文章はもういい
- 269 名前:デフォルトの名無しさん [2018/09/25(火) 22:57:23.11 ID:BRabQ1iT.net]
- 流れを追っていくとOOPのメリットはリファクタリングにかかるコストが安いって読めるけど
これじゃあダメなのか?
- 270 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 00:31:24.02 ID:bs5egenN.net]
- オブジェクト指向のデメリットが単純にコードの段取りや量が増えて鈍臭いんだから
メリットは必然的にその分作りやすくなるって事に消去法でなるやろ まあ嘘である
- 271 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 00:44:41.52 ID:bs5egenN.net]
- >>260
適当に読んだけどええ事書いてるな そうそう抽象化っていうのはこの位しないとダメよな
- 272 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 04:39:27.51 ID:8XNtqdsN.net]
- セッター、ゲッター、プロパティを使わない。
これはカプセル化を強いる抜本的なアプローチだ。 これはDependency Injectionアプローチの実装も必要になるし、 "言え、訊くな"という格言の遵守も必要となる。 おれの居るところ真逆のプロジェクトだ使いまくりでワロタ
- 273 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 06:02:50.00 ID:Jt0rVGX1.net]
- セッター、ゲッター、プロパティを使うなってのはクラスは全て操作だけで実装しろってことなのかな?
- 274 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 08:59:38.32 ID:cdctReAr.net]
- >267
イメージ的にはそうだと思う ただ操作対象を設定する必要は有るから全く使わないという事では無い ゲッターセッターの一番の問題点は それを不用意に使ってしまうとグローバル変数をただ面倒な手順を増やして使うだけになってしまい易いから 不用意に使わないようにする という訓練の為に 使うな と言っているのだろう あくまでオブジェクト指向プログラミングが全くと言って出来ない人向けなんだろう というよりそう書いて有るけど オブジェクト指向プログラミングの最大の問題点は 標準教範が存在していない事なんだよなぁ そのギプスなんたらは教範の一部に成れる可能性が有るかもしれない
- 275 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 21:23:07.74 ID:2wWeimMK.net]
- >>268
納得できる説明なのにおかしな改行で台無し・・・
- 276 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 22:10:14.19 ID:Ye0laooE.net]
- メタプログラミングが不要な用途だけなら、オブジェクト指向知らなくても組める。
まあいつまでももそれだと、大規模システムの仕事は無理だが。
- 277 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 22:27:48.39 ID:xMAwDWlb.net]
- ゲッターセッターの悪いのは
インタフェースありきの設計の中に 実装上の変数がうっすら見えてきちゃうこと そんなもんを前提に設計してはならない 実装に対してプログラミングするのではなく インタフェースに対してプログラミングするのだ 同じ理由で、それを書き易くしたC#のプロパティみたいなもんは糞 池沼の要望に迎合した
- 278 名前:謔、な糞 []
- [ここ壊れてます]
- 279 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 22:42:34.06 ID:yzZF1GUc.net]
- >>271
メソッドとプロパティ (setter, getter) は本質的に同じものだよ オブジェクトのメソッドの大半はオブジェクトの状態を取得または変化させる (状態を参照しないならそのオブジェクトに持たせる必要はないわけで) オブジェクトのメソッドのうち、一つの変数を変更するものがsetterで 一つの変数を取得するものがgetter・・・になってることが多いが別にそうする必要はない。 例えば内部変数が配列で要素の0番目を読み書きするsetter/getter 要素の1番目を読み書きするsetter/getterを作っても良い もちろんsetter/getterではなくメソッドでやっても良い どちらでも同じことができる。 言い換えると、システムを作るのに、メソッドだけでも実現できるし プロパティ (setter/getter) だけでも実現できるということ メソッドとプロパティ (setter/getter) の違いは UMLのクラス図を書いたことがあればわかる。 UMLのクラス図には操作と属性の両方が存在するんだよ。 なぜか? それは人間の思考を反映させた結果だから 実装段階の思考ではなくて設計段階の思考ですでに操作と属性が別れてる。 メソッドとプロパティは本質的には同じものでコンピュータから 見れば同じものとして扱えるが、我々は人間なんだ。 人間がそれは操作、それは属性って分類して考えてるから、 それをコードに反映させられる記述能力の高さを求めた結果 メソッドとプロパティができたんだよ しかたないね。人間だもの
- 280 名前:デフォルトの名無しさん mailto:sage [2018/09/26(水) 23:05:14.04 ID:xMAwDWlb.net]
- > メソッドとプロパティ (setter, getter) は本質的に同じものだよ
> (以下ポエム略) ?? なぜそれを俺にレスしたのか不明
- 281 名前:デフォルトの名無しさん [2018/09/26(水) 23:25:48.93 ID:+un+mAjX.net]
- むしろおまえ以外の誰にレスしろというのか不明w
- 282 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:13:38.88 ID:oacq4Bqj.net]
- だが実際にはクラスを半グローバル変数の格納構造体みたいに使って
setter/getterでアクセスして外側から中の実装を多角的に覗くような記述をし そこに更に継承を使って依存でスパゲティー状態になっちゃうから ソフトウエアの表現方法としての有効性に疑問を持ち始めた人が現れてきたんじゃないかな
- 283 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:30:43.91 ID:Fk1HpByz.net]
- >>275
つまり、 × getter/setterが悪い ○ getter/setterの間違った使い方が悪い
- 284 名前:デフォルトの名無しさん [2018/09/27(木) 00:35:00.12 ID:pq96CSzd.net]
- 刺身にタンポポのせてるヤツが
ちゃんとキリキリ働いてるか その働きぶりをたまに覗きたいことはある こっちからなにをするということはない
- 285 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:42:24.43 ID:oacq4Bqj.net]
- >>276
確かに悪い使い方が都市伝説みたいに普及しすぎて、ろくろくまともな開発したことの 無い輩まで頓珍漢なオレオレオブジェクト指向論を吹聴するにいたったブームには参ったが、、 使い方の問題のみならず、そういう表しにくい構造がソフトウエアそのものにあるじゃないかと思う。 非常に表しにくい場合が少なからずあり、小さいサンプルコードの断片で説かれるOOの美しいはずの メリットは実践で適用の場が乏しいということ
- 286 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 00:54:06.21 ID:oacq4Bqj.net]
- >>260
このギプスのサイトに書いてある方法は すごく制約した方法であり、 いろいろ大変かも知れないけど 守れば副作用の少ないモジュラリティーと 深すぎない階層設計が可能になるかもしれないのはよく分かる。 でも、守るためには強い規律とメンバのスキルと 工数のゆとりが必要だと思った。 つまり、現実にはなかなか難しい話だろうなと。
- 287 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 01:41:53.45 ID:DSKWvsHE.net]
- いや、単純に
- 288 名前:Iブジェクト指向なんてやったって地獄に落ちるだけ
クラスっていうゴミ箱に突っ込んで臭いものに蓋してる状態じゃいつまでたってもバグなんて取れないんだよ 単純にプログラムを 入力→処理→出力 という繰り返しの塊にしなければならない メソッドを呼ぶたびに状態が変化 するようなもん誰も管理できない [] - [ここ壊れてます]
- 289 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 01:45:45.45 ID:oacq4Bqj.net]
- オブジェクト指向の解釈が多彩なので、あれだけど
オブジェクトscopeは有効な場面は多々あるんだよな closureとか部分適用とか
- 290 名前:デフォルトの名無しさん [2018/09/27(木) 01:46:43.86 ID:pq96CSzd.net]
- オブジェクト指向でも
詳細化したらデータフロー図に落とせる設計でないと お話にならない
- 291 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 01:47:55.67 ID:DSKWvsHE.net]
- 状態を持ってしまうのがまずい
いや、持つだけなら好きにすればいい 内包してしまうのがまずいと言うのが正確か?
- 292 名前:デフォルトの名無しさん [2018/09/27(木) 01:50:10.34 ID:pq96CSzd.net]
- 以前(>>161)にも書いたとおり
コレ以外方法はない この原則さえ守れば破綻は回避できる 大体の大きな問題は起きなくなる @公開インタフェースは可能な限り少なくする A原則として、よほど適切な理由がないかぎり、可能な限り継承よりコンポジション使う B下位階層(ここでの階層は>>101>>106の意味)のクラスが上位階層のクラスのインターフェースに絶対に直接アクセスしてはいけない ※ 当然、下位クラスが上位クラスのインターフェースを直接呼びだすようなリフレクションは禁止 C下位階層のインスタンスが非同期で上位のインスタンスに処理を依頼したい状況が発生した場合(可能な限りこんな状況が起きる設計は当然避けるべき)、 処理のやりとりはメッセージキューで行い、可能な限り少ない回数で簡潔なメッセージを用いて簡単に完結できるようにする、複雑なメッセージシーケンスも禁止 (コレは並立するインスタンス間でも同じ) D同じ階層に並立するインスタンスをムダに乱立させるのは当然禁止 コンポジションとメッセージシーケンス、クラスの階層(ここでの階層は>>101>>106の意味)、インスタンスの生存期間さえ ドキュメントで適切におさえることができる状態になっていれば 問題やエンハンスが発生しても持続可能対応できる
- 293 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 01:52:11.89 ID:DSKWvsHE.net]
- 単純にメソッドの成功条件に内部で持たれているメンバの見えない奴が関わってたりすると最悪
プログラムのどこでそいつが変更されるのかわからん こういう問題が起きるたびに途方も無い労力を支払うのが単純に無駄 オブジェクト指向を考えた奴はわざと技術者の仕事を作るためにこれを考えたのではないか? というぐらい一切メリットがない
- 294 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 01:54:14.64 ID:DSKWvsHE.net]
- >>284
だからな お行儀のよいクラス作るほど その実開発者は地獄を見るんだよ オブジェクト指向がクソな原因は 簡単で内部に状態を保持することなんだよ
- 295 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 01:58:10.12 ID:oacq4Bqj.net]
- もう今日は寝ろよハゲども
ノシ
- 296 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 02:02:11.90 ID:oacq4Bqj.net]
- 単純な入れ子構造になっているか分かりにくい
ランダムに依存しうるネットワーク構造は管理しにくい しかもノードインスタンスごとに状態を持っていたり 何の×ゲームだよ
- 297 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 02:41:53.03 ID:y/NaeiDF.net]
- 割と真面目にオブジェクト指向は将来的に絶対破滅するという想定で作るといい気がしてきた
上で出てる上手くいく方法とかは「延命措置」とみなして そう考えたら何かすっきりする
- 298 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 02:47:01.34 ID:Fk1HpByz.net]
- そう。1000年後には絶対破滅するという想定で、
今の仕事を全力でやればいい。 今必要なら、必要ってこと
- 299 名前:ウ、AHAHAHAHA〜 []
- [ここ壊れてます]
- 300 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 03:51:07.23 ID:fvjtmZUM.net]
- >>260
部分的に構造化プログラミング養成ギプスのような気がする
- 301 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 03:53:07.34 ID:fvjtmZUM.net]
- メソッドを呼び出す順番に依存してはならない
- 302 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 07:40:33.24 ID:zZL/tnLy.net]
- >>283
公開されてるメソッドの呼ばれ方による状態繊維が簡易なレベルならば問題ない といったところ。 通信ソケットの実装みたいなものはどうしても状態を持つのは仕方ないけど、 でもそれもできる限り小さく持つってのが最近の感覚じゃないかね。 内部に巨大で複雑なオブジェクトをガツガツ作る様なメソッドがある場合は なんか問題ある気がする。
- 303 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 08:19:49.02 ID:emgF57xx.net]
- 状態を持つなって言ってるのは関数型の考えから?
常にオブジェクト指向言語の方がメジャーなんだが
- 304 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 08:20:57.92 ID:BciEc+9A.net]
- 昔はgetter/setterを使うべきと言ってたような気がする。
でもその時にそれに疑問を持っていた人達もいたと思うんだ。 結局、クソなのはこういう手法が良いですよという言を真に受けて無理に採用する所じゃね? このなんとかキブスが自分にぴったりくるなら採用すれば良いし、おかしいと思うなら採用しなくて良い。 オブジェクト指向も一緒でぴったり来てねえのに採用するのは良くないと思う。
- 305 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 08:24:56.86 ID:emgF57xx.net]
- グローバル変数をそのまま使うよりは
ゲッターセッターをかぶせた方がマシだけど 使わないにこしたことはないってこと
- 306 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 09:26:17.13 ID:DSKWvsHE.net]
- >>294
状態を持つと単純にテストがしにくい あるクラスにprivateでドキュメントにも記述のないメンバ変数が10個あって その内包するクラスにもメンバが10個あって・・・なんてプログラムだと そのクラスの持つ状態は10*10*・・・ みたいに増えていく 完璧にプログラムを制御しようとすると その全てを把握しなければならない 実際にはそれは不可能なのでオブジェクト指向的に組んだプログラムはそもそもバグっている
- 307 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 09:32:35.44 ID:wRik+4En.net]
- >>295
あんたは使うべきの意味を理解してないよ 使うべきっていうのは今も一緒。 まずクラスのpublicフィールドを直接読み書きしたらいけないというルールがある。 そしてもう一つ、クラスのインターフェースを頻繁に変更してはいけないというルールがある この2つのルールにより、publicフィールドを直接読み書きしていて、あとから読み書きに 何かしらの制限を書けたくなったときにgetter/setterに置き換えたらインターフェースが変わってしまう。 例えば obj.foo だったものを obj.getFoo() に書き換えないといけない だから常にgetter/setterを使いましょうと言われていた だけど今はプロパティを備えた言語ができた。 プロパティを備えた言語であれば、クラスのpublicフィールドというインターフェースを変えることなく getter/setterにできるためあえて禁止する理由がなくなった (obj.foo = 1 とかいて obj.foo に代入してるように見えて実は関数呼び出しになってる) 今はインターフェース(名前)を変えることなく、フィールドからgetter/setterに変更できるので 言われてないだけ。でもこれはプロパティを備えた言語に限った話
- 308 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 09:32:48.24 ID:DSKWvsHE.net]
- んで思うのが
どうもアメリカらしくないなと あれだけメリットとデメリットと数値化にこだわる国がなんでこんな丼勘定やねんと オブジェクト指向なんて出回った頃にはもうすでに向こうではプログラミングは 無意味な公共事業の一環になっていたのではないか? そしてそれにはもはや意味がなくて できるだけ時間がかかる方法だけが採用されたと
- 309 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 09:34:56.57 ID:wRik+4En.net]
- >>297
オブジェクトが状態を持つとテストがしにくいからといって オブジェクトに状態を持たせなかったとしても、 状態を持ってるアプリケーションから状態を消し去ることは不可能なわけで どこかに状態が存在するので、結局その部分のテストはしにくくなるよ 単にテストしにくい場所が変わるだけの話
- 310 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 09:35:52.22 ID:wRik+4En.net]
- >>299
メリットとデメリットにこだわってるから オブジェクト指向を使ってるのでは?
- 311 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 09:45:20.17 ID:DSKWvsHE.net]
- >>300
まず、それが見えているかどうかが問題 引数から渡す形ならドキュメントに記述を強制できる さらに同じ引数で実行したらなるべく同じ結果が返って来ることも保証できる これで気をつけるのはファイルアクセスやDBアクセス、日時、通信などに限定できる オブジェクト指向は全てのクラスが失敗作であると言える
- 312 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 09:59:43.55 ID:wRik+4En.net]
- >>302
いや、どんな言語で作ろうが、 アドベンチャーのフラグ管理は大変だよ 関数型言語なんか、実装が不可能なレベル
- 313 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 10:51:21.68 ID:zzHSqWZa.net]
- オブジェクト指向を捨てたGO言語を使おうってこと?
- 314 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 11:05:48.54 ID:fvjtmZUM.net]
- 実は倍精度浮動小数点数のインスタンス変数があったら2^64個の状態があるって話だ
もしくは10x10x10と10+10+10がほぼ一緒の値という主張だよ
- 315 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 11:44:32.68 ID:emgF57xx.net]
- >>297
そんなことない 本格的なオブジェクト指向では >>260みたいに小さなオブジェクト数にして 状態数も減らして単体テストしやすくする むしろ関数型で複雑な状態遷移を実装するのは難しい 現にゲーム制作ではぜんぜん関数型が流行ってないからな
- 316 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 11:52:41.46 ID:DSKWvsHE.net]
- >>306
理由が全くねーじゃん
- 317 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 12:15:48.09 ID:zzHSqWZa.net]
- >>306
何年か前にOOPのそのトレーニングやったけど 今にして思えばおかしなことをしてたなって思う 素直にGO使ったほうがいいよ 今は制約を気にせず非常に楽にコードが書ける それでいてOOPのころの糞コードからかなり離れている GOのおかげ
- 318 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 12:17:39.22 ID:zzHSqWZa.net]
- GOのtypeは非常に見通しがいい
c/c++のヘッダファイルはなんだったのかと
- 319 名前:デフォルトの名無しさん [2018/09/27(木) 12:19:15.86 ID:99b9Jx0M.net]
- 状態を持たないオブジェクトwww
もはやオブジェクトちゃうやんw何の受け売りやそれw
- 320 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 12:24:21.66 ID:nvNAA/EB.net]
- アクセスパターンを限定化する
これを理解出来ないなら オブジェクト思考プログラミングはし無い方が良い どういう訳か 凄まじい自信の有る人程解っていない というのがこの界隈
- 321 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 12:31:34.84 ID:zzHSqWZa.net]
- OOPで良いとされているが一番の間違いは
単機能の小さなクラスを沢山作ること これはクラス数の爆発を産んでるので一番の害悪 例えば特定のファイルを読むためのクラス そしてそのインターフェイスとDI用のクラスとテストケース 本当にこれが無駄 内部の状態に依存せず単機能でいいなら関数でつくればいいと気が付いた
- 322 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 12:37:21.63 ID:emgF57xx.net]
- >>310
不変オブジェクトがあっても別にいい >>312 >単機能の小さなクラスを沢山作ること 小さなクラスをたくさん作るからこそ変更しやすくなる クラスの数を大きくして数を減らしてしまうと 作るときは一見楽に見えても後で変更コストが上がる
- 323 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 12:43:37.80 ID:tnNln14X.net]
- >>313
それはOOP自体が悪いからそう見えるだけ クラス数の爆発のほうが本当の害悪 上のトレーニングもクラスをちいさくする良い理由の一つとして エディタの一画面にはいるから… クラスが一ファイル内にないといけないその言語の制約だろう パッケージ内に在ればいい言語に乗り換えよう
- 324 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 12:47:39.73 ID:tnNln14X.net]
- クラスが小さいと困ることがある
インスタンス変数を2つに絞るのは愚か 確実にクラス設計が困難になる 変数をどこが持つべきかを設計しないといけない そしてそれが間違っていた場合大規模な再設計とコーディングが必要になる 中程度のクラスにある程度必要とされる変数が入れておく方が開発工数は減る
- 325 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 12:49:58.82 ID:tnNln14X.net]
- 状態を持たない
そもそもが小さい ならクラスじゃなくて関数を使え
- 326 名前:デフォルトの名無しさん [2018/09/27(木) 12:53:47.09 ID:99b9Jx0M.net]
- >>313
不変ゆうんは状態を持つから不変なんやぞw 受け売りでイキるのやめときw
- 327 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 12:55:53.67 ID:tnNln14X.net]
- >>260
改めて書くけどこれはほとんどがもう古いし 本当の意味でOOPの弱点をカバーしてない
- 328 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 13:18:51.56 ID:M9UbUXxK.net]
- TCP接続をOOPで書くとして、オブジェクトの外側でTCPの例の状態遷移を気にする必要あるんかいな
- 329 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 14:18:04.82 ID:mMx24hKT.net]
- 不変オブジェクト自体が一つの状態であることは確かだと思うが、語弊がありそうだな。
可換原則的には互換性のある小さなクラスをたくさん作る、が正しいだろうけど、 実際にそれすると、とんでもないバカが現れて瞬時に全壊するのも見たことあるし。 やっぱり一概には言えないと思うわ。
- 330 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 14:21:34.40 ID:emgF57xx.net]
- >>316
関数でもいい場合はあるが クラスにするメリットもある >>317 それは難癖でしかない 再代入しないことによって 状態変化のデメリットが生じないので問題ない
- 331 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 15:03:29.89 ID:DSKWvsHE.net]
- >>319
気にする必要が無いように組んでもいいし組まなくてもいい でもテストは全状態に対して行わなくてはならない 現状はおそらくそれをやってる奴が少ないのがまずい ここではさもやるのが当然とばかりに主張はするがそのテスト方法は提案すら挙げられない雑魚
- 332 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 15:09:59.98 ID:wRik+4En.net]
- はっきりさせておかないといけないのは
オブジェクト指向と関数型で条件が違う比較をしてるってこと つまり 「オブジェクト指向で状態を扱う必要がある問題」 VS 「関数型言語で状態を扱わない問題」 という違った問題で比較している アプリケーションから状態をなくすのは不可能なので 「関数型言語で状態を扱う問題」を解かなければいけないのだが なぜか状態はすべてなくすことができるんだという間違った前提で 状態がない優しい問題を解いているだけになってる
- 333 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 15:43:16.13 ID:emgF57xx.net]
- >>323
これはそうだな 状態遷移が複雑なシステムをどう組めばいいか 関数型主義者から具体案を聞いたことがないね
- 334 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 17:55:02.31 ID:34EufdvK.net]
- おれは関数型主義じゃじゃないけど適切にルール組んでその通りにやればいいだけじゃないか?
関数型はオブジェクト内に状態が隠蔽されてないから やりやすいだけ
- 335 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 17:57:15.64 ID:34EufdvK.net]
- Cだと構造体がなければほぼ全部シグネチャーに書きださなければならなかったけど
関数型は関数で組み合わせてあるから楽なんだろうなとは思う
- 336 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 18:00:53.71 ID:34EufdvK.net]
- オブジェクト指向でもやりようによっては状態の遷移がわかりやすくはかける
fluxとかじゃ状態はイミュータブル actionを適用したらその都度新しい状態オブジェクトを作ってストアしてる 古い状態は書き換えられずに破棄される
- 337 名前:デフォルトの名無しさん mailto:sage [2018/09/27(木) 19:04:14.07 ID:DZkTxoQs.net]
- 状態が複雑になる場合もなるべく明示した方が嬉しいよねってのが関数型のスタンス
Haskellは状態を持つ部分をモナド型クラスのインスタンス(=型)にするし、ML系は非数値状態を型に持たせて型検査の形で明示する 個人的には基本関数型で組んで、状態が必要不可欠な問題に対しては意味論的に隠蔽されているのが正しいならprivateでそれ以外はミュータビリティと型で制御が妥当かなと その後でパフォ
|

|