オブジェクト指向の先には一体何があるんですか?at TECH
オブジェクト指向の先には一体何があるんですか? - 暇つぶし2ch237:デフォルトの名無しさん
10/03/20 20:46:16
>>236
じゃあ、なんのためにやるの?
成果を数字で表してくんない?

238:デフォルトの名無しさん
10/03/20 21:05:38
>>237
なかなかきちんとまとまった説明はないけど、例えばこれとか参考になるんじゃないかな。
URLリンク(itpro.nikkeibp.co.jp)

要求の変化に伴う保守性や再利用性、なんてのはなかなか数値化できんわな。

個人的な経験から言えば、OOの基本的な概念を軽く押さえたら、
次はデザインパターンの勉強をするのが理解の早道だと思う。

239:デフォルトの名無しさん
10/03/21 00:16:39
>>237
まぁ、グローバル変数をオブジェクトに押し込んでみました、ってだけの技術やからね…
成果なんて出ないと思うよ


240:デフォルトの名無しさん
10/03/21 00:45:10
>>239が何を言っているのか分からない

241:デフォルトの名無しさん
10/03/21 00:45:57
わかんないんです(><)

242:デフォルトの名無しさん
10/03/21 00:46:32
>>238
結局、何が言いたいのかまったくわからない
自分の言葉で単刀直入に結論から言ってよ

243:デフォルトの名無しさん
10/03/21 01:18:48
>>242
俺の理解では、

オブジェクト指向の目的:
・複雑な要件を「まとまり」単位で整理することで、人間の手に負えるようにする
・「まとまり」同士を疎結合に保つことで、要求の変化に柔軟に対応できるようにする
(・多人数開発において、個々のコードの影響範囲を限定することでバグの作りこみを減らす)

「まとまり」につく名前は「オブジェクト」だったり、そうでなかったりするけど、基本は同じ。

244:デフォルトの名無しさん
10/03/21 02:11:13
>>243
つまり数字ではでてこないのね
気がするだけレベルなのがな

245:デフォルトの名無しさん
10/03/21 02:33:13
>>244
どういう種類の数字?

こうした原則に則って粛々とやっていけば、目に見えて保守しやすいコードがアウトプットできるし、
仕様変更に伴う工数も大幅に短縮できるはずだが。

つうか、見ての通り、きちんとコーディングする上でごくごく当たり前の方法論でしかないわけで、
『「工数○○日短縮」って数字で示されないとやる気が起きない』とかいう話になること自体が不思議。

246:デフォルトの名無しさん
10/03/21 02:41:06
>>245
>仕様変更に伴う工数も大幅に短縮できるはずだが。
だったら数字をだせよ

247:デフォルトの名無しさん
10/03/21 02:43:21
>>245
逆に考えよう
それが自分のただの思い込みだったら?
ぶっちゃけC++とC言語とで比べてまったく同じ処理をするソースを書いたことないでしょ?

248:デフォルトの名無しさん
10/03/21 02:56:25
>>246
そりゃ、書いてるコードや仕様変更の内容による。

>>247
異なる言語で同じ処理を「試しに」書けてしまうような規模の開発でやったら、
そりゃ、「効果が薄いわりに冗長なコーディングを強要される」と感じるに決まっている。

個人的な経験で言えば、数千NCSS程度のコードでも、こういうことをきちんとやるだけで
保守性にかなり差が出てくると思う。

249:デフォルトの名無しさん
10/03/21 03:01:26
>>248
>保守性にかなり差が出てくると思う。
「思う」以上のこと言えないよね?

250:デフォルトの名無しさん
10/03/21 03:03:51
>>249
実体験と書いてあるわけだが。

251:デフォルトの名無しさん
10/03/21 03:05:24
>>250
だったら「思う」じゃなくて事実を書けばいいじゃん

252:デフォルトの名無しさん
10/03/21 03:11:45
>>251
揚げ足取りがやりたいならよそでやってくれ。

253:デフォルトの名無しさん
10/03/21 03:19:46
>>252
どこが上げ足とってんだよw

工数を大幅に短縮できるっていうからそれはどうして?って聞いてるのに
これこれこういう理由で具体的にこう減らせる
って話をしなきゃいけないのに「思う」とかそんなあいまいなレスつけるからだろ
知らなきゃレスしなきゃいいだろ

254:デフォルトの名無しさん
10/03/21 03:28:33
>>253
実体験に基づいて、実際にオブジェクト指向を採用することによる効果が出てくるコード規模について、
推測を交えて話したら、君の中では俺が全てについて憶測で話していることになるの?

255:デフォルトの名無しさん
10/03/21 04:15:50
>>254
だから知らないなら無理してレスしなくていいって
別に俺の問題に対する答えをもってるわけじゃないんでしょ?

256:デフォルトの名無しさん
10/03/21 04:30:53
>>255
えーっと、君の問題って何だっけ?

257:デフォルトの名無しさん
10/03/21 04:31:57
>>255
一人でコード書くなら差はあまり感じられないかもしれない

オブジェクト指向は、クラスのカプセル化と
小規模なクラス群からの継承やコンポジションで開発を進めていく
クラス型の選択で仕様変更を楽にできるメリットや
複数人で開発するにあたり、機能を細かく開発したり、拡張部分を楽に開発可能だし
カプセル可により、他人が安全に機能を運用できるメリットもある

特筆すべきなのは、直感的にソースがよめるため可読性が高くなること
部品を集めて組み立てるかのように、機能の選択で構築するから分かりやすい

言い換えると、中途半端なオブジェクト指向が一番読みづらい
スパゲティコードとなんら変わらないものになる

258:デフォルトの名無しさん
10/03/21 04:39:17
>>257
だから具体的な答えをもってないのになんでレスするの?
無理しなくていいよ

259:デフォルトの名無しさん
10/03/21 04:44:18
>>258
可読性の向上や、想定していない使用方法からくるバグとデバッグ時間
コードの修正による再コンパイル時間
諸々の理由からくる余計な時間が省けるだけ

元より開発能力の高い人だけの少人数開発で
再開発しない単発の開発なら
おそらく工数は変わらないか
余計な時間がかかるかもしれない

まあ本当に開発能力が高いなら微々たる時間だろうけど

260:デフォルトの名無しさん
10/03/21 04:52:08
>>259
>可読性の向上や、想定していない使用方法からくるバグとデバッグ時間
向上してるかどうかなんてわかんないんでしょ?

261:デフォルトの名無しさん
10/03/21 04:52:22
>>258
お前の言っている数値ってなんだ?
基準は相対基準か絶対基準か?

工数は普通相対基準で計るもの
相手が工数が減ったと言っているから充分だが

相手に、何の数値を求めている?
何も分かっていないで言ってないか?
お前馬鹿だろう

262:デフォルトの名無しさん
10/03/21 04:59:09
>>261
あー、わからないならレスしなくていいって
そこからいってなにをすれば証明にいたるのかわからない奴相手にしたくないから

263:デフォルトの名無しさん
10/03/21 05:00:16
>>260
可読性がってこと?
まあそうだね
数値化はできないな

だけど、開発規模がでかくなればでかくなるほど
自分が作成していないコードが増えることになる
そのとき、ヘッダ名(クラス名)と
外部に公開されたメソッド(publicなメンバ関数名)さえ分かれば
何をする部品なのかすぐわかる

コメント残せばいいじゃんと思うかもしれないが
他人が作ったコードと、他人が書いたコメントが一致してるかどうかなんてはっきりいって信用できん

後はUMLの設計図、クラス図さえあれば
どのクラスと関係を持ってるのかがわかればより早いよ

264:デフォルトの名無しさん
10/03/21 05:04:00
>>263
ごちゃごちゃ無駄なこと書いてるけど結局可読性が上がってる云々とは関係ないじゃないか
だからわからないのに無理してレスするなよ

265:デフォルトの名無しさん
10/03/21 05:06:40
>>264
ひとつひとつのメソッドを全て読むのと、名前だけの確認で終わるのどっちが早いのかはわからない?

266:デフォルトの名無しさん
10/03/21 05:11:03
>>265
なんで全然関係ない話をするの?

267:デフォルトの名無しさん
10/03/21 05:13:17
>>266
可読性の話の続きなんだが

268:デフォルトの名無しさん
10/03/21 05:14:33
もしかして、プログラミングしたことないのか?
理屈だけで覚えようとしてるなら用語もわからないかもしれないな

269:デフォルトの名無しさん
10/03/21 05:17:44
>>267
それがC言語からC++に変わって(オブジェクト指向という意味で)のメリットなの?
君、自分がまったく関係ない話してるの気がついてる?

270:デフォルトの名無しさん
10/03/21 05:19:25
人には具体的な答えを求めて
自分は片言の日本語でやりとり
一つでもおかしな点があると思い込んだら全否定
質問して知識の物乞いしてんのに殿様気取り
普通ならぶん殴られてもおかしくないから直せよ

271:デフォルトの名無しさん
10/03/21 05:21:12
>>270
だから別に知らないならレスしなくていいって言ってるじゃん

272:デフォルトの名無しさん
10/03/21 05:35:05
>>269
外部にみせていいメソッドだけ公開できるのはC++からだろ
カプセル化ができないと全てのメソッドを公開しないといけない
だから全部読むはめになる
どこもずれていない

あといつからCとC++の話になった?
構造指向とオブジェクト指向は両極にある概念じゃない
C++の概念はCの概念を内包する
Cの考え方はわかっているのだろ?
それならオブジェクト指向が延長線上にあるのもわかっているはず
わからないなら、アセンブラからCに変わって発達した
構造化プログラミングのメリットを269なりに述べてみ

あと、はっきり言って認めた部分もあるだろ
理屈がわかるならわかっているはずだ
そうでなければただの荒らし
もうレスは返さない

273:256
10/03/21 05:43:24
>>257
代わりに答えてくれてありがとう。
どうも、彼は単に自分の知らない概念を全否定したいだけの人だったみたいだね。
時間を無駄にしてしまった。

274:デフォルトの名無しさん
10/03/21 05:46:36
あと開発速度でいえば、CとC++なら二分の一以下になる
コンテナ操作が標準であるし、templateで静的動作(コンパイル時動作)が可能になる
煩雑な型の作成すら汎用化できるため
今まで個別に作っていたクラスを一つのファイルで書ける

正直、これは説明しようにも長くなりすぎるから割愛する

275:デフォルトの名無しさん
10/03/21 05:47:26
>>272-273
なんでさっきから知らないのに無理やりレスするの?
いいって言ってるのに押し付けるのやめてよ

276:デフォルトの名無しさん
10/03/21 05:48:16
>>273
はっきり言えば、あなたの言い方が
多分オブジェクト指向を理解していると言いづらかったから横槍いれたんです
もっと勉強してください

277:デフォルトの名無しさん
10/03/21 05:50:10
>>276
そんなこといって結局メリットに関してなんも具体的な説明できないじゃん
だから知らないならレスしなくていいって言ってたのにやけにつっかかるなぁ

278:デフォルトの名無しさん
10/03/21 06:00:07
>>277
再コンパイル時間については?
可読性の向上については?
反論ないようだね

これ以上レスしないから安心していいよ

悪質なあなたの反論を掻い潜ることができたと言うことは
私の理屈は間違いないということだ
なお続けようとするあなたに同情すらしてやらないよ
理論もプログラミングも私より劣っている人に説明できて
理解を簡潔にまとめることができた

279:デフォルトの名無しさん
10/03/21 06:26:18
>>278
あれが具体的?
頭おかしいんじゃないか?
工数はいくつ減らせるの?
普段仕事してて1hだって根拠を求められるのに
なんで言語に対してはそういい加減なの?

ちょっとわけありでいい加減なことやってる場合じゃないから
あなたみたいな人普通に邪魔なんだけど

280:デフォルトの名無しさん
10/03/21 06:30:10
それと何度もいうけど
知らないなら無理やりレスするのやめてもらえます?
まったく同じ仕様のものをC言語とC++とで比較した経験すらおそらくあなたないですよね?

281:デフォルトの名無しさん
10/03/21 06:33:43
>>280
知らないならレスしなくていいよ

282:デフォルトの名無しさん
10/03/21 06:45:02
>>279
工数?
1/2以下

283:デフォルトの名無しさん
10/03/21 11:11:28
一つの単位で機能を管理・提供できる点がoopじゃないのん。
cのstructじゃ処理(関数)を外側で指定(関数ポインタへの代入)しなくちゃならないんだし。

waveのinとoutの低レベルな関数はcでべた書きで用意して、
waveファイル, waveinストリーム, waveoutストリームってな感じで、
簡単に扱えるようにしたclassはc++で用意してってやると、
利便性も拡張性も供給できて、高レベルも低レベルも両方同じコードで提供できる。

詰まる所、需要と供給の話程度かと。

284:デフォルトの名無しさん
10/03/21 13:37:34
>>279
まぁ、貴方のように、既にデスマってしまった人を救済する銀の弾丸ではないかもね。
そもそも、そういう事態に陥らないための方法論がオブジェクト指向。

あるいは、レガシーコードをどうにかしたいって話だったら、こういう本を読んでみると良いんじゃないかな。
URLリンク(www.amazon.co.jp)
URLリンク(www.amazon.co.jp)

285:デフォルトの名無しさん
10/03/21 23:42:59
>>283
てか「処理」と「データ」をオブジェクトの名の下に一元管理できるのは大きな要素だと思う

286:デフォルトの名無しさん
10/03/22 16:33:30
>>285
処理とデータを関連づけるのはいいが
一緒にするのはダメなオブジェクト指向の典型だ

287:デフォルトの名無しさん
10/03/22 17:03:59
>>286
おまえ、手続き抽象ぐらいは理解した上で書いているのか?

288:デフォルトの名無しさん
10/03/22 17:57:47
>>287
否定してるわけじゃない
インターフェースとデータは分けて管理するのは当然だろ

289:デフォルトの名無しさん
10/03/22 18:56:51
>>288
それって細かい実装技術でしょ?
それが設計にまで影響しちゃうのってないじゃん
なんかこのスレに相応しくない話してない?
インターフェースクラスが本質の設計に影響を与えるのってないでしょ?

290:デフォルトの名無しさん
10/03/22 18:57:49
インターフェースクラス??

291:デフォルトの名無しさん
10/03/22 19:05:19
>>290
どっちでもいっしょでしょ?

292:デフォルトの名無しさん
10/03/22 19:06:11
>>291
え?w 何と何が?w

293:デフォルトの名無しさん
10/03/22 19:06:42
>>292
上げ足取りたくてレスしたの?
死ねよ

294:デフォルトの名無しさん
10/03/22 19:09:19
>>293
どうせ二行費やすなら>>292答えろよw

とかいいつつゴメンね、ぐぐったら"インターフェースクラス"なるものの正体が分かったわ。

295:デフォルトの名無しさん
10/03/22 19:10:19
>>294
まあ、インターフェースが設計に影響与えるのはおかしいでそ?
なのでこの話はここでおしまい

296:デフォルトの名無しさん
10/03/22 19:13:58
>>295
なんか誤解していたら申し訳ないので伝えておく。
俺がここまでにレスしたのは>>290 >>292 >> 294だけ。
「インターフェースクラス」っていう謎の用語に怯えただけ。

話の続きは>>288さんとでもやってんろ。

297:デフォルトの名無しさん
10/03/22 20:37:29
>>295
だいたいの設計には必要無いかもな

でもひとつのデータに複数種類のアクセス方法(インターフェース)が必要な場合どうする
まさか一つのクラスにまとめるわけないだろ

インターフェースの管理についても設計すべき時なんてプログラムやってたらいくらでもあるだろ

298:デフォルトの名無しさん
10/03/22 20:38:36
>>297
ないよ
ないから君の話にはこれ以外のレスしない
おわり

299:デフォルトの名無しさん
10/03/22 20:39:12
そんなに実例みたくばboost読んでみろよ

300:デフォルトの名無しさん
10/03/22 20:41:30
boostのインターフェース設計がまさか設計無しに作られてるとか低能な言い訳しないでね

301:デフォルトの名無しさん
10/03/22 20:44:55
ごめん
Cがどうとか言ってた基地外か
boost読めないから無理だったね

302:デフォルトの名無しさん
10/03/22 22:51:31
あたかもboostがいいようにいうけどまったくいいことないと思うよ

303:デフォルトの名無しさん
10/03/23 01:29:06
いい悪いの話ではない
話題をそらすなよ

304:デフォルトの名無しさん
10/03/23 01:34:20
>>297
javaだとインターフェースクラスを直接作れるね
C++だと、メンバ変数のない純粋仮想関数だけのクラスだと思えばよし

305:デフォルトの名無しさん
10/03/25 01:10:49
マルチエージェント指向

306:デフォルトの名無しさん
10/03/27 01:07:56
>>303
なら、boostはどんな説明をするために話題に出したの?
こんなのオブジェクト設計なんてしてねーただのオナニーライブラリじゃん

307:デフォルトの名無しさん
10/03/27 15:22:24
>>306
論派したいんだろうけど、話題反らしたり無知披露したりで屑認定されてるよ

308:デフォルトの名無しさん
10/03/27 15:34:49
>>306
頭悪いんですね…

309:デフォルトの名無しさん
10/03/27 18:14:44
オブジェクト指向?なにそれ、おいしいの?
オブジェクトなんて構造体でしょ?なんでそんなに有り難がる必要があるだろう
ましてや構造体でシステム設計とか意味不明


310:デフォルトの名無しさん
10/03/28 01:59:40
>>309
勉強して批判しようね屑

311:デフォルトの名無しさん
10/03/28 13:46:27
熟練のプログラマって意外とオブジェクト指向で作らないんだよね。
考えが古いのかな?
実はあまり必要ないとか?

312:デフォルトの名無しさん
10/03/28 14:05:40
>>311
意味ねーし
オブジェクト指向になって具体的にいいことって出せる奴いねーもん

313:デフォルトの名無しさん
10/03/28 14:12:51
>>312
Stringクラスも不要?

314:デフォルトの名無しさん
10/03/28 14:17:16
>>313
仮に似たような機能C言語で作ったらいらないな

315:デフォルトの名無しさん
10/03/28 14:25:46
>>314
文字列の長さ順にソートするような場合どうする?
strlenを毎回呼ぶつもり?

316:デフォルトの名無しさん
10/03/28 15:15:18
>>315
それはC++でないと作れない機能ですか?
ってことだな
同じ労力だと思うぜ

317:デフォルトの名無しさん
10/03/28 15:47:16
>>316
ってことだな? 思うぜ?

>>315に具体的に答えることは不可能?
「仮に似たような機能C言語で作ったら」と言ってたのに。

318:デフォルトの名無しさん
10/03/28 15:52:23
>>317
は?
それって何か問題あるの?
っていうか話の主旨をどこにしたいの?
俺は別にライブラリの出来不出来の話をしたいわけじゃないんだけど?

319:デフォルトの名無しさん
10/03/28 15:53:45
>>318
ライブラリの出来不出来の話などするつもりはない。

320:デフォルトの名無しさん
10/03/28 15:55:30
>>319
じゃ、何が言いたいんだよ
さっきから

321:デフォルトの名無しさん
10/03/28 15:56:47
>>320
「文字列の長さ順にソートするような場合どうする?
strlenを毎回呼ぶつもり?」

322:デフォルトの名無しさん
10/03/28 16:16:25
stringクラスと、そのsize()メソッドがあるから、
そのインスタンスsに対しs.size()とサイズを取得できる。

char *に対してはstrlenを毎回呼び出す必要があるか、
呼び出さないためには値をキャッシュする変数を別途用意する必要があり、
それらの生成破棄など、管理する手間が別途発生してしまう。
また、キャッシュのための変数の中身は、
strlenの結果と同一であるように注意を払う必要も出てしまう。
これは非常に煩わしい。

一方、stringクラスのsize()メソッドを使う場合は、
サイズの再計測もさせないように実装しうるし、
それゆえ、別途キャッシュするような変数も、
その変数との同一性への心配も不要になる。

オブジェクト指向になって具体的にいいことのひとつだと思う。

323:デフォルトの名無しさん
10/03/28 17:02:42
>>322
っていうC言語の関数を用意したら?
でお仕舞いな話を出されてもねw

324:デフォルトの名無しさん
10/03/28 17:16:18
>>323
そんな手間をかけるくらいなら、
俺はstring#sizeを使って単に、
bool sizegreater(const std::string &a, const std::string &b) {
return a.size() > b.size();
}
こう書いて、sort(v.begin(), v.end(), sizegreater);に渡す。

> っていうC言語の関

ご苦労様ですw

325:デフォルトの名無しさん
10/03/28 17:18:23
>>324
だから君が言ってるのはライブラリの有無の話でしょ?
最近、こんな馬鹿が金もらってプログラム組んでるからな

326:デフォルトの名無しさん
10/03/28 17:20:11
#include <string>
#include <vector>
bool sizegreater(const std::string &a, const std::string &b) {
return a.size() > b.size();
}
int main() {
using namespace std;
vector<string> v;
sort(v.begin(), v.end(), sizegreater);
return 0;
}
毎回strlenを呼ばずにCで同等のことをするのは大変。
大変じゃないというのならサクッと示してほしいところ。

327:デフォルトの名無しさん
10/03/28 17:21:37
>>326
>毎回strlenを呼ばずにCで同等のことをするのは大変
大変(笑)

328:デフォルトの名無しさん
10/03/28 17:22:30
>>325
すでに>>322で書いたように、stringに対してs.size()が呼べるからこそ、
>>315の問題の部分は、return a.size() > b.size(); と書ける。

オブジェクト指向じゃないとこうならない。

329:デフォルトの名無しさん
10/03/28 17:25:55
>>328
バーカw
しゃべるたびに頭になにも入ってないのがバレバレだなw

330:デフォルトの名無しさん
10/03/28 17:26:39
オブジェクト指向不要論みたいなのを掲げて煽ってるヤツって釣りじゃねーの?
本当に不要とか思ってるのなら単なる馬鹿で相手にするだけ時間の無駄だと思うんだが。

331:デフォルトの名無しさん
10/03/28 17:27:57
文字列の長さでソートする時、strlenを毎回呼び出さないですむ方法が、
Cでスマートに表現できるのなら俺は>>329をバカと呼んだりはしないよ。

332:デフォルトの名無しさん
10/03/28 17:28:06
指摘するほうもオブジェクト指向と全然関係ないところをあげて
サブルーチン単位の細かいことしか挙げないのはどうしてなの?
はじめのオブジェクト指向にテンプレートなんて入ってなかったでしょ?

333:デフォルトの名無しさん
10/03/28 17:30:39
>>331
は?意味がわからない
仮に構造体をもって

typedef struct{
  char *str;
  int size;
}MYSTR;

ってやって毎回strlenを呼び出さなくていい状態にしたときに
それは君のいう「毎回」の定義に入ってるの?入ってないの?
前提がスカスカすぎて答えられないんだよバーカ

こんなことも想像できねーのか?

334:ああ
10/03/28 17:32:23
同意 
URLリンク(d47.decoo.jp)

335:デフォルトの名無しさん
10/03/28 17:33:33
>>333
ほら、そうなる。

>>322
> 呼び出さないためには値をキャッシュする変数を別途用意する必要があり、
> それらの生成破棄など、管理する手間が別途発生してしまう。
> また、キャッシュのための変数の中身は、
> strlenの結果と同一であるように注意を払う必要も出てしまう。

別途に構造体や変数を用意したり使いまわしたりすることなく、
typedef structのsizeを隠し、
サイズ取得へのインタフェースをsize()と*ひとつだけ*用意したのがオブジェクト指向だ。

336:デフォルトの名無しさん
10/03/28 17:36:10
>>335
はぁ?
だからC++の場合ライブラリとしてStringが用意されてるのは認めて
C言語ではライブラリの類を認めないってのはどういう理論なの?
Stringはライブラリでしょ?
C言語で俺が書いたMYSTRがそれに当たるんでしょ?

337:デフォルトの名無しさん
10/03/28 17:38:13
それとこの辺ってオブジェクト指向関係ないじゃん
なんでこんなサブルーチン出してオブジェクト指向云々の説明をしようとするの?
できっこないじゃない

338:デフォルトの名無しさん
10/03/28 17:38:54
データ抽象がオブジェクト指向だっていうならCだって
オブジェクト指向プログラミングできるだろう

>>335 みたいなバカが多いんだよね
オブジェクト指向脳の連中って



339:デフォルトの名無しさん
10/03/28 17:40:48
これはさすがに会話続行不能なレベルだよね
ライブラリと言語仕様と設計の区別もついてない

文字列クラス出してなんでオブジェクト指向の説明になるの?

仕事でもすごいトンチンカンなことやってそう

340:デフォルトの名無しさん
10/03/28 17:44:12
>>336
> また、キャッシュのための変数の中身は、
> strlenの結果と同一であるように注意を払う必要も出てしまう。

カプセル化を用いるからこそ、size()のみが提供され、
typedef struct{
  char *str;
  int size;
}MYSTR;
streln(str)とsizeの値の整合性を気にする必要がなくなる。

>>337 カプセル化はなんの話題かな?
>>338 Cでオブジェクト指向プログラミングできるか否かについては言及していない。
>>339 カプセル化はオブジェクト指向ならではだろう?

341:デフォルトの名無しさん
10/03/28 17:49:12
別に文字列クラスでオブジェクト指向を説明することについては間違ってないと思うが。
つうか、オブジェクト指向を理解しようとしない奴には何を言っても無駄だろう。
「なぜクラスをインスタンス化する必要があるのか」ってのをよく自分で考えてみたらどうなの。
いちいち説明しないとわからんなら発言すんなよ、って言いたいね。

342:デフォルトの名無しさん
10/03/28 17:50:17
>>340
なんでそうやって小手先の技にこだわるの?
オブジェクト指向設計の話をしてよ

343:デフォルトの名無しさん
10/03/28 17:53:12
>>342
オブジェクト指向設計??
その話をするのはまだ早いとおもう。
今はまだCと比較できる部分のほうがいいかと。

344:デフォルトの名無しさん
10/03/28 17:54:21
>>341
なんで仕様書がないサブルーチンなんかでオブジェクト指向の話ができるの?
理解してないのは君のほうなんじゃないの?
だから文字列クラスでオブジェクト指向の話ができるなんていっちゃうんじゃないの?
できないよ

345:デフォルトの名無しさん
10/03/28 18:03:27
文字列に関連したオブジェクト指向のメリット
* 色々なエンコーディングの文字列を統一的に扱うことができる。
* 色々なエンコーディングの生文字列と、UNICODE等の内部表現の文字列を統一的に扱うことができる。
* 色々なエンコーディングの文字列間の比較やソートなどを簡単におこなうことができる。
などなど。
こんな簡単なことに気付きもしない生半可な知識でオブジェクト指向を否定するのって、
ほんとうに愚かで馬鹿馬鹿しいことだと思うのだが、どうよ?

346:デフォルトの名無しさん
10/03/28 18:15:52
>>345
彼らはカプセル化すら分かってないから…。
内部表現丸出しでも平気らしいし。

347:デフォルトの名無しさん
10/03/28 18:17:17
初心者w

348:デフォルトの名無しさん
10/03/28 18:29:11
>>315
オブジェクト指向をまったく知らない者ですが。質問です。
ファイルから一行文字列が読み込まれ新しいstringインスタンスが
生成されるとすると、その度にsetof()が実行され属性sizeにsetof()の結果が
セットされるのですか?
そうなら分かるのですが、そうではないとするとsetof()でstrlen()でも
大差ないような気がするのですが。

349:デフォルトの名無しさん
10/03/28 19:08:36
>>345
それオブジェクト指向のメリットなのー?(爆笑)

350:デフォルトの名無しさん
10/03/28 19:24:02
追い詰められたカスの特徴w 理屈で返事しないw

351:デフォルトの名無しさん
10/03/28 19:34:49
はぁ?文字列クラスなんて意味のねーものいじってねぇで
オブジェクト指向設計の説明してみせろよ
なんで文字列クラスなんだよバッカじゃねーのw

352:デフォルトの名無しさん
10/03/28 19:35:46
追い詰められたカスの特徴w 理屈で返事しないw

353:デフォルトの名無しさん
10/03/28 19:40:26
ソースが読みやすくて綺麗になる

354:デフォルトの名無しさん
10/03/28 20:13:07
知識レベルが近ければオブジェクト志向もチームでやるには有効なケースはあるが、
揃ってないなら捨てた方が吉。中途半端な知識の奴とか覚えたてのニワカがいる場合も
クラス設計そのものがスパゲティになるから排除した方が良いw

355:デフォルトの名無しさん
10/03/28 20:26:42
知識レベルが低い奴が書いたコードは
オブジェクト指向であろうがなかろうが
スパゲッティーだっつーの

356:デフォルトの名無しさん
10/03/28 20:41:34
あと、オブジェクト指向じゃないとデバッグやりにくい
バグが起きないと保障されている場所もチェックして行かないといけない

357:デフォルトの名無しさん
10/03/28 21:10:36
>>355
高い低いの問題じゃない。ぶっちゃけ一人だけ知識深い奴がいても、そいつのコードは周りから見れば
さっぱり、なんてことは良くある。

358:デフォルトの名無しさん
10/03/28 22:14:51
だいたい自分のコードが見やすいかどうかなんて誰か1人にでも聞いたことあるのか?w

359:デフォルトの名無しさん
10/03/28 22:17:46
複数開発なら普通にあるだろ。「見やすい?」とかじゃなくて「わかる?」とかだと思うがw

360:デフォルトの名無しさん
10/03/28 22:22:39
オブジェクト指向的な考え方は、メンテしやすいソフトウェアを書く上では
今や教養として必須だと思うけどな。是非を問う段階はとうに通り過ぎてる。

まぁ、一口にオブジェクト指向といっても、切り口によって色々な解釈があるみたいだけど、
# その辺の小難しい話を知りたいなら、例えば以下のエントリが参考になるかもしれない。
# URLリンク(d.hatena.ne.jp)
# URLリンク(d.hatena.ne.jp)
どれも、最終的には「メンテナンス性の向上」が大きな目的であるという点では共通していると思う。

上でstringクラスを例として挙げてる人がいるけど、それにより実現できる機能にのみ
注目すると、利点を示すのが難しくなるんじゃないか。
一番重要なのは、データと処理を統一的な方法でまとめることで、
「より使いやすく」「より分かりやすく」「より安全に」プログラムできるようになることだろう。

一口に言えば、それが「できる」ことと「簡単にできる」ことの間には大きな差があるし、
生産性の向上という量的な変化は、究極的には質的な変化に繋がりうる。

>>348の人も、そういう観点から入門書を読んでみると良いと思うよ。

361:デフォルトの名無しさん
10/03/28 22:25:55
>>356
それちがうとおもう
経験的に、関数的にまとまってる設計(副作用のない設計)の方がデバッグは楽


362:デフォルトの名無しさん
10/03/28 22:30:29
>>360
たしかにそうなんだけど, 現場ではオブジェクトの名の元に
クラスに隠蔽されたグローバル変数が飛び交ってるんだが


363:デフォルトの名無しさん
10/03/28 22:31:47
>>360
>一番重要なのは、データと処理を統一的な方法でまとめることで、
>「より使いやすく」「より分かりやすく」「より安全に」プログラムできるようになることだろう。
脳みそにウジでもわいてるのか?
それのどこが金になるの?

364:デフォルトの名無しさん
10/03/28 22:34:51
>>361
副作用のない範囲で済むコードなら良いと思うけど、それは要求次第なわけだし。
副作用が影響を与える範囲を言語仕様的に限定できるのがオブジェクト指向言語の良いところ。
早い話が、自分や他人がアホなコードを書いた時のリスクを低減できる。

非純粋関数型言語が許されるのは小学生までだよね(AA略という話ならまた話が変わるけど。

365:デフォルトの名無しさん
10/03/28 22:35:04
プロセス志向で機能分割するのに比べて、実行フローを明確にできないからOODではむしろ難しくなる。
その辺開発者全員で設計段階から意識共有できないと大変なことになる。
だから所謂「ジャンプ」コードの廃止によって少なくなって行ったスパゲティコードが、OODによって復活した。

なんてのは、15年も前にウェブスターなんかが指摘してたことだけどな。

366:デフォルトの名無しさん
10/03/28 22:39:25
>>361
そもそもオブジェクト指向を取り入れてない言語のデバッガが低次元になってる

367:デフォルトの名無しさん
10/03/28 22:39:40
>>362
そこは継続的インテグレーションと静的解析ツールを使ってコーディングスタイルを強制、
でいいんじゃね。IDEや各種ツールを導入して自動化するのは重要。

368:デフォルトの名無しさん
10/03/28 22:40:47
>>364
> 副作用のない範囲で済むコードなら良いと思うけど、それは要求次第なわけだし
それもちゃうとおもう
うまくデザインすれば、副作用のある個所は物凄く減らせる


369:デフォルトの名無しさん
10/03/28 22:44:00
オブジェクト指向ってさ、なんで無理にメソッドの集合で全ての物事を抽象化しようとするのかね?
例えば無いかもしれないデータを表現するのにメソッドの集合で定義すると、
template <class T>
class Option {
public:
T get();
bool isNone();
};
という風に抽象化されると思うけど、これだと実体がNoneなのにgetが呼ばれてエラーになる可能性がある
代数的データ型みたいにメソッドの集合と場合分けの構造と両方持てばいいのに

370:デフォルトの名無しさん
10/03/28 22:46:24
>>363
手戻りが減らせればコストを減らせて金になると思うけど。

371:デフォルトの名無しさん
10/03/28 22:48:58
>>365
ワークフローが中心になるタイプの業務システムとかだとそういう側面はあるかもしれないな。
そこは、オブジェクト指向というよりフレームワークのレベルでどうにかする問題だという気もするけど。

372:デフォルトの名無しさん
10/03/28 22:50:25
>>368
デザインによって副作用は減らせると思うけど、完全に取り除くことはできないわけだし。
それに、そういううまいデザインとオブジェクト指向の採用は矛盾しないんじゃない?

373:デフォルトの名無しさん
10/03/28 22:50:30
>>363 ではないんだけど
現実には >>362 の様な理由によって
>「より使いやすく」「より分かりやすく」「より安全に」プログラム
できていないことが問題だろ


374:デフォルトの名無しさん
10/03/28 22:53:45
>>369
参照に代入されたnullを「ない」の意味で使うか、Null Objectを定義すればよし。

375:デフォルトの名無しさん
10/03/28 22:53:59
ちんこの遊び場はここですか

376:デフォルトの名無しさん
10/03/28 22:56:39
>>373
もちろんオブジェクト指向は万能な「銀の弾丸」じゃない。
そこを補うのが、例えば>>367みたいな実践。

377:デフォルトの名無しさん
10/03/28 22:57:15
>371
オブジェクト指向の利点を活かすには、それを含めてってことだけどな。
草創期からOODに取り組んでいたウェブスターが言ったのは、人材だの会社の
政治的な側面も考えて「環境を整えてからやれ」ってこと。

378:デフォルトの名無しさん
10/03/28 23:04:29
>>374
nullを使ったらnullチェックが必要になるのでisNoneを呼び忘れる危険と変わらないのでは?
Null Objectってどうやって使うの?まさかtypeid?それこそ場合分けの構造じゃんか

こういう小手先の芸じゃなくて、言語使用として場合分けの構造をサポートした方がいいという判断で、
Scalaとかはcase classを導入したんだと思うんだけどなー

379:デフォルトの名無しさん
10/03/28 23:05:03
オブジェクト指向じゃない言語は本当に迷宮入りする事があると思う
ある意味怖い

380:デフォルトの名無しさん
10/03/28 23:08:19
>>378
URLリンク(www.hyuki.com)

381:デフォルトの名無しさん
10/03/28 23:14:16
>>379
200人規模のプロジェクトだとオブジェクト指向でも平気で迷宮入りするのは気のせい?


382:デフォルトの名無しさん
10/03/28 23:15:10
>>380
ありがとう
読んでみたけど、Null Objectでどうやってgetを実装するの?
戻り値がないので無理でしょ

やっぱりメソッドの集合で物事を抽象化するには限界があるのだと思うよ
限界があるというか、もっといい方法がある場合があるので、そちらも使うべき

383:デフォルトの名無しさん
10/03/28 23:15:40
200人いれば200のオブジェクト指向があるってのが事実。
大統一理論があると思ってはいけないw

384:デフォルトの名無しさん
10/03/28 23:17:18
>>382
べつにnullを使っちゃいけないということはないと思うけどなぁ。
いい方法があれば併用すべきというのは同意。

385:デフォルトの名無しさん
10/03/28 23:22:27
>>382
ていうかべつに代数データ型でなくてswitch caseでいいわけでしょ。
基本的にパターンマッチは記述を簡潔にするのが目的だと思うけど。
OOがやる抽象化は拡張できるようにするためでしょ。

386:デフォルトの名無しさん
10/03/28 23:26:08
>>381
そんなレベルじゃない
自分で自分が作った物が分からなくなる
オブジェクト指向だとプログラム自体がある程度設計書だがそれがない

387:デフォルトの名無しさん
10/03/28 23:28:02
>>384
同位THX
ついでだからさらに続けると、
一旦場合分けの構造の有用性を受け入れると、意外とその適用範囲が広いことが分かると思うのよ
Scalaではかなり使われているし、関数型言語ではいわずもがな
とすると、これはもう、
"メソッドの集合で全てを表現しようとしたオブジェクト指向はやりすぎでした、間違いでした"
という結論にならざるを得ないのだけど、どうよ?

388:デフォルトの名無しさん
10/03/28 23:34:30
メソッドどころか「データの抽象化がオブジェクト指向ではない」ってのは、
高名なクック船長がおっしゃってますw

389:デフォルトの名無しさん
10/03/28 23:35:58
>>385
>ていうかべつに代数データ型でなくてswitch caseでいいわけでしょ。
あれ?
オブジェクト指向ってsiwtch caseを使わずにオブジェクトのメソッドで抽象化するというのが原則じゃなかったっけ?
switch caseを使うって事は、場合分けの構造がやっぱり必要って事になるよ

390:デフォルトの名無しさん
10/03/28 23:36:21
>>386
それはどうしてそういえるの?

391:385
10/03/28 23:44:14
>>389
極端に言えば、パターンマッチはswitch caseがあれば、場合わけの構造とやらがあるので、いらんでしょ?
OOでわざわざ抽象化してデザインすると、それを外部から拡張できるようになる。
それとも場合わけの構造ってなにか具体的な定義があるの?

392:デフォルトの名無しさん
10/03/28 23:46:23
>>391
ぶっちゃけそんな細かいとこどーでもいいよ
実装方法なんてどーだっていいし
オブジェクト指向となんも関係ないのに
それがオブジェクト指向だと思ってる可愛そうな脳みそしてる奴多いな
オブジェクト指向はあくまでも仕様をオブジェクトに落とすだけだ

そんな細部の話が出てくる時点でもうおかしいだろ

393:デフォルトの名無しさん
10/03/28 23:55:48
>>392
個人的な意見だけど、オブジェクト指向って言葉は、
「オブジェクトという概念を中心に据えたテクニックや分析手法の集合」なんじゃないのかな。
その具体的なテクニックの代表例が、例えばデザインパターン。

だから、人によって見解に相違が出てくるのは当然だし、
「○○という定義に沿ってなければオブジェクト指向じゃない」みたいな話はあんまり意味がないんじゃないかな。

394:デフォルトの名無しさん
10/03/28 23:55:58
>>391
>極端に言えば、パターンマッチはswitch caseがあれば、場合わけの構造とやらがあるので、いらんでしょ?
確かにswitch caseがあれば、パターンマッチはそれの強力版みたいなものなので、原理的にはいらない
それは同位
うん?でも議論がかみ合ってないな
別にパターンマッチが必要と言っているのでは無く、
switch caseという便利なものを否定しようとするオブジェクト指向はいまいちじゃない?と言っている

395:374
10/03/29 00:01:47
>>394
そりゃ、goto禁止すると例外処理がきれいにかけないから構造化プログラミングはいまいち、
って言ってるようなもんだよ。

あくまで「原則」は「原則」なわけで、どういう書き方が最適かは状況による。
将来拡張する可能性が高いなら、switch caseはハードコーディングされてあまり良くない。
そうでなければ以下略。

396:デフォルトの名無しさん
10/03/29 00:06:14
>>393
違うよ
はじめはシミュレーション用の言語だったんだから
オブジェクト=物体と仕様をわかりやすく落とし込むために作られた
たしか気体分子同士の関係をみるためだったかな?

仕様をそのままコードに落とせるのが目的なんだから
デザパタなんて入る隙間なんてない
よってデザパタがオブジェクト指向だという奴はオブジェクト指向を理解してない

大事なのは仕様

397:385
10/03/29 00:06:39
>>394
否定してないと思うけど?
だって大抵のOOには場合わけが書ける言語構造があるし、分岐のコードみたんな書くよね。
否定されるのは拡張が必要になるのに、それをやりにくくするコードを書く場合。

場合わけのコードをばらまくことを推奨する言語が、メンテナンスとか拡張とか頭にないってことなんじゃないの?
便利だといって後のことなんも考えてませんみたいな。

398:デフォルトの名無しさん
10/03/29 00:07:06
>>388
クック船長がどう言っていようが、
Stroustrup(発音しらん)艦長がなにを言っていようが、
ケイ番長がなにを言っていようが、
このさい関係ない
そんな定義論に興味ない
Abstract Data Typeは使いにくい場面が多いし、偏りすぎ
ただそれだけ

399:デフォルトの名無しさん
10/03/29 00:11:11
>>395
>そりゃ、goto禁止すると例外処理がきれいにかけないから構造化プログラミングはいまいち、
>って言ってるようなもんだよ。
なるほど
合点がいった
ありがとう

400:デフォルトの名無しさん
10/03/29 00:13:19
>>390
どこに何に対する処理か分からないルーチンがばら撒かれるから
オブジェクト指向だとオブジェクト自体に処理が書かれるからどこにあるか分かる

401:デフォルトの名無しさん
10/03/29 00:15:42
>>397
>場合わけのコードをばらまくことを推奨する言語が、メンテナンスとか拡張とか頭にないってことなんじゃないの?
>便利だといって後のことなんも考えてませんみたいな。
でもここは同意できないな
場合分けのコードってメンテナンス性も拡張性も落とさない
ただし静的型付けがあれば、かな

402:385
10/03/29 00:25:46
>>401
型でチェックできればいいってもんではない。
コードに手を入れるのは大変だし、取り除くのも大変。

パターンマッチにも拡張性が低いから拡張できるようにって取り組みがあった気がするが。

403:デフォルトの名無しさん
10/03/29 00:27:50
>>398
その通りだけどw
表記色々あるが、ストラブストラップ艦長が成功したのは抽象化そのものに
こだわるより、Cとの親和性を重視した結果。
そもそもJavaにおける「プリミティブな型」を考えりゃわかるけど、同じメソッドを
持ってるオブジェクトであるはずでもコピーではまったく同一に扱えないわけで…

メッセージ志向がオブジェクト指向なのかどうかも誰も確定できない状態で、
OODが正しいなんて言うのが間違い。OOD的考え方の導入に利があるかどうかの
話でしかないんだけどな。

404:デフォルトの名無しさん
10/03/29 00:31:49
同じコードを10箇所とかにコピペするのを止めて欲しい
仕様変更でコードを変更するだけで死んでしまう

405:デフォルトの名無しさん
10/03/29 00:32:55
>>402
つOCamlの多相バリアント
元のコードには手を入れずに拡張できる

406:デフォルトの名無しさん
10/03/29 00:37:29
>>396
いわゆるGoF本の正式なタイトルは、
「オブジェクト指向における再利用のためのデザインパターン(Design Patterns Elements of Reusable Object-Oriented Software)」
なんだけどな。。

407:デフォルトの名無しさん
10/03/29 00:39:59
>>406
だからといって本人達が理解しているかどうかは全く別
少なくとも俺には製作者のオナニーにしか見えない

408:デフォルトの名無しさん
10/03/29 00:41:43
>>407
本人ってのは誰? GoFのおっちゃん?

409:デフォルトの名無しさん
10/03/29 00:42:52
それとデザパタははじめの設計思想のシミュのための~って部分の原型すらないじゃない
仕様をそのままコードに落としこめるメリットをまるごと削り取って
パターンどおりに作ると安全性、汎用性の名のもとに余計な仕様は入れるは、
オナニークラスはいれるは仕様からコードを説明はできないわであまりにも酷い

やってることが給料泥棒と変わらないよ
だいたい、だれが汎用性なんていれてくれって頼んだよ?

410:デフォルトの名無しさん
10/03/29 00:44:04
>>402
「開放-閉鎖原則(The Open-Closed Principle)」の考えに基づくなら、
「変更に対して閉じており、拡張に対して開いている」方が良い、という結論にはなるね。

411:デフォルトの名無しさん
10/03/29 00:45:18
>>405
拡張できるといってもレコードの拡張とはサブタイピング関係が逆になるので要注意な

412:デフォルトの名無しさん
10/03/29 00:46:33
>>409
> だいたい、だれが汎用性なんていれてくれって頼んだよ?

君以外のコーダーと一週間後の自分。
メンテナンス性の向上に役立たない汎用性が不必要であることは言うまでもないが。

413:デフォルトの名無しさん
10/03/29 00:47:36
ぶっちゃけデザパタは「馬鹿は何も考えるな!この通りに作れ!」っていうリアリズムだろw

414:デフォルトの名無しさん
10/03/29 00:52:24
さっきから
>オブジェクト指向は仕様をそのままコードに落とせる
と叫んでいるイタい上司がいるのですが、なんとかなりませんか?

415:デフォルトの名無しさん
10/03/29 00:56:22
>>414
何ともなりません。自分でやってみて実証してくださいとお願いするしかないですw

416:デフォルトの名無しさん
10/03/29 00:56:39
A.アセンブラかマシン語
B.超高級言語(ネイティブな母語のようなもの)のインタープリタ

概念というより、言語の問題だろうな…

417:デフォルトの名無しさん
10/03/29 01:13:27
ずっと粘着してる奴コテつけろ
だれだかわからない

418:デフォルトの名無しさん
10/03/29 01:23:39
>>414
成り立ちから考えてデザパタはどうやってもやってることが違う

419:デフォルトの名無しさん
10/03/29 01:27:01
まあ、ちゃんとプログラムやってたら
ほとんどのデザパタはいつのまにかやってるもんだと思う

420:デフォルトの名無しさん
10/03/29 01:30:23
>>419
俺とお前の作り方は違うんだな
俺はあくまでも仕様書に書いた構造をコードに落とす
そこにデザパタが介在する隙間はない
パターンなんてねぇから

421:デフォルトの名無しさん
10/03/29 01:41:35
>>420
仕様書があるならそれでいいと思う
リファレンスとして仕様書があるから早いしわかりやすい

デザパタはある意味共通化された設計だから分かりやすいってとこもあるが
無理にデザパタにあてはめるのは意味ない
ちゃんと設計してたらデザパタとだいたい同じ設計が出来上がるもんだと思ってるかしな

422:デフォルトの名無しさん
10/03/29 01:43:10
だって元々デザパタは経験則で生まれたもんだろ。
マトモなPGが組めば同じようなパターンになるのは当然。
それを「知識」として受け取るような奴がいるから困ることになる。

たとえば誰が使っても単一の生成しかしないようなオブジェクトにおいて、
[factory methodだから~]とか言ってnewしてからCreateってなのを、あたかも
理想的な実装であるかのように強要する奴はいらない。それだけだろw


423:デフォルトの名無しさん
10/03/29 01:48:46
>>422
そうだな

デザパタに限ったことではないがこれが唯一解みたいなのはいて欲しくない
わかってデザパタ使ってほしい

424:デフォルトの名無しさん
10/03/29 01:53:33
オブジェクト指向の意味は
privateによるカプセル化と、
ポリシークラスによる構造定義が真の意味だと思ってる
工期がどうってのはあくまで副次的な産物

425:デフォルトの名無しさん
10/03/29 09:19:47
オブジェクト指向で用意されたライブラリがクソ使いやすいんだが。
String, Array, Hashとか基本的な奴ほど特に。
Cでやろうとするとすごく煩雑にならないか?

426:デフォルトの名無しさん
10/03/29 09:24:22
だよねー
その3つがあればなんでもつくれるよねー

427:デフォルトの名無しさん
10/03/29 21:23:31
>>425
Cでの実装も、継承、多態を考えなければ、そう難しくはないと思うよ。

たとえば文字列の場合、

公開用の型として
typedef struct {int class_id;} t_string;
実装用の型として、
typedef struct {int class_id; char* str; } t_string_impl;
を用意しておき、
インスタンス生成の関数が呼ばれたら、t_string_implを生成し、キャストして、ライブラリの外へはt_stringを返す(正確にはポインタを返す)。

その他、文字列操作に関する関数は、返されたt_stringを渡して、ライブラリの中で、キャストしてt_string_implを取り出し、操作する。

使う側としては、インスタンスのポインタと関数のセットで扱うので、そう違いはないかと。

継承、多態を実現しようとすると>>425のいうとおり、煩雑になると思う。
ってゆうか、C++つかいやがれってことです。

428:デフォルトの名無しさん
10/03/29 22:39:04
>>425
>オブジェクト指向で用意されたライブラリがクソ使いやすいんだが。
>String, Array, Hashとか基本的な奴ほど特に。
それは別にオブジェクト指向である必要はないよね
MLならモジュール、Haskellなら型クラスというやり方もある
オブジェクト指向しか知らない人は世界が狭いよ

429:デフォルトの名無しさん
10/03/29 22:46:13
プログラミングにおける「良い習慣」を全部オブジェクト指向の手柄にしちゃうのが初心者

430:デフォルトの名無しさん
10/03/30 21:26:39
昔は、cは関数が豊富でよい、と言われていたものだが。

431:デフォルトの名無しさん
10/03/30 22:04:56
オブジェクト指向設計と絡めてC++の利点を説明できない人ってなんなの?
サブルーチンに対してばっかり話してるけどそんなのC言語の標準関数と変わらないじゃん
全然オブジェクト指向出てこないんだけど?w

432:デフォルトの名無しさん
10/03/30 22:20:05
>>431
何が変わらないの?

433:デフォルトの名無しさん
10/03/30 22:23:06
newしたらオブジェクト指向

434:デフォルトの名無しさん
10/03/30 22:25:02
>>432
設計じゃないという意味
設計の話でstrcpyとか出てこないでしょ?
だけどこの板に巣くってる馬鹿な人は
いつもオブジェクト指向の話するのに文字列クラスなんて馬鹿なもん出して説明しようとしてる

いい加減、オブジェクト指向理解できてないって気づけよw

435:デフォルトの名無しさん
10/03/30 22:42:27
ここは別にOODと言ってないんだから設計の話じゃなくてもいいだろ。OOPでもw

436:デフォルトの名無しさん
10/03/30 22:52:18
だったら別スレ建てろよ
邪魔だな邪魔
オブジェクト指向理解してねぇしw

437:デフォルトの名無しさん
10/03/30 22:54:43
別スレはお前だろ。元々オブジェクト指向ってのは実装が先だぞ。
設計なんてのはその考え方を推し進める上で、後から出てきた話だ。

438:デフォルトの名無しさん
10/03/30 23:26:18
>>437
はぁ?
馬鹿は糞して寝ろよw

439:デフォルトの名無しさん
10/03/30 23:52:52
ちんこさんチンコンパイラはまだですか?

440:デフォルトの名無しさん
10/03/31 00:19:45
>>431
オブジェクト指向言語としてのC++はあまり評価が高くないように思うが。

441:デフォルトの名無しさん
10/03/31 00:48:00
オブジェクト指向言語としてのC++、なんて話じゃないな。1人が勘違いしてるだけ

442:デフォルトの名無しさん
10/03/31 04:38:57
情報隠蔽に、コーディングレベルでの意味を見出せない。
言語レベルでのコントロール規制…うーむ。


443:デフォルトの名無しさん
10/03/31 04:51:32
データを勝手に変更させないってことじゃないのか
例えばマイナス入れちゃ駄目な変数に勝手にマイナス入れられないようにするとか

444:デフォルトの名無しさん
10/03/31 05:07:58
>一行目
private指定で、getterだけで使用…? 他の思いつかない俺はダメだな。
ハードコーディングしたデータを使うだけなら、別段規制する必要性を感じない。
人間は間違うもんだ…という前提にたっての規制なら…意味あるか

>二行目
setterで入力データのチェックを行う。というのが思いついた。
関数言語でも入力内容のチェックを通すのは容易い。
わざわざそれを隠蔽と称して、setterで行う意味合いはなんだろう。

考えなければ…


そもそも、前面に出やすい「再利用性」も疑問が残る。
関数とオブジェクト指向の再利用性の違い、とはなんだろう?
恐らく、考える階層が違うのだろうが…。

445:デフォルトの名無しさん
10/03/31 07:57:02
>>442
静的型検証と同じこと。
特に、自分以外の人間と一緒にコーディングする時のことを考えてみるとよろし。
「昨日の自分と今日の自分は別人」とか言ったりもするし。

cf. 契約ベースプログラミング

446:デフォルトの名無しさん
10/03/31 08:01:48
>>444
継承できるかできないかの差かと思う
これができないとコピペが乱立する

447:デフォルトの名無しさん
10/03/31 08:06:59
>>444
言うまでも無いが、なんでもかんでもgetter/setterを実装するならあんまり意味がない。
そのオブジェクトが他のオブジェクトに対して、本当に提供すべき「サービス」は何か、ということを考える。
オブジェクトは、責任分散協調系の中の主体の一つ。

再利用性については、何を意識しているかによるけど、
一時期盛んに言われていた「継承は再利用のためにある」みたいな説明は、
最近は批判されていることが多いね。
個人的には、メンテナンス性が向上すれば自ずと再利用性も向上する、程度に考えているが。

あと、「人間は間違うもの」という認識は、君が考えている以上に超重要。

448:デフォルトの名無しさん
10/03/31 08:18:54
参考になりそうなキーワード:
単一責任原則
"Tell, Don't Ask."

449:デフォルトの名無しさん
10/03/31 09:04:11
あまり専門用語使ってると説得力ない希ガス
よく分かんねで終わってしまいそう

450:デフォルトの名無しさん
10/03/31 09:05:42
言ってる方は気持ちいいだろうけど

451:デフォルトの名無しさん
10/03/31 10:19:39
>>446
> これができないとコピペが乱立する
出来なくても, unix の kernel にはコピペないよ


452:デフォルトの名無しさん
10/03/31 10:28:50
>>451は何を根拠にそう発言したのだろうかw

453:デフォルトの名無しさん
10/03/31 10:59:32
>>451
少なくとも, v6 のソースには見受けられなかったし, 4.2BSD もそうだった
*BSD や Open Solaris でもみかけないな.
Linux のドライバにはあるかも知れない.


454:デフォルトの名無しさん
10/03/31 11:15:37
オブジェクト恥垢

455:デフォルトの名無しさん
10/03/31 12:23:31
OOPのポイントは2つ。
1.クラスのインスタンス化
2.メッセージング

「なぜクラスをインスタンス化する必要があるのか」、
「メソッド呼び出しとメッセージ送信の違いは何か」、
を明解に答えることができれば、
OOPを理解している、とみていいんじゃないの。

456:デフォルトの名無しさん
10/03/31 13:08:56
そのふたつはObjective-Cをマスターすることによって理解できるな

457:デフォルトの名無しさん
10/03/31 13:30:35
「変数と、それを操作するメソッドを1つにまとめる」(クラス)
「ユニークな変数にはユニークなメソッドを用いる」(クラスのインスタンス化)

Javaで、Stringクラスを100個インスタンス化したとする。文字列の長さを得るには、

オブジェクトa.length();
オブジェクトb.length();
オブジェクトc.length();


とするわけだが、ここで、オブジェクトaのlength()が対応しているのは、
オブジェクトa内部に隠蔽された変数であって、オブジェクトbやcの変数ではない。
このように変数とメソッドが1対1で対応していることの利点は、
片方を知っていればもう片方を知る必要がなくなるということ。
要するに、メソッドを知っていればそれに対応する変数を知る必要がなくなる(隠蔽可能になる)ということ。
変数とメソッドを分離した場合は、変数の隠蔽ができなくなるので、
変数とメソッドの両方を知る必要がでてくる。

変数を隠蔽するという観点からすれば、変数の入力はsetter、出力はgetterで行うのが望ましい、
ということになるね。

458:デフォルトの名無しさん
10/03/31 14:07:54
メッセージングについては、
URLリンク(www.geocities.jp)
を読めば分かるんじゃね。

OOPってのは、要するに、
可能な限りオブジェクトを他から切り離して単独で動かそうとするプログラミングのことでしょ。
その仕組みがインスタンス化だったりメッセージングだったりするわけで。
非OOPでもOOPのようなことはできるじゃん、ってな意見だかネタだかをよく聞くけど、
そんなこと当たり前のことだよねぇ。できるかできないかの話じゃなくて、簡単か難しいかの話。

非OOPでも、「ローカル変数なんていらん!全部グローバル変数でいいだろ!」
ってなことを言われても、まあ、間違いではないんだけど、普通はやらないからねぇ。

459:デフォルトの名無しさん
10/03/31 19:24:23
> このように変数とメソッドが1対1で対応していることの利点は、
> 片方を知っていればもう片方を知る必要がなくなるということ。

???
片方を知っていれば、もう片方を知る必要が無い?何言ってんの?
おまえ、自分の書いたOOPのサンプルコードで、

> オブジェクトa.length();

このように、"オブジェクトa" と length() の両方を指定しているよな。
"オブジェクトa" だけでも、"length()" だけでも、思ったようには動いてくれないよな?
両方知ってる必要があるんだよな?片方だけを知ってれば良いってのはどんな寝言?

まったく、OOP信者はマジキチだな。


460:デフォルトの名無しさん
10/03/31 19:39:49
>>457が言ってる「変数」って、オブジェクトaの内部状態のことでしょ。

461:デフォルトの名無しさん
10/03/31 19:50:24
Cの関数でも、
構造体aを指定しているのに、
なぜか構造体bのメンバが変更される、
とかありえないから。

struct hoge a, b;
func( &a ); //なぜかbのメンバが変更される。

その発想が怖い。

462:デフォルトの名無しさん
10/03/31 20:01:12
>>461
func(hoge)が、内部でbを変更するコードになっていればありうる。

463:デフォルトの名無しさん
10/03/31 20:11:08
そしてそれはOOPの欠点だ。
Cなら有りえない。

464:デフォルトの名無しさん
10/03/31 20:15:27
単に関数付き構造体ってことじゃないのか
構造体みたく好き勝手に値変えられない構造体みたいな

465:デフォルトの名無しさん
10/03/31 20:28:16
>>464
言語仕様レベルではね。特に後段が重要なのではあるが。

466:デフォルトの名無しさん
10/03/31 21:46:10
>>459
Javaで、Stringクラスを~、って言ってんだから、
メソッドa.length()に対応する変数は、
オブジェクト内部に隠蔽された変数(文字列の長さを表す数値)のことでしょ。

ていうか、Javaすら知らないんだったら黙っとけよ。

467:デフォルトの名無しさん
10/03/31 21:53:08
しかし、>>459の発言は痛過ぎるね。
まさに、Javaを知りません、OOPLを知りません、ってな文章だなw


468:デフォルトの名無しさん
10/03/31 22:11:06
まあ重要なのはそういう隠蔽化ではないけどな。
誰かがStringを継承して、ある特殊なエンコードに対応したクラスを作ってくれたとしても、
その中身をあまり知らずに安易にStringと同様の使い方をすることはできないしね。

469:デフォルトの名無しさん
10/03/31 22:14:30
涙ふけって、OOP信者よ。
変数とメソッドが一対一で対応って意味不明だろ。
クラスとメソッドが一対一で対応しているわけで。

470:デフォルトの名無しさん
10/03/31 22:18:00
常に対応してるんだったらメソッドなんかいらんわな
単純な関係が崩れたときのためにアクセサを通すわけで

471:デフォルトの名無しさん
10/03/31 22:24:04
あーまた変な事言い出した。
メソッドがクラスと対応しているのは当たり前だろ。

472:デフォルトの名無しさん
10/03/31 22:27:58
オブジェクト指向なんてもはや基礎教養だろ。
踏まえた上でどう実践していくかというフェーズで、
信じるとか信じないとかいう段階はとうに通り過ぎてる。

まぁ、理解したつもり、のレベルのやつがとても多いのは事実だけどなー。

473:デフォルトの名無しさん
10/03/31 22:30:26
>>471
まず、クラスとは何か、メソッドとは何か、という言葉の定義の確認から始めた方が
いい気がするな。

474:デフォルトの名無しさん
10/03/31 22:36:23
SmalltalkやCLOSも学んだ方がいい
といってもちんこは人の話を聞かないのであった

475:デフォルトの名無しさん
10/03/31 22:36:46
隔離されたグローバル変数(というか環境)みたいなもん

476:デフォルトの名無しさん
10/03/31 22:44:18
>>472
Javaの話をしていたんだよね。JavaってクラスベースのOOP言語だよね。
クラスとメソッドが対応するのは当たり前だよね。
メソッドのアドレスが格納されている、いわゆるvtableはクラスごとに用意されるのは知ってるよね。
そしたら、クラスとメソッドが関連付けられるのは自明だよね。

>オブジェクト指向を踏まえた上でどう実践していくかというフェーズで、
そのOOP前提みたいな論調はなんなんですかね。
まーOOPで出来る事はデータの整合をとる事ぐらいだってのが、
大衆にも大体ばれてきてて、
「だったらデータの整合性の管理だけをOOPに任せよう」、
って意味での「踏まえる」ならわかるが。

477:デフォルトの名無しさん
10/03/31 23:08:32
>>476
たぶん前半は俺宛じゃないと思うが、
それはどちらかというと「クラスインスタンス」じゃないか?

あと、データの整合性を取る云々は、「責務の分担を保障できる」と考えてみてはどうかな。

もちろん、慎重にコーディングすれば非OOPLでもできる話だが、
OOPLを使ったほうが当然効率が良い。

478:デフォルトの名無しさん
10/03/31 23:23:41
>>477
メソッドがクラスにくっついてるのがクラスベースのOOP。
メソッドがインスタンスにくっついてるのがプロトタイプベースのOOP。
こんなの常識過ぎるだろ。
そこの区別の問題があるから、JavaのようなクラスベースのOOPを説明するなら、
「メソッドはクラスと関連付けられる」って表現が適切なんだよ。
メソッドはインスタンスと関連付けられる、と書くと、プロトタイプベースなのかと勘違いされる。

479:デフォルトの名無しさん
10/03/31 23:30:00
>>478
クラスの中のメソッドと対応してる時はなんなのよ

480:デフォルトの名無しさん
10/03/31 23:32:06
えらく無知を晒してるやついるけど
オブジェクト指向は魔法みたいなものと勘違いしてんじゃねーの?
ほとんど似たようなものだろ

481:デフォルトの名無しさん
10/03/31 23:42:53
>>478
だからクラスインスタンスと書いたわけだが。
クラスに紐付く、という説明だとインスタンスを生成することの意味が分からなくなるし、
それにポリモーフィズムの説明ができない。

482:デフォルトの名無しさん
10/03/31 23:47:32
>>478
CLOS みたく、どっちにも付いてないのは何て言うんだ


483:デフォルトの名無しさん
10/04/01 00:03:47
>>481
Javaのポリモーフィズムはインスタンスのクラスに基づいて行われる。
わかる?
インスタンスのクラスのメソッドが呼ばれる。
もう一度言うよ。
インスタンスのクラスのメソッドが呼ばれる。
インスタンスがメソッドを持っているわけではない。クラスがメソッドを持ってる。
メソッドの呼び出しは、インスタンス→動的クラス判定→メソッドと、クラス経由で呼び出される。
「クラスのメソッド~」って表現、日常的に使うでしょ。
一方、インスタンスがメソッドを持ってるのは、プロトタイプベースと言う。

でもちょっと考えれば分かりそうなもの。
Javaでは同じクラスのインスタンスであれば、
ポリモーフィズム時に呼び出されるメソッドは同じものになるよね。
これはメソッドがクラスに結びついているから。

484:デフォルトの名無しさん
10/04/01 00:06:36
てか本当に初心者が多いな。
こんなんがOOP万歳してるんだろうな。
せいぜい今のうちにいい夢みてればいいよ。
すぐに 大人たちは嘘つきだ って言い出すから。

485:デフォルトの名無しさん
10/04/01 00:25:32
>>483
いや、内部的にはその通りだよ。
というか、俺と同じことを言ってるようにしか見えんのだが。

後段については、インスタンスを外部から呼び出す側は、
そのインスタンスの実装クラスが何か、ということは意識しないよね、という話。
あるインタフェースを実装したインスタンスのメソッドを呼ぶと、
実装クラスに合わせて処理が動的にディスパッチされる、
という話を認めると、何か都合が悪いのかもしれないけどさ。
(もちろん、これはOOの要素技術の一つであって、定義でも本質でもない)

486:デフォルトの名無しさん
10/04/01 00:28:13
OOPをやってると、どんどん恥垢が溜まっていくのだろうか…

487:デフォルトの名無しさん
10/04/01 00:39:53
>>486
反論ないなら寝るけど、他人を自分と同レベルに引きずり落とすことに熱心になるくらいなら、
自分の世界を広げる努力をした方がいいと思うよ。

488:486
10/04/01 00:48:27
すみません特別誰の発言に向けた言葉でもありません…
コーディングしてると垢のようなものが溜まっていくような感覚がしまして…
思考が固まっていくような…独り言でした…紛らわしくてすみません…

489:デフォルトの名無しさん
10/04/01 00:52:39
コーディングが煮詰まると恥垢が溜まるとは珍しい人ですね。

490:デフォルトの名無しさん
10/04/01 00:55:19
削れば恥垢は落ちます…
僕と一緒に綺麗になりましょうよ…ウホッ

491:デフォルトの名無しさん
10/04/01 01:02:42
OOPがもし発明されなかったら、
入力支援の方向が左になってたんだろうか。
構造体の変数書くと、その構造体を使う関数が左にずらりと並ぶ・・・

492:デフォルトの名無しさん
10/04/01 01:10:57
>後段については、インスタンスを外部から呼び出す側は、
>そのインスタンスの実装クラスが何か、ということは意識しないよね、という話。

その、何か気にしないで済む「実装クラス」とメソッド群は対応しているだよね。
実装クラスが判明すれば、メソッドは一意に決定するんだよね。
クラスが分かればメソッドは決定するんだよね。
クラスがメソッドを決めるんだよね。
だったら、メソッドはクラスにぶら下ってるよね。

てかもう本当にいやになってきた。
JavaなんかのクラスベースのOOPでメソッドがクラスに関連づいてるってことを否定する人って何なのよ。
クラス作らなきゃポリモーフィズム出来ないって時点で気づけよ。
メソッドがクラスにくくりついてるから、
多態したいだけクラス作らなきゃ多態できないんだ。
同じクラスのインスタンスで多態できるか?出来ないよな。
ちなみに、プロトタイプベースだとこれが出来る。
その差はなんだ?メソッドがクラスにぶら下っているか、インスタンスにぶら下っているかの差だよな。

493:デフォルトの名無しさん
10/04/01 01:21:02
>>491
俺も昔それを考えた事がある。
俺の結論はこう。
「関数名を書くと、引数にとりうる型の参照可能な変数が列挙される」
要は引数を補完する。何気に便利そうだ。

ところで、OOPで使われる object.method() って並びは英語的に変じゃない?
俺たちはコンピュータに命令を下しているわけだから、命令文的に、
command( object ) の方が自然に思えるのだが。
やっぱOOPって何から何までキモいと思う。

494:デフォルトの名無しさん
10/04/01 01:24:42
アドレス空間上、コード領域に置かれるのが判ってるなら~ベースなんてどうでもよくね?w

495:デフォルトの名無しさん
10/04/01 01:31:03
>>492
インスタンスの利用者から見れば、クラスベースであれプロトタイプベースであれ、
メソッドのコードが実際にはどこにぶら下がっていようが、処理系がその詳細を
隠蔽する以上、「インスタンスのメソッドを呼び出す」という風に見えるのだから、
多態性を説明する時に、メソッドがクラスに紐付いていることを過度に強調してなんか意味あるの?

っていう話じゃないの。

496:デフォルトの名無しさん
10/04/01 01:36:45
>>493
Objectが主語だからでしょ。

497:デフォルトの名無しさん
10/04/01 01:49:33
>>495
インスタンスの設計者はどうなるんだよ。
使う側が気にしなくても良いってのはいつでも真理だよ。

それに俺は何も強調して無いぞ。
俺「メソッドはクラスに関連付いてる」
彼「どちらかというとメソッドはクラスインスタンスに関連付いてるんじゃね」
俺「どちらかというとクラスでしょ」

498:デフォルトの名無しさん
10/04/01 01:51:57
>>493
>「関数名を書くと、引数にとりうる型の参照可能な変数が列挙される」
おぉ、いいね。
これはOOPであっても実装してほしいぞ。
変数マークアップ機能の次はこれだ。

>object.method() って並びは英語的に変じゃない?
英語的にも日本語的にも変だな。
command( object ) という書き方がゼロになっていないということも、
戸惑わされる。中には、どちらの表現もできたりする。
object.method() は廃止の方向でいいかもな。

499:デフォルトの名無しさん
10/04/01 01:58:39
>>496
> Objectが主語

object.getValue();
オブジェクトが値を得るわけじゃないのに主語?
操作の対象なんだから、オブジェクトのその名のとおり、目的語が適当だと思うんだがな。
オブジェクト指向って名前止めて、主観指向に改名すりゃいいのに。
この破綻したパラダイムにはそっちのがお似合いだろーよ。

500:デフォルトの名無しさん
10/04/01 02:09:24
>>496
objectは目的語ですよ。辞書的にみて。。。。。という冗談は置いといて、

objectにmethodというメッセージを送って処理を行わせる。
英語的には、Let object methodという感じなのかな?

こじつけだけど。


501:デフォルトの名無しさん
10/04/01 02:25:46
もっとバトルしてくんねぇかなあ
OOPer vs アンチOOPer

ま、アンチOOPerはOOPを理解できないって点で既に劣ってるわけだがw
理解してたら争う意味もねぇな

502:デフォルトの名無しさん
10/04/01 02:26:56
現実にはやっぱりオブジェクトは目的語だとおもうよ。
コンピュータに処理をさせる対象として「オブジェクト」なんだから。

でも、OOPの世界ではオブジェクトは、まるで主語であるかのような語順だし、
考え方も、オブジェクトを中心に考えるってんだから、
主語にしようと試みてるのだろうね、現実がどうであろうと。
壮大なウソを突き通そうとするのは大変なものだね。頑張れ北朝鮮、まけるな左翼団体。

object1.hoge();
object2.piyo();

とかさー。
個性豊かなオブジェクト達が、
めいめいに、「僕は~する」、「僕は~する」、と、ぶつくさ独り言を唱えてて、
一向にまとまらない様は、オブジェクト指向の本質ですらあると思う。

command( object1, object2 );

と命令してやりたくなる。

503:デフォルトの名無しさん
10/04/01 02:44:06
そんでオブジェクト同士が生命維持装置のごとくメッセージを飛ばしあいこしてさー。
プログラマはそれのご機嫌取りに終始させられて。
んで、オブジェクト当人たちはウジウジしててなかなか他のオブジェクトと関わろうとしないしさ、
誰が音頭取るんだよ、とか思ってたら、コンポーネント!とか叫びながら、
親分クラスが登場してきてさー、
そしたら変な木構造が出来上がって、
こんどは、それにそぐわないような処理は出来ませんとか言い出して、
だったら、単一の木構造は止めようとか言うから、ガベコレだね、って
どーすんのこれ。

504:デフォルトの名無しさん
10/04/01 07:43:23
>>497
ポリモーで動的に管理したら、実際に動いてるクラスが何かを知る方法って簡単には無いよね
インスタンス単位でみないと、アップキャストされた基底クラスなのか
基底クラスのままのインスタンスなのかで違うやろ

いくらクラスで設計しても、インスタンス管理の設計もしなくちゃならんわけだし
貴方の言いたい方向がよくわからん

505:デフォルトの名無しさん
10/04/01 08:06:04
>>504
多態性をC言語で表現するのは無理ではないけど明らかにしんどいし、
「それOOPじゃなくてもできるじゃんwww」の彼としては目を背けたい部分なんじゃないか。

506:デフォルトの名無しさん
10/04/01 08:19:39
>>502
> 現実にはやっぱりオブジェクトは目的語だとおもうよ。

語順的にはそういうケースは多いな。

ただ、オブジェクトを主体として考える概念であることには違いない。
各主体に責務を割り当てて、(君曰くウジウジしてる)オブジェクト同士に適切な関係を設定してやると。
「関数に書かれた手続きをプログラマが仕切ってグワっと並べるのがプログラミングだろ!」
というのは確かに漢らしいかもしれないけど、それで物事が片付くのはかなり小さなシステムに限定される
ということに気づかないと、確かにオブジェクト指向はプログラマの主導権をスポイルする軟弱な概念に見えるのかもな。

507:デフォルトの名無しさん
10/04/01 09:22:32
thread.run()とか、object.toString()とか、すごく自然だ。

508:デフォルトの名無しさん
10/04/01 09:57:31
おまいら実際、どんだけの物を書いたの?
俺はJavaで5万行。Rmi+JDBC+Appletなシステムを一人で書いた。
C++で一万行。PlatformSDK+Win32API使ってエディタ書いた。

一方、Cでは宿題スレの宿題を書いた。
上記エディタは最初BCCのCを使って書いていたが、
なんだが息苦しくなってC++で書き直す羽目になった。
AbstractWindowを作って、色々派生させて画一的に扱いたかったから。

509:デフォルトの名無しさん
10/04/01 10:56:38
批判ではなく、純粋な質問なのだが

何行書いた、というのは具体的にどんな意味があるの?

510:デフォルトの名無しさん
10/04/01 11:13:41
規模の目安。

なるべく簡潔に書く派と、そうでもない派があれど、
百行と一万行は規模が違うし、一万行と十万行も規模が違う。

(そうでもない派ってのは、可読性のため一時変数を導入したり、
コメントもたっぷりつけたり、改行を間に入れがちなスタイルだったり)

おまいらがどんな規模のものを想定して発言してるのか聞いてみたかっただけ。
規模が大きくなればなるほど、カプセル化やポリモーフィズムが恋しくなるから。

511:デフォルトの名無しさん
10/04/01 11:14:00
OOPだと例えばシューティングゲームでの敵を処理する場合
移動する場合 enemy.move() とか書けて
さらに同じ敵でも敵クラス継承すれば enemyTypeA.move() とか enemyTypeB.move() とか
違う敵の種類でも .move() と同じ書き方しても使用するインスタンスにより違う動きをさせることができるから直感的に記述することができる
さらに敵クラスがオブジェクトクラスを継承したものだとすると
それを自機クラスに継承させると myShip.move() と同じように書ける
同じことCでやろうとするとどうなるか
関数名をいくつも用意させなければならない羽目になる
例えば move_EnemyTypeA(EnemyTypeA *enemyTypeA), move_EnemyTypeB(EnemyTypeB *enemyTypeB), move_MyShip(MyShip, *myShip)
とか用意しなくいけなくなり、面倒になる
これがC++なら move() だけで済み、これだけで「動く」という処理を直感的に記述することができる
取りあえずの1例としてOOPの便利さを示した

512:デフォルトの名無しさん
10/04/01 11:52:56
OOPは利点が多々あるが、そんな直感的な記述はすべきではない

513:デフォルトの名無しさん
10/04/01 11:57:25
>>512
なぜだね?

514:デフォルトの名無しさん
10/04/01 13:07:52
根本的に、コンピュータはマシン語でしか動かない
その為、結局どんな手法でも、複雑さは変らないが
手法によって複雑さを、人間に表現させる方法に差が出る(手法や言語は、人間が理解し易くする為の物)

・POA(機能中心アプローチ):”アルゴリズム”を中心に、複雑な処理を表現する
・DOA(データ中心アプローチ):”データ構造”を中心に、複雑な処理を表現する
・OOA(オブジェクト指向):アルゴリズム+データ構造(クラス)の”構造(オブジェクトの連係)”を中心に、複雑な処理を表現する


515:デフォルトの名無しさん
10/04/01 13:41:25
>>493

「彼女を守る」「法律を守る」で「守る」の意味は全然違う。「彼女を守る」ことは「彼女に
従う」ことではない。

英語だと、「I drew a veil」は「私はヴェールを描いた」だが、「I drew a veil over my face」だと、
「私は顔にヴェールをかぶった」となる。

英語のようにメソッドを先に記述すると、解釈が文末までなかなか確定しなくて不便だ。
「Join(Thread)」だと、どうも心が落ち着かない。オブジェクトを先に記述する「Thread.Join()」ほうが
好まれた。

516:デフォルトの名無しさん
10/04/01 14:46:56
メッセージングのアイデアはアラン・ケイの発案だが、彼はこんなふうに説明している。参考まで。

このような柔軟な機能はどれだけ複雑である必要があるだろうか?
文法上は決して複雑で無くてもよい。なじみ深い英語の語順である主語、
動詞、目的語(よく前置詞や、たまに暗黙の主語を伴う)があれば全く十分だ。
オブジェクト指向の言い方で言うと、主語はメッセージのレシーバであり、
文の残りはメッセージだ。《略》という事で、オブジェクトはただ
ネットワーク上のピア・ピア・サーバのように考えられ、使われると考える。
(これは偶然ではなく、六十年代後期におけるARPAnet から Internet にかけての
開発にさかのぼるアイデアを起源とする)。

URLリンク(metatoys.org)

517:デフォルトの名無しさん
10/04/01 15:01:35
アラン・ケイには敬意を表するが、
彼の言ってることをあまり理解したいとは…思わないw

518:デフォルトの名無しさん
10/04/01 15:18:36
class S
{
 void V()
 {
  o.C();
 }
};
こんな感じだと思っていたのに

519:デフォルトの名無しさん
10/04/01 18:21:29
>>515
Thread.Join()の方がキモいと思うがなぁ。
だって、実際にJoin処理を行うのはコンピュータであって、Threadじゃないから。
computer.join(thread)ってイメージ。
今思いついたが、please.join(thread)って書き方が洒落てて面白いかもしれない。
pleaseってクラス作って、グローバルな関数を全部ぶち込んどく(笑

でもさー、
アセンブリでもadd a, bと書くし、Unixのシェルでもcat fileとか書くんだから、
やっぱコマンドが前に来るのが自然な発想なんじゃないの?
不自然なことすると、ウソが雪ダルマ式に膨らんで、どっかで詰むよ。

520:デフォルトの名無しさん
10/04/01 18:32:04
でさー、
目的語を前に置くのは、そう言う方言だから仕方が無い、ということで了承したとしても、
目的語が二つ以上あった場合はどうするんだという問題が残るよね。
(object1, object2).method;
こうは書けないんだろ?
だったら素直に、func(object1, object2);で良いと思うのだが。


521:デフォルトの名無しさん
10/04/01 18:44:25
引数が二個以上あるとややこしい。
strcpyに渡す二つの変数、どっちがsrcかdstか分からなくなる。

str.copyTo(str2)のほうが見やすいのでは? どうかね?

522:デフォルトの名無しさん
10/04/01 20:09:33
>>519
それを言い出すと、そもそも「コンピュータに処理を命令(コマンド)する」という概念自体が
「ウソ」なわけだが。

物理的には電気信号の微細な変化に過ぎないし、理論的にもチューリングマシンの
定義に「命令」とか「コマンド」なんて単語は出てこない。計算機に算譜を入力する行為が
「命令」のアナロジーと相性が良いから、という程度の話。

極端に言えば、コンピュータ技術ってのは、ただの電気信号の変化に過ぎないものを、
いかにうまく「ウソ」をついて、それに何か意味を持っているかのごとく人間に誤解させるか、
そういうものだと言ってもいい。
それを「人間から計算機への命令」という形で見せるか、「計算機の中にある仮想的な
ノード間でのメッセージのやり取り」という形で見せるかは、単に流儀の問題に過ぎない。

そして、>>520-521のやり取りで如実に現れているが、特に二者関係を扱うときに、
「ただ一つの計算機に人間が命令して仕事をさせる」というモデルでは、うまく扱えないことが多い。
そこをうまく概念化して整理できるのが、オブジェクト指向の利点の一つだ。


とりあえず、君がオブジェクト指向の何に躓いてるのかは何となく見えたけど、まぁ、あれだ、
もっと広い物の見方を身につけろ、としか言えんな。
計算機の世界の広さは、人間の発想力の広さと同じなんだよ。それを自分で狭めるこたない。

523:デフォルトの名無しさん
10/04/01 21:10:12
>>518
クラスを作ることはオブジェクト指向言語では必須ではないはず。
クラスをつくらない言語というのもあるから(何かは忘れた)。

あと、インスタンス化のオブジェクト指向言語では必須ではないはず。

C++やJavaはピュアオブジェクト指向言語ではなく、マルチパラダイム言語なんだよね。

>>520
目的語2つというのはおかしいよね。
その場合だと、意味的にはobject1, object2の2つをもつセットにmethodを行わせるという形になるんじゃない。




524:デフォルトの名無しさん
10/04/01 21:12:57
うわ、でたよ。得意技の詭弁。
池沼じみた発言をしてすぐ煙に巻こうとする。
なんでもそうだけど、コマンド的なものが前に来るのが一般的で、
それを否定しようが無いから、電気信号が~とかわけわからんこと言い出す。
if文が {}(x)if だったら嫌だろ?
for文が {}(;;)for だったら嫌だろ?

>特に二者関係を扱うときに、
>「ただ一つの計算機に人間が命令して仕事をさせる」というモデルでは、うまく扱えないことが多い。

簡単だよ。command( object1, object2 ) ほらよ、object1とobject2の2者間の関係をうまく扱えたよ。
「ただ一つの計算機に人間が命令して仕事をさせる」ってモデルは現実を良くあらわしているし、
なにもウソは無いし、それでみんなうまくやってきているわけだから、
それを「うまく扱えない事が多い」って言うのは現実を否定している罠。
だって、一台のコンピュータに命令を下して皆仕事してるんだろ。

それに、2者間の関係を表すのは一般的にはOOPのほうが苦手だ。
object1.relation(object2);
object2.relation(object1);
メソッドをどっちのクラスに実装すべきか迷うし、どっちに実装したとしても不自然で不細工だな。

525:デフォルトの名無しさん
10/04/01 21:18:57
>>523
>目的語2つというのはおかしいよね。
なんでおかしいんだよ。
複数のオブジェクトに対して処理をしたいことだってあるだろ。
目的語は常に一つってのはOOP脳か何かか?

526:デフォルトの名無しさん
10/04/01 21:27:38
前、別のスレであった奴
(map (lambda (x y) (+ x y)) '(1 2 3) '(4 5 6))
map(lambda x,y:x+y,[1,2,3],[4,5,6])

[[1,2,3],[4,5,6]].transpose.map{|x,y| x+y}
rubyの方はあまり直感的じゃないと思う

527:デフォルトの名無しさん
10/04/01 21:37:21
>>524
> if文が {}(x)if だったら嫌だろ?
> for文が {}(;;)for だったら嫌だろ?

逆ポーランド記法、でググってみるといいと思うよ。
ていうか、関数型言語だとそういう感じの記法ってよく見かけないっけ(制御文であるかは知らんけど)。

本題の話をすると、>>522は別に詭弁でもなんでもなくて、むしろコンピュータの本質だよ。
プログラミングというのは、人間の物の見方、すなわち価値観を計算機に入力することだ、と言ってもいい。
オブジェクト指向的な価値観は絶対ではないが、一方で、命令的なパラダイムもある時期に支配的だった
価値観の反映に過ぎない。どちらも、対象をモデル化するためのもので、表現の仕方が違うだけ。

だからこそ、君がやってるように、OOPLでの表現を非OOPLで表現することができるわけだ。
その上で、わざわざ分かりにくく、効率の悪い方法で表現する必要もなかろ、という話。

528:デフォルトの名無しさん
10/04/01 21:55:41
>>520
それよくある。
二つのクラスに密接に関わる関数を、
どっちのクラスにメソッドとして装備させようか、
判断がつかないのな。

結局、Utl とか、Ability とかの名前の静的クラスを用意して、
static な関数を集めることで便利に使えている。
そこに関連する定数も集めておく。

静的クラスは案外使える。
何でも new できればいいわけじゃないって。

>>521
str2 = str1
が一番見やすいと思うw
演算子への適用もOOPの利点だよな。
vector + vector
ができるのがいいんだけどな。

529:デフォルトの名無しさん
10/04/01 22:06:17
逆ポーランド記法ぐらいしってるって。
「嫌だろ」という話をしてるんだ。事実、あんま使われねーだろ、読みにくいから。

ざっくり言うと、今、「後置記法は読みずらいだろ」みたいな話をしているわけでしょ?
なんで、電気信号がどうとかって話になるんだ?詭弁だろ。
それに、コンピュータが「何か」するのは事実だろ。
実際お前の目の前で「何か」しているだろ。
オブジェクト指向みたいに、そう言う風に見せかけているだけじゃなくて、
ハードウェアレベルで「何か」しているよね。
それに指示出すこと考えているんだから、そのハードウェア構成を端的にモデル化した
言語で指示出したいよね?何がある?ただの電卓と違う点は何処?
まずメモリ空間があるよね。次にプログラムカウンタがあるよね。
だったら、プログラミングってのはメモリ空間をどう分割するかという「データ構造」と、
プログラムカウンタをどう制御するかという「制御構造」に終始することになるよね。
OOPなにそれ。オブジェクトがメッセージ投げ合ってどうのこうの?好きにやってよ。
どっかでハードウェア構成とのギャップが出てきて苦しむんだ。
実際のハードウェア構成と合っていない、それが「ウソ」だということだ。
お前の言うわけのわからん「ウソ」の定義と違って明確だな。

530:デフォルトの名無しさん
10/04/01 22:07:09
ベクターの足し算が+で出来るとか、どうでもよすぎる

531:デフォルトの名無しさん
10/04/01 22:18:51
>>529
おまえ、OOPの良さが理解できないんだろ?
OOPすら理解できない能無しは発言しないでくれるかな。

532:デフォルトの名無しさん
10/04/01 22:21:31
俺の知る限り、物事を深く理解する者は、その暗部も認めるものだ。

533:デフォルトの名無しさん
10/04/01 22:26:02
良い部分を知らない奴と、良し悪しの両方を理解している奴じゃ次元が違うっしょ。

534:デフォルトの名無しさん
10/04/01 22:30:48
>>529
これほど歪んだアセンブラへの愛の吐露は初めて見た。

> まずメモリ空間があるよね。次にプログラムカウンタがあるよね。
> だったら、プログラミングってのはメモリ空間をどう分割するかという「データ構造」と、
> プログラムカウンタをどう制御するかという「制御構造」に終始することになるよね。

1. OSや低レベル言語処理系がハードウェアをそういう風に見せているだけ、だけどな。
2. そういう道具立てを使って、異なる価値観に基づいたモデル化をするという方法もあるのだよ。
  仮想化って知ってる?

> それに指示出すこと考えているんだから、そのハードウェア構成を端的にモデル化した
> 言語で指示出したいよね?

実現したいユーザ体験を、簡潔かつ変更に強い形でモデル化できる言語で指示を出したいです。

> OOPなにそれ。オブジェクトがメッセージ投げ合ってどうのこうの?好きにやってよ。
> どっかでハードウェア構成とのギャップが出てきて苦しむんだ。

多少の処理負荷の増大よりも、モデル化のしやすさを追求して人間に楽をさせてくれるのがオブジェクト指向。
ギャップなんてものは、ハードウェア性能の向上で既に吸収されている。

> 実際のハードウェア構成と合っていない、それが「ウソ」だということだ。

単体ハードウェアを前提にするのが好きみたいだけど、
分散コンピューティングとか並行プログラミングって知ってるかな?

535:デフォルトの名無しさん
10/04/01 22:33:05
なんで悪い部分だけをピンポイントで知りえると思うのか。
せっかくなので、OOPの良い部分を語ってもらいましょうかね。
カプセル化?多態?オーバーロード?何が挙がるかな。
でも、多くの人たちが挙げる利点の中には、
OOPとコンピュータの相性が悪い部分を吸収するために
仕方なく追加したような妥協的機能を、何故かありがたがっている変なケースもあるよ。
物は言いようという奴。

536:デフォルトの名無しさん
10/04/01 22:47:34
ほらまたOOP信者の詭弁ごっごが始まった。五万とみてきた。
こういう風になればいいなぁ~ああいう風になればいいなぁ~そんなばっか。
何が出来て何が出来ないかまるで区別が付いていない。
お前に限って言えば、「~って用語知ってる?」
こんなばっか。しかも提灯記事に使われるようなキャッチーな技術用語ばっか。
お前にそれらの用語のバックグラウンドに潜む技術が必要になることは
永遠に無いだろうになー、ご苦労な請った。

> 実現したいユーザ体験を、簡潔かつ変更に強い形でモデル化できる言語で指示を出したいです。
何これ(笑 政治家みたいな言い回しだな。出来るといいね。被れてる間は無理だと思うが。

> 多少の処理負荷の増大よりも、モデル化のしやすさを追求して人間に楽をさせてくれるのがオブジェクト指向。
「追求して」だってさ。いつからOOPはそんな言語になったんだ。
どうやったらそんな無責任で適当な事ばっかいえるのか。お前やっぱおかしいよ。

> ギャップなんてものは、ハードウェア性能の向上で既に吸収されている。
はぁ?実行時のオーバーヘッドのはなしなんかしてたっけ?
ゆわば設計時のオーバーヘッドの話をしていたんじゃないの?大丈夫?

537:デフォルトの名無しさん
10/04/01 22:52:42
>>536
技術的な反論をしてくれないかな。
あと、君の言う「プログラム」というのはどの程度の規模と複雑さを想定している?

538:デフォルトの名無しさん
10/04/01 22:56:14
ちなみに、非スタンドアロン環境(並行コンピューティングとか)に対する反論もまだだね。
ぜひ合理的にお願いしたいところだけど。

539:デフォルトの名無しさん
10/04/01 23:02:01
オブジェクト指向の出発点には些細なウソが含まれてて、
そのウソを突き通すために、OOPで書かれたプログラムやOOP自体が、
雪ダルマ式にファットになってる。
そのウソがあったからこそ、あることに目を瞑ったからこそ、
夢が広がったんだけれど、でも、もともとがウソから始まってるから、
物語は悲しい幕引きになる。現実逃避の産物といえるな。
OOPにあるのは生産性ではなくてエンターテイメント性だったってわけさ。

540:デフォルトの名無しさん
10/04/01 23:02:40
メモリ空間やプログラムカウンタっていうハードウェアがある、とか思ってる件についても聞こうか。

541:デフォルトの名無しさん
10/04/01 23:09:23
オブジェクト指向ってようするにモジュールを分割する手法のひとつでしょ

542:デフォルトの名無しさん
10/04/01 23:12:46
>>519

そう書くと、Computer.Join(Char, String)か、Computer.Join(Thread)とかになる。

文字列結合のJoin()とスレッド同期のJoin()が全く違うことをやるので、気持ち悪い。

あと、String.Replace("a", "b").Replace("c","d")を、Replace(Replace(String, "a", "b"), "c", "d")
みたいに書かなければならなくなる。

>>520

オブケクト配列を対象とするメソッドは、(Object1, Object2).Method()で問題ないだろう。

543:デフォルトの名無しさん
10/04/01 23:15:25
>あと、君の言う「プログラム」というのはどの程度の規模と複雑さを想定している?
これは難しいな。OOPを使わないで、機能ごとにモジュール化していくかぎりは、
モジュールごとで完全なカプセル化が行えるから、それほど複雑にならないし、
規模と複雑さは「なんでも」って事になるだろうな。
OOP使わない方がカプセル化は硬くなるし、オーバーライドやオーバーロードなどの
あいまいさも減るから、安全になる、とは言っとく。
反例挙げるなら再利用性について言及すべきだったな。

>ちなみに、非スタンドアロン環境(並行コンピューティングとか)に対する反論もまだだね。
>ぜひ合理的にお願いしたいところだけど。

ノイマン型コンピュータである限り構造は同じだ。
メモリ空間があって、プログラムカウンタがある。ただ、それらが複数あるってだけだ。
データ構造と制御構造は複雑に成るだろうが、それは、ハードウェア構成が複雑なのだから仕方が無い。
何もウソは無い。

544:デフォルトの名無しさん
10/04/01 23:17:03
>>539
君が言ってる「命令」や「ハードウェア」は、それもまた「ウソ」の産物だというのは既に指摘したよね。

べつに、「ウソ」だから悪いわけじゃない。
人間に対してより素晴らしい「ウソ」をつける計算機環境こそ、我らの目指すべきものだからね。

そして、「ウソ」のつき方も一通りじゃない。
例えば、「ウソ」の上に「ウソ」を塗り固めた環境を用意して、その上でコーディングするというのもアリだ。
早い話が、スクリプトのランタイムとか、Javaや.NETの仮想マシンとかだな。
そういう環境で処理性能も同時に追求したいなら、JITに任せればいいわけだし。

545:デフォルトの名無しさん
10/04/01 23:24:30
>>543
っ【マルチプルインスタンス】

> メモリ空間があって、プログラムカウンタがある。ただ、それらが複数あるってだけだ。

複数あって協調させなきゃいけない時点で、
単純な「人間 vs. 計算機」の命令モデルは破綻するわけですが。

546:デフォルトの名無しさん
10/04/01 23:27:24
>>542
> 文字列結合のJoin()とスレッド同期のJoin()が全く違うことをやるので、気持ち悪い。
そりゃお前普通にコンパイルエラーだろ。オーバーロードなぞ俺も嫌いだ。

>あと、String.Replace("a", "b").Replace("c","d")を、Replace(Replace(String, "a", "b"), "c", "d")
>みたいに書かなければならなくなる。

あーどうしよう、
String.Replace("a", "b").Replace("c","d")
が汚く見えてしまう。

547:デフォルトの名無しさん
10/04/01 23:34:47
>>539
言いたいこと、なんとなくはわかるけど。
関数を構造体と合体させたのは確かに問題が多いかもしれない。

それで、グローバルオンリーの関数群のカプセル化機能が
付加できなかったわけではないし、
構造体だけ継承を付ければ、よかったかもしれない。
とにかく、もっとシンプルな言語の進化であったほうがよかったのは、認める。

僕は、OOPがもっと理想的な状態でコンパイルされれば、
それほど遅くなるはずがないと思っている。
ベースのよりマシン語レベルへの変換が行われにくさがあるから、
コンパイラが完全になりにくいだけなんだよ。
それでも、マシン語レベルまで落とすことは不可能だと思わないし、
現に最近のコンパイラはより速いコードをはくようになった。

上の議論で目的語が二つ以上のとき苦手というのがあったが、
逆に、一つに集中しているときは得意というのもある。
jQueryのメソッドチェーンとかさ。
大規模ならOOPという意見があるが、
クラス設計ミスると、とてつもないことにならんの?
小規模なスクリプト系で、他人が念入りに設計したものを使うのにOOPは便利じゃん。


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch