トップページ⇒tech
1001コメント377KB

OOP

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/09/10(金) 19:44:50
OOPをネタに罵ったり罵られたりするスレ

0357デフォルトの名無しさん2010/09/20(月) 20:19:11
今GUIは結構古い時代に設計された物や、それを間接的に使用していることが多いので
オブジェクト指向と言ったら継承っしょみたいなノリで継承が多用されてる

しかし、一口に継承と言っても
実装の継承: コードの使い回しを目的にした継承
概念の継承: 多態性を利用する目的の継承(インターフェース継承)
の二つの継承があり、この二つが混同されることによって厄介な問題が起きる。

ちなみに、C++はprivate継承といって、実装だけの継承も出来るのだけど、
boost::operatorsみたいな特殊なパターンを除いては、コンポジションが推奨されてるみたい。
0358デフォルトの名無しさん2010/09/20(月) 20:43:48
>>355
ズレてるってか多分俺が理解できてない。

>なぜ継承元の構造をそこまで意識しないといけない?
今のところ、凄くやっつけ仕事を言ってるに見えてるから。
システム全体として引き継ぎ易い構造になるの?
0359デフォルトの名無しさん2010/09/20(月) 21:30:24
>>356
言語や開発環境でいろいろなケースがあると思うけど、俺が考えつくのは
ライブラリや開発環境が比較的代わりやすい場合は
コンポジションの方が影響を受け難い。
コンポジションは別クラスに実装するから、相手のフィールドやメソッドを直接操作出来ない。
これは欠点でもあるし、影響を受け難い利点にもなる。
継承の場合、スーパークラスが修正されると影響が出るから安定したクラスを親にしないと。
言語はjavaとか? 

>>358
>今のところ、凄くやっつけ仕事を言ってるに見えてるから。
差分プログラミングの例だから、そこまで考えていない。
和暦を入力パラメータにもつメソッドに
新元号が追加される単純な話だから。
0360デフォルトの名無しさん2010/09/20(月) 21:50:40
>>355
契約プログラミング的な考え方を非常に大雑把に言えば、
「あるインタフェースを持つオブジェクトがユーザに対して見せる機能は、
常に一貫していなければならない」と言えると思う。

差分プログラミングを、「要求の変化に対し、過去のコードを拡張することで対応する」
という考え方だとするなら、それは契約プログラミングとは必ずしも一致しないし、
むしろ相反する場合の方が多いのではないか、というのが俺の意見。

もちろん、両者が一致する範囲内での話なら特に問題はないと思う。
0361デフォルトの名無しさん2010/09/20(月) 21:58:50
>>360はいつも良いこと書くな!
0362デフォルトの名無しさん2010/09/20(月) 22:46:19
>>360
なるほど、そう言うことが言いたかったのか。

>差分プログラミングを、「要求の変化に対し、過去のコードを拡張することで対応する」
>という考え方だとするなら、それは契約プログラミングとは必ずしも一致しないし、
>むしろ相反する場合の方が多いのではないか、というのが俺の意見。
俺の意見は、差分プログラミングは基本包含になるから継承しても事前/事後条件は守られる。
俺の浅いEiffelの知識でも大丈夫だったと思うが。

ただ機能削除や別機能なら言う通りだと思う。
0363デフォルトの名無しさん2010/09/20(月) 23:05:34
いつもの人だけど、な?暗号だろ?読む気するか?
肝心の、「オブジェクトがメソッドを持つべきかどうか」に関しては何も考えない、というか、それが当たり前と思ってるのな。
OOPのグダグダは全部そこから始まってるといっても過言ではないのに。
そこ無視して小手先のフォローに走る。OOPらしいっちゃらしいが。
0364デフォルトの名無しさん2010/09/20(月) 23:33:15
少なくともC++とかの継承で多態と差分Pを同時にやるとだいたい破綻するから
やるなら多態だけにして、あとはできるだけ合成しろって事でしょ。
0365デフォルトの名無しさん2010/09/20(月) 23:37:10
>>363
少しはこのスレの住人を説得してみろよ
0366デフォルトの名無しさん2010/09/21(火) 00:39:54
>>363
OOPだとモジュール構成の最小単位がオブジェクトで、
オブジェクト同士が協調しる手段としてメソッドがあるんたから、
オブジェクトはメソッドを持ってて当たり前だと思うけど。

「OOPはよろしくない」って話?
0367デフォルトの名無しさん2010/09/21(火) 00:46:01
>>366
多重ディスパッチのことを言ってるんじゃね

>>363
個人的には「オブジェクトがメソッドを持つべきか」は正直どうでもいいなあ
それが多重ディスパッチとかのことなのであればの話だが…
最低限多態さえ出来れば手段は何でもいいと思うよ
カプセル化や継承も、あったら便利だな程度の認識だわ俺は
0368デフォルトの名無しさん2010/09/21(火) 19:39:54
>>363
そんな話し書店に行けばいくらでも読める。
俺は実践から学んだ人の考えを知りたい。
お前は図書館でもいってろ。
0369デフォルトの名無しさん2010/09/21(火) 19:58:41
そうだね、本を読めば分かることを2ちゃんで勉強するバカはいないよw
やっぱり不特定多数の人が集まるところでは、経験から来る話を一番に聞きたいね。
0370デフォルトの名無しさん2010/09/21(火) 20:29:29
しかし、本当にOOを経験している人間がこのスレに何人いるか?
0371デフォルトの名無しさん2010/09/21(火) 20:42:46
ttp://togetter.com/li/25507
最近調べ物をしててこれを知ったんだけど
publicやprivateなどの可視性は事前条件とは無関係なんだろうか?
C++ではvirtualなメンバ関数はprivate推奨のNVIイディオムとかあるし

それとは別にis-a関係はLSPにとって十分でないことを知り
調べるほどに、継承を使える自信が無くなって行く
0372デフォルトの名無しさん2010/09/21(火) 21:09:31
NVIイディオムってなんぞ?
0373デフォルトの名無しさん2010/09/21(火) 21:19:00
Non-virtual interface

それはさておき、クラスのprivateな状態をメソッドの事前条件にするのは良くない。
呼び出し側がチェック不能だから。
03743712010/09/21(火) 21:31:29
自己レス。
>publicやprivateなどの可視性
この認識はそもそも誤りだった。
publicやprivateはアクセス権(accessibility)のコントロールであり、
可視性(visibility)とは別の概念

>>373
というわけで、その主張は俺の勘違いと同じ誤りを含む
検証可能なソースとしては
C++の仕様書をvisibilityで検索すると1箇所(+索引)しかヒットせず
そこにはaccessibilityとvisibilityは違うと書いてある

となると、アクセス権と事前条件の話は独立、と考えるのが正しいのかな
上の記事はどちらかというと疑って読んでたんだけど
上のtwitterの人はまじプロいな
なんたるPitfall
0375デフォルトの名無しさん2010/09/21(火) 21:56:34
単に、派生クラスのインスタンスを基本クラスのそれと思って好きなように扱っても、
そのプログラムは常に正しい動きをするって事なんじゃないのかな

そんなにややこしいかねLSPって
0376デフォルトの名無しさん2010/09/22(水) 03:52:21
SettingDialogクラスをDialogクラスからprivate継承すれば、
SettingDialog sd = new SettingDialog();
sd.bModal = false; //エラー
Dialog tmp = sd; //エラー
tmp.width = 0;
とできる。

しかしDialogクラスのコンストラクタでdialogManagerか何か、クラスの外にDialogクラスのポインタ/参照
として渡されている可能性を考えると完璧とはいえない。
03773562010/09/22(水) 04:14:15
Qtライブラリ(言語はC++)の設計を真似した例だと
(*)AbstractDialogクラスを実装したDialogクラスがあって
こいつの実装を利用して(一部の振舞いは変更して)MyDialogクラス作りたい

MyDialogもAbstractDialogインタフェースを実装すればこのインタフェースを想定する他のクラスと組み合わせることができる
じゃあとりあえずpublic継承してメソッドオーバーライド使うのが目的の達成は一番楽だよね
Qtもこういうプログラミングを想定しているようだし

これをMyDialogクラスがDialogクラスのインスタンスをprivateメンバに持つような形の包含にしちゃうと
一々MyDialogクラスの定義でAbstractDialogインタフェースのメソッドの定義を、
振舞いがDialogクラスのそれと全く同じでも書かなくちゃならない

void fuga() { m_dialog.fuga(); }
とかね

MyDialogクラスをAbstractDialogクラスのインタフェースを使って参照等で扱う、または直接扱う場合なら問題なさそうだけど
MyDialogクラスをDialogクラスの参照経由で扱うとかならちょっと嫌な臭いがする気がする
これが>>357のいう混同なのかな?
0378デフォルトの名無しさん2010/09/22(水) 05:31:34
インターフェイスならそんな抽象クラスみたいな名前じゃなくてIDialogとかにしてくれ。
0379デフォルトの名無しさん2010/09/22(水) 07:21:52
その場合は、インタフェースの継承(AbstractDialog)と、
実装の継承系統を分けた方良いんでない

DialogImplみたいな別クラスをAbstractDialogに所有させる。
違う挙動が欲しければImplの方をいじる。
0380デフォルトの名無しさん2010/09/24(金) 21:39:31
継承が一応の結果が出たから次は
・カプセル化

まず構造化と比べオブジェクト指向はどう違うか?
0381デフォルトの名無しさん2010/09/24(金) 22:59:25
あるスコープから見える範囲についての決まりを強制する機能が処理系にある。


お  し  ま  い
0382デフォルトの名無しさん2010/09/24(金) 23:10:28
>あるスコープから見える範囲についての決まりを強制する機能が処理系にある。
馬鹿? お前自身が終わっているぞw
0383デフォルトの名無しさん2010/09/24(金) 23:49:24
自説を論証しない馬鹿に馬鹿と言われてもなぁ。
0384デフォルトの名無しさん2010/09/25(土) 00:05:41
カプセル化ねえ…構造体との最大の違いは
要素へのアクセスを「確実に」共通化できる、ってとこじゃないだろうか
構造体だと、どこか1つでも直接アクセスしたら共通化が外れちゃうからね

その恩恵は多人数開発だけじゃない、個人での開発でもある
例えば、あるフィールドをpublicでの直接アクセスから
private+アクセサメソッドに切り替えたくなった時とかね

フィールド代入をメソッド扱いにできる言語なら、利用側はそのままで
宣言/定義の書き換えだけで済むし
そうでない言語でも、フィールドをprivateにしたことで
利用側でアクセサメソッドを通してない部分はコンパイル時に炙り出される
03853562010/09/25(土) 00:11:52
見えない化
見せない化
意識させない化
0386デフォルトの名無しさん2010/09/25(土) 00:13:26
継承や多態性と違ってカプセル化(PrivateやらProtectedやら)は本質的なもんじゃないから
議論する必要ないだろ

お し ま い
0387デフォルトの名無しさん2010/09/25(土) 00:23:32
カプセル化が一番の肝だろ
0388デフォルトの名無しさん2010/09/25(土) 00:30:24
そうだ、カプセル化が一番理解されてないといっても過言でない
0389デフォルトの名無しさん2010/09/25(土) 00:44:09
(゚Д゚)
0390デフォルトの名無しさん2010/09/25(土) 00:47:15
カプセル化がない(もしくは希薄な)OOP言語は無視ですか
0391デフォルトの名無しさん2010/09/25(土) 00:51:12
でも一番重要視されてしかるべきなのはカプセル化だと思うぞ。
継承なんて言ってしまえばただの便利機能だし。

カプセル化は便利とは真逆の、アクセスを制限してしまう不便機能だが
そんなものがなぜプログラムに必要で重宝されるのか、もうちょっと真剣に理解したほうが良い。
0392デフォルトの名無しさん2010/09/25(土) 00:51:21
>>386,390はアクセス修飾だけがカプセル化と思ってるんじゃまいか?
0393デフォルトの名無しさん2010/09/25(土) 01:01:59
カプセル化もバズワード臭いんだよなぁ
単にグループ化を指してる人と
オブジェクトのインターフェースを作る事を重要視してる人と
データを隠蔽する事を重要視している人が居るから
0394デフォルトの名無しさん2010/09/25(土) 01:06:10
全部だ全部、
全部大事なんだよ。

プログラムの宿敵はスパゲッティだ。
全部それを避けるための手法だ。
0395デフォルトの名無しさん2010/09/25(土) 01:21:00
多態が無くなっても
せいぜい要所に型switch入れるぐらいの変更で済むが
カプセル化が無くなると大変酷いことになる。
0396デフォルトの名無しさん2010/09/25(土) 01:50:48
カプセル化が無くなっても
せいぜいクラスを構造体に替えたりアクセサを関数に変えるくらいの変更で済むが
多態が無くなると大変酷いことになる。
0397デフォルトの名無しさん2010/09/25(土) 02:07:46
つまりどちらも不要ということですね
0398デフォルトの名無しさん2010/09/25(土) 02:13:00
俺は最重要は多態と思う、これが無いとコードを根本から直さないといけない。
要所に型switchで代用できるレベルならいいけど、そうとも限らないからな。

次点でカプセル化だな、使い方が解りやすい割に幅広く、便利機能って言葉がぴったり。
無くてもなんとかなるっちゃなるんだが、あって欲しい機能ではある。

継承はたまーに欲しいんだが、普段は多態の一手段でしかないのがなあ。
他の手段で代用できるのなら要らないことも多い。
でも、大きめのライブラリを作る場合にはちょっと欲しいかな。
0399デフォルトの名無しさん2010/09/25(土) 03:55:49
また実装レベルの話に後退したでござる。
0400デフォルトの名無しさん2010/09/25(土) 04:17:04
論文の一本でも引っ張ってこいよ
0401デフォルトの名無しさん2010/09/25(土) 08:09:37
実装の話をしないプログラミング
0402デフォルトの名無しさん2010/09/25(土) 08:24:58
もともとオブジェクトは一種の変数で構造化で言うグローバル変数。
使う側も使われる側も相手を意識しないオブジェクトではグローバルに定義されている。
しかしグローバル変数の弊害が、オブジェクト指向ではあまり聞かれない。
構造化のスコープとオブジェクト指向のカプセル化は考え方の違いがある。
0403デフォルトの名無しさん2010/09/25(土) 08:30:03
グローバルスコープとクラススコープは別物
0404デフォルトの名無しさん2010/09/25(土) 09:27:37
>グローバルスコープとクラススコープは別物
クラスとオブジェクトの区別もつかない奴がいるとは
0405デフォルトの名無しさん2010/09/25(土) 09:35:18
Rubyではクラスもオブジェクトだぞ
0406デフォルトの名無しさん2010/09/25(土) 10:16:56
カプセル化を単なる便利機能とか言ってる時点で何かを履き違えている。
設計の本質は依存関係の整理であって、継承関係の構築じゃない。
0407デフォルトの名無しさん2010/09/25(土) 10:25:33
いるよな、全てのクラスを単一の継承ツリーに収めようとする奴。
あれはOOPやりはじめの熱病みたいなもんかな。
0408デフォルトの名無しさん2010/09/25(土) 11:41:18
>>381
何を「処理系」と言っているのか理解出来ないが
オブジェクト指向はデータに処理が付く、その基本観点が抜けている。
>>384
言っていることは分かるが、じゃなぜ構造化にそのような機能を追加しなかったのか?(追加した言語もあるが)
なぜオブジェクト指向はカプセル化が必要だったのか?そちらも知りたい。
>>386
仮に「本質的なもんじゃない」としよう(本当にそうなのかもしれないが)
だが、オブジェクト指向では必要なものだ。なぜ必要なのか議論してもいいと思うが。
>>390
カプセル化の定義を聞きたい。
>>393
なるほど、カプセル化の結果から考える人はそうなるな。
ここではカプセル化の本質から考えるのがいいと思う。
>>394
勘違いしている「スパゲッティ」は制御文の話だ。データの話ではない。
>>395,396
>カプセル化が無くなると大変酷いことになる。
>多態が無くなると大変酷いことになる。
具体的に? 
マシン語や構造化の時代でもカプセル化・多態性が無くても
それなりの手法はあって「大変酷い」事にはなっていなかったが。
>>406
>設計の本質は依存関係の整理であって、継承関係の構築じゃない。
具体的に? 俺はオブジェクト指向設計の本質は再利用だと思うが。
0409デフォルトの名無しさん2010/09/25(土) 12:18:55
>>408
今のWindowsアプリをマシン語で書けって言われて大変酷い事にならない奴がいたら天才
プログラムの規模が昔のままで良いんなら別にOOPもなくて良い

そして「再利用」はただの差分プログラミングであってOOPとあんま関係ない
0410デフォルトの名無しさん2010/09/25(土) 12:26:05
>>408
>言っていることは分かるが、じゃなぜ構造化にそのような機能を追加しなかったのか?(追加した言語もあるが)
>なぜオブジェクト指向はカプセル化が必要だったのか?そちらも知りたい。

OOPの機能とカプセル化の相性が良かったからでしょ。
カプセル化ってのはデータと処理を一括りにすることなワケで
データと処理を分割している非OOPLでそれをやるのは、新たな要素を追加しなきゃならんが
そもそもデータと処理を一括りにしているOOPLでは何も考えずとも実現できた。
0411デフォルトの名無しさん2010/09/25(土) 14:13:06
>>409
論点がずれている。どう「大変酷い」になるか聞いている。
アセンブラでも構造化でも大規模開発はあって、綺麗なソースも存在した。
君が言う通り「天才」なのかもしれんが...

>そして「再利用」はただの差分プログラミングであってOOPとあんま関係ない
オブジェクト指向で再利用を否定できるのは、まだまだオブジェクト指向の理解が足りないから。

>>410
>カプセル化ってのはデータと処理を一括りにすることなワケ
カプセル化をそう考えるのか、俺はカプセル化=情報隠蔽と考えるから
「データと処理を一括りにする」はカプセル化とは考えていない。
つまり、publicのみにフィールド・メソッドが書かれている場合
カプセル化は適応されていないと考える。

>そもそもデータと処理を一括りにしているOOPLでは何も考えずとも実現できた。
一括りにするだけなら、publicやprivateなど要らない。
オブジェクト指向はpublicやprivateなどの新しい概念を導入している。
0412デフォルトの名無しさん2010/09/25(土) 14:34:50
>>411
どう大変酷くなるか、なんて考えなくてもわかるもんでは?
誰がどのメモリ領域いじってるのか、この機能がどの機能に依存しているのか、
そのあたりを何のツールも使わずに完璧に整理できるならOOPLなど要らないと言ってる。
そしてそれができる奴は天才だし、どんな言語でどんな開発規模でもうまくやってのけるだろう。

OOPにおける再利用は依存関係をうまく整理した上で得られた副次的な物に過ぎない。
逆に言えば、依存関係がうまく整理できたならOOPなど関係なく再利用性の高いコードになる。

「オブジェクト志向」がいったい何を志向しているのかといったら
それは「物事の整理の仕方」に他ならないだろう。つまりカプセル化だ。
0413デフォルトの名無しさん2010/09/25(土) 14:45:54
ここまでオレオレOOP
そしてこれからもオレオレOOP
0414デフォルトの名無しさん2010/09/25(土) 16:14:09
>>411
情報隠蔽は「データと処理を一括りにすること」で生まれる二次的な効果じゃね?
データを扱うために、必ず特定の処理を通させる(つまりデータと処理がセットになる)ことで
情報の隠蔽もなされるワケで。
0415デフォルトの名無しさん2010/09/25(土) 16:42:21
http://scholar.google.co.jp/scholar?q=object-oriented+programming&;hl=ja&lr=
acm のが一番古いっぽいんだが今大学いない一般人なのでむりです
0416デフォルトの名無しさん2010/09/25(土) 17:49:15
> 情報隠蔽は「データと処理を一括りにする
CLOS あたりは クラス は メソッド を抱えていないが…
0417デフォルトの名無しさん2010/09/25(土) 18:56:54
いつもの人だけど、
CLOSの話にもっていきたい人がいるみたいだけど、
多分それ、正解。でもバカどもは食いつかないだろうな。
OOPのObjみたく、自分で情報を遮断して殻に閉じこもってるから。

だから、議論は成り立たないから、天下り的に一言で未来を予言してみせるしかない。
モノに執着した考え方は破滅を招く。
オブジェクト指向?ノンノン
関係指向、関数指向、機能指向、メッセージング指向。
他との関係から導かれる個性こそが、それの性質そのもの。
単体では個性は確立し得ない。
マルチメソッドの無いOOPは全部甘い罠だ。つれてかれるぞ。
0418デフォルトの名無しさん2010/09/25(土) 19:01:18
ノンノン
0419デフォルトの名無しさん2010/09/25(土) 19:12:28
いつもの人はメッセージング指向になったら、コーディングがどう変わるのかまで踏み込んで話してくれよ
いっつも雰囲気でぼんやりした話しかしないからかなり信用できない
0420デフォルトの名無しさん2010/09/25(土) 19:15:39
マルチパラダイムなんだから動けばいいんじゃねーですかね
0421デフォルトの名無しさん2010/09/25(土) 21:31:41
だからC++は一部機能を任意に制限できる仕様にしろって
多重継承とかほとんどいらないし
0422デフォルトの名無しさん2010/09/25(土) 21:43:23
ライブラリの中で多重継承が使われてたらどうすんだよ
0423デフォルトの名無しさん2010/09/25(土) 22:20:36
ラップすればよくね?
0424デフォルトの名無しさん2010/09/25(土) 23:23:39
class ITree{
public : void Parent(ITree* pITree_ ) = 0;
public : void Add(ITree* pITree_ ) = 0;
public : void Remove( ITree* pITree_ ) = 0;
};

class Tree : public ITree {
public : void Parent(ITree* pITree_ ){...}
public : void Add(ITree* pITree_ ){...}
public : void Remove( ITree* pITree_ ){...}
};

class XXTree : public ITree {
private : Tree tree;
public : void Parent(ITree* pITree_ ){ tree.Parent( pITree_ ); }
public : void Add(ITree* pITree_ ){ tree.Add( pITree_ ); }
public : void Remove( ITree* pITree_ ){ tree.Remove( pITree_ ); }

private : XX xx;
public : xx GetXX(){...}
public : void SetXX( XX xx_ ){ xx = xx_; }
}
0425デフォルトの名無しさん2010/09/25(土) 23:24:32
>>416
クラスとメソッドって形ではないけど
データ型によって実際の処理が変わるのだから、データと処理はセットになってると言えないか?
0426デフォルトの名無しさん2010/09/25(土) 23:24:32
●データ構造はツリー型(コンポジット)
●ツリーの操作はITreeで定義
●Treeにて上記インターフェースを実装
●深い継承はしたくない

XXTreeという具体的なデータを持つノードを作成したい。

この場合上記のようにXXTreeを作成すればよいか、
またはTreeを継承して作成したほうが良いのか。

冒頭のXXTreeのつくりの場合、ITreeはTreeとXXTreeで、
別々ではあるが2回継承されている。

包含されるTreeはインターフェースを継承すべきか。

使用目的が明示的になるの継承したほうが良いのか。
パフォーマンスのために継承はしないほうが良いのか。

具体的なデータを持つノードはXX以外にも多数あり、
またそれらはXMLのように互いを子要素として持つこともありえる。

皆様のご意見をいただきたく思います。
0427デフォルトの名無しさん2010/09/25(土) 23:27:14
このスレ、OOPのスレなのに、なんで保守の話はしないんだろう?
0428デフォルトの名無しさん2010/09/25(土) 23:34:39
話題を振ればいい
0429デフォルトの名無しさん2010/09/25(土) 23:47:00
>>426
ツリー構造を管理するデータと、それ以外のデータが、同じ場所にあるのは、
のちの混乱の元にならないだろうか?
ちゃんと分けた方がいいかと。
04304242010/09/26(日) 00:06:18
>>429
レスありがとうございます。
いまいちそこまで考えが至りません。

もしよろしければもう少し具体的にお願いできますでしょうか・・・。
04314292010/09/26(日) 00:21:59
俺が同じアプリを作るなら、
1.ユーザーに提供するデータだけを保持するクラス。
2.1のクラスのインスタンスを集めて、ツリー構造にするクラス。
に、分けるかな。

1はシンプルにして、多様性をだしやすく、
2には色々めんどい事を任せる。

こうしておけば、1は簡単に拡張が出来るし、
後でハッシュ構造に変えたくなった時は、2を取り替えるだけで済む。
0432デフォルトの名無しさん2010/09/26(日) 00:36:35
上の人とは別人だけど。
Tree単体で使うこともあるの?
そうでないならITreeの役割をTreeに移してしまえばいいと思う

また、XXTreeがTreeの子でない、というのは直感的でない
名前だけみたら、TreeがXXTreeの派生クラスだと勘違いする

ITreeはインタフェースなんだから、XXTreeはTree/ITreeを両方継承しても問題無いけど
上の例だと、そもそもTree/XXTree独自のメソッドがないから
クラス階層をわける意義が感じられない

それからvirtualは付けなくて良いんだっけ
最初Javaか何かかと思ったけどC++だよね?
0433デフォルトの名無しさん2010/09/26(日) 00:44:41
下手な設計するよりはS式で持っといた方がいい
とりあえずLISPで検証できる
0434デフォルトの名無しさん2010/09/26(日) 00:54:48
要素がVariantであるN木で持つのと同じじゃん
0435デフォルトの名無しさん2010/09/26(日) 01:02:50
データ構造なんて配列とおなじじゃん?
0436デフォルトの名無しさん2010/09/26(日) 01:03:04
考えるべき順番が全く違うんだよ
データ構造を定義する前にまず何をすんの?から始めないと
それが決まらんうちはXMLでもS式でもVariantでもDBでも使っとけばいいよ
0437デフォルトの名無しさん2010/09/26(日) 01:06:22
そんなこといってたら、まず、プログラミングする必要があるのか?とかに発展してく。
最初から設定された問題の中で話をすればいいのに。
0438デフォルトの名無しさん2010/09/26(日) 01:15:55
>>436
>>426はもうやりたい事は決まってるでしょ。
ツリー構造を使う必要があったり、データの多様性を出そうとしたりしてるし。
0439デフォルトの名無しさん2010/09/26(日) 01:35:31
だからそれ作って何すんの
構造を眺めるだけですか
0440デフォルトの名無しさん2010/09/26(日) 01:40:08
そうです
0441デフォルトの名無しさん2010/09/26(日) 02:27:27
見る化
0442デフォルトの名無しさん2010/09/26(日) 09:03:05
>>412
なるほど、カプセル化を「物事の整理の仕方」と考えているのか。
何件か質問させてもらう。
>誰がどのメモリ領域いじってるのか、この機能がどの機能に依存しているのか、
「誰がどのメモリ領域いじってるのか」と「誰がどのメソッド(Setter)いじってるのか」での違いは?
構造化でもサブルーチン・ローカル変数など制限できるがオブジェクト指向と何が違う?

>「オブジェクト志向」がいったい何を志向しているのかといったら
>それは「物事の整理の仕方」に他ならないだろう。つまりカプセル化だ。
「オブジェクト志向」=「物事の整理の仕方」=「プセル化」と考えているようだが
それは概念か、それとも方法諭か 実装もかみしているのか?

>>414
>データを扱うために、必ず特定の処理を通させる(つまりデータと処理がセットになる)ことで
>情報の隠蔽もなされるワケで。
その「特定の処理を通させる」は何の目的の為に行なうのか?、具体的に書いてくれ。
俺の考えでは「フィールドの情報隠蔽の為に、”特定の処理を通させ”るカプセル化を適用している」のよう考える。
「データと処理を一括りにすること」は手段だと考えるが、目的と考えているのか?そのメリットは?
まっ、メリットを書いてもらうとそれが目的だとなるが。
0443デフォルトの名無しさん2010/09/26(日) 09:42:25
>>442
このメソッドを呼ぶときは事前にあっちのメソッドが呼ばれてないといけないとか
誰それがこういう状態を構築してなきゃ、このメソッドは成功しないとか
引数にはこれを生成して渡さなきゃいけないとか
この変数はこいつもいじってるから勝手に触っちゃダメとか

そういう膨大な依存関係が出来上がるだろう
これは開発規模が大きくなれば指数関数的に複雑になっていく。
ドキュメントちゃんと書けば済むじゃんと言われればそうだが
こういう依存関係に依存したバグが一旦出てしまったら捜索は厄介になりがちだ。

もちろん天才なら構造化だけの整理手法でもかなり対応できるとおもう。
でも、コードをオブジェクト単位でまとめると、さらに関係が整理しやすくなる、と。
0444デフォルトの名無しさん2010/09/26(日) 10:45:05
おまえらカプセル化って言葉じゃ
ぼやけたイメージしか出てこないみたいだから
MVCのMの範囲とかで考えた方がいいよ
何のためにそんなことするのか
0445デフォルトの名無しさん2010/09/26(日) 13:00:12
>>444
そんな事したらもっとぼやけるっていう。
てかカプセル化って、モジュール化をもっと使いやすくしたものなんだけどな。
0446デフォルトの名無しさん2010/09/26(日) 13:01:59
単に、>>442も視点が違うだけでそんなに外したことを言ってない気もするが、
俺はどちらかというと、「依存関係の整理を支援するために、OOP言語の機能がある」
という>>443の説明の方が説得的だな。>>436とは違う意味だが、何をするのかが
決まらなければ、最適な言語機能を論ずることもできない。

もちろん、これは歴史的にどうだったかとか、アラン・ケイの意見がどうかというのとは
別の話な。
0447デフォルトの名無しさん2010/09/26(日) 13:13:56
まともに色々と文献にあたった人でも「やっぱ正確な定義なんてどうでもいいや」ってなる厄介なtermらしいな>カプセル化
だからこそこのネタで盛り上ることができるわけだが
0448デフォルトの名無しさん2010/09/26(日) 13:27:57
そりゃ、「何に対して」情報を隠蔽するのかが明らかでなければ定義なんてできないわな。
0449デフォルトの名無しさん2010/09/26(日) 13:29:15
>>447
正確な定義はなくても、目的はモジュール化なのは確実だから、まだマシだよね。
0450デフォルトの名無しさん2010/09/26(日) 13:29:48
wikiとかでわかる範囲で調べた
データにメソッドをくっつけたもの派?(Booch,Thomas M. Connolly, Wm. Paul Rogers)
Encapsulation is not information hiding
ttp://www.javaworld.com/javaworld/jw-05-2001/jw-0518-encapsulation.html?page=9

アクセス権派?(John C. Mitchell,Pierce, Benjamin)

メリット
どっかいじっても他の場所に影響がないか小さい領域にとどまる
よくわからない依存関係を、インタフェースなどに明示し、実装から分離

他にもAbstract Data TypeやModuleにも同様の考え方がある。
どのタイプも、数学的には存在型というコンセプトがベース
0451デフォルトの名無しさん2010/09/26(日) 13:31:39
そもそもカプセル化って原典は何なんだ
0452デフォルトの名無しさん2010/09/26(日) 13:35:32
450だけど、wikipediaにはBoochの定義が一番よく使われてるようなことが書いてたよ
でもこれはコンピュータサイエンスでの定義でOOPには限らないもののよう
the process of compartmentalizing the elements of an abstraction that constitute its structure and behavior;
encapsulation serves to separate the contractual interface of an abstraction and its implementation.
0453デフォルトの名無しさん2010/09/26(日) 13:39:01
補足だけど、ブーチはUMLの人で、ヤコブソン、ランボーとともに3アミーゴとしてOOの世界では有名な人ね
0454デフォルトの名無しさん2010/09/26(日) 13:52:01
確かに、欧米では既に常識となってる考え方が、日本だと全然普及してないってことはままあるからなぁ。
0455デフォルトの名無しさん2010/09/26(日) 14:09:04
俺的には、カプセル化は内部データの外部への直接アクセスを禁止して
代わりにメソッドを用意し、内部的不整合な設定を起こさないようにするという理解。

例えば
・0〜2までが設定可能なときにそれ以外の値が渡されたときに回避または例外発生
・2つの内部状態が連動して変化する関係の場合にメソッドが整合性を保って処理する
みたいに

特に2番目がないと使う側が考えることが増える。
アクセス制限もコードを読む上で無視できる目印になる。
0456デフォルトの名無しさん2010/09/26(日) 14:12:03
カプセル化って、オブジェクトの内部状態が有効でない瞬間を他者に見せないしくみの事じゃねーの
■ このスレッドは過去ログ倉庫に格納されています