2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

■ このスレッドは過去ログ倉庫に格納されています

オブジェクト指向の活用方法を教えて下さい

1 :デフォルトの名無しさん:2014/03/25(火) 21:44:07.66 ID:AtcH5MLU.net
お願いします。言語は問いません。
オブジェクト指向言語じゃなくても
オブジェクト指向の話であれば問題ありません。

268 :デフォルトの名無しさん:2014/04/13(日) 19:10:20.98 ID:wSq/pgWA.net
>>267
ダメな理由書いてみ

269 :デフォルトの名無しさん:2014/04/13(日) 19:31:38.05 ID:Vp4hM6j5.net
>>265
それは参照してるオブジェクトが変わったんじゃないの?

270 :デフォルトの名無しさん:2014/04/13(日) 20:05:02.79 ID:+sscY2hT.net
共通の動作がなければ、てんでばらばらって事じゃんw

271 :デフォルトの名無しさん:2014/04/13(日) 20:31:47.78 ID:yhlLeWxx.net
>>269
Smalltalkではbecome:というメソッドで
ポインタレベルでのオブジェクトの差し替えが可能なんで

| x y |
x := y := 'abc'
x become: 3.14.
y. "=> 3.14 "

これを応用してオブジェクトの型の変更も容易なんですよ

272 :デフォルトの名無しさん:2014/04/13(日) 20:36:46.47 ID:1ZgLAbLW.net
>>259
よく知らないんですけどSmalltalkのnilとObjectって
お互い継承関係にあるんじゃないんですか?

273 :デフォルトの名無しさん:2014/04/13(日) 20:46:56.28 ID:+sscY2hT.net
>>271
SmallTalk知らないんだけど、それってxというオブジェクトにbecome:という動作をさせてるの?
そうなら、become:という動作は全オブジェクトに共通だよね。

274 :デフォルトの名無しさん:2014/04/13(日) 20:50:21.03 ID:Vp4hM6j5.net
>>271
Smalltalkよくしらないから適当言語だけど...
x = "x"; y = "y"; z = y;
の状態で
y become: x;
とやったら、
zの指してるオブジェクトは"x"になるって事?

275 :デフォルトの名無しさん:2014/04/13(日) 20:59:39.25 ID:BqlLq9pK.net
>>268
つ proxyパターン

>>272
nilはクラスではないところがポイント。

>>273
全オブジェクトに共通ではない。

>>274
なる。xが"x"のままの流派と"y"になる流派とがある。

276 :デフォルトの名無しさん:2014/04/13(日) 21:09:17.21 ID:1ZgLAbLW.net
よく知らない三連星ワロタ

>>275
なるほどそういう意図ですか
1. nillはUndefinedObjectのインスタンス
2. UndefinedObjectはObjectの継承している
3. Objectはnilを継承している
こうかな?
となると全てのクラスの共通となる祖先が存在してるんで
不要論として出すのはやっぱおかしくないですか?

277 :デフォルトの名無しさん:2014/04/13(日) 21:15:34.64 ID:TiAwmeQu.net
知れば知る程Smalltalkのウンコさが身にしみる

278 :デフォルトの名無しさん:2014/04/13(日) 21:40:50.80 ID:+sscY2hT.net
proxyパターンと共通の動作にどういう関係があるのかわからん。

279 :デフォルトの名無しさん:2014/04/14(月) 03:36:50.26 ID:9JfqG4RHk
てst

280 :デフォルトの名無しさん:2014/04/14(月) 01:57:18.83 ID:QEqaYkvm.net
>>259
要らないつうか、それだと基本的なオブジェクトとしてのふるまいを持ってないから
Objective-Cで生のC関数書いたりObjective-C++でC++のクラス扱ってる状態なだけじゃ…

281 :デフォルトの名無しさん:2014/04/14(月) 19:01:11.23 ID:9oXXilb1.net
>>276
nilはクラスではないから共通の祖先となるクラスではないよ。
というか基底クラスが複数あるのはそんなに珍しいことではないが、
一体何がわからないのかわからない。

282 :デフォルトの名無しさん:2014/04/14(月) 20:50:15.58 ID:2o5NlHiv.net
>>281
nilを継承できる事と所謂Object型が不要になる事の繋がりが分からないんですよね
nillオブジェクトとObjectクラスは親子関係にあるのになんでだろう
って思って質問したんです

283 :デフォルトの名無しさん:2014/04/14(月) 21:32:49.46 ID:1BzKypQe.net
> 3. Objectはnilを継承している
それが真であれば、Objectはnilの特徴を持っていないといけない。
Objectはnilではないので、これは間違い。

284 :デフォルトの名無しさん:2014/04/14(月) 21:40:20.78 ID:KfO5hauH.net
>>280
要らないんじゃなくて、あった方がやり易いってことだよな。
別にObjective-CでもNSObject無視してクラス自作できるけど、まずそんな事しない。

285 :デフォルトの名無しさん:2014/04/14(月) 21:41:56.76 ID:kBF05cIr.net
Rubyだと
・nil は Nilクラスの唯一のインスタンス
・NilクラスはObjectクラスから派生したサブクラス

$ irb2.0
irb(main):001:0> nil.class
=> NilClass
irb(main):002:0> NilClass.superclass
=> Object

Smalltalkは知らん

286 :デフォルトの名無しさん:2014/04/14(月) 22:20:14.96 ID:2o5NlHiv.net
>>283
あ、そうなんですか
Wikipediaに
> 基本的な派生元となるObjectやProtoObjectは、それらから派生したUndefinedObjectのインスタンスオブジェクトであるnilを継承しており再帰関係を持つ。
と書いてあったんでそういうものだと思ってました
あと
Object isKindOf: nill
が true を返すのはなんででしょう?

287 :デフォルトの名無しさん:2014/04/15(火) 04:06:44.72 ID:wLbFOpnz.net
>>285
つまりnilとNilは別々のオブジェクトであり、
NilがObjectのサブクラスであることとnilは何の関係もない、
ということだね。

>>286
つまりnilとUndefinedObjectは別々のオブジェクトであり、
UndefinedObjectがObjectのサブクラスであることとnilは何の関係もないし、
nilはクラスではないし
Squeak4.4ではObject isKindOf: nilはfalseだし、
Object new isKindOf: nilもfalseだし、
仮にtrueになる処理系があっても、nilはクラスではないからnilはObjectの基底クラスではない、
ということだね。

288 :デフォルトの名無しさん:2014/04/15(火) 18:46:18.65 ID:4TC7MUH1.net
>>287
ありしゃす、Object isKindOf: nil の結果は実装依存なんですね
true になるのはGNU Smalltalkでした

289 :デフォルトの名無しさん:2014/04/15(火) 20:46:27.61 ID:d1+oXg+5.net
>>287
>つまりnilとNilは別々のオブジェクトであり、

nil はインスタンスでありNil はクラスだから、別々のオブジェクトってこと


>NilがObjectのサブクラスであることとnilは何の関係もない、

Nil と Object とは「サブクラス-スーパークラス」という継承関係であり、
Nil と nil とは「クラス-インスタンス」というインスタンス化関係であり、
二種類の関係をごっちゃにしてはいけない、ってこと

290 :デフォルトの名無しさん:2014/04/15(火) 21:07:45.24 ID:d1+oXg+5.net
>>286
>> 基本的な派生元となるObjectやProtoObjectは、
>>それらから派生したUndefinedObjectのインスタンスオブジェクトである
>>nilを継承しており再帰関係を持つ。

Rubyの場合
・ClassクラスのスーパークラスはModuleクラスである(継承関係)
・ModuleクラスのスーパークラスはObjectクラスである(継承関係)
・ObjectクラスはClassクラスをインスタンス化したオブジェクトである(インスタンス化関係)

$ irb2.0
irb(main):001:0> Class.superclass
=> Module
irb(main):002:0> Module.superclass
=> Object
irb(main):003:0> Object.kind_of?(Class)
=> true

結果として、各クラス間の関係は「循環的」に定義されることになる
ただしRubyコミュニティでは、それを(その循環関係)を「再帰的」と呼ぶ事はない

Smalltalkは知らんけど、おそらく、そのWikipediaの著者が
継承とインスタンス化をごっちゃに理解しているんじゃないかと思われ

291 :デフォルトの名無しさん:2014/04/15(火) 21:25:46.27 ID:POAb9xNt.net
>>288
GNU Smalltalk は名前から受ける印象と違って
単なるファンお手製の勝手実装なうえに、
Smalltalk としてもかなりの変わり種なので
あれを元に Smalltalk がどういうものか学ぶのはちょっと問題が。
できれば VisualWorks 、悪くても Squeak/Pharo で
試すようにするのがよいと思います。
(これらの処理系はそれぞれ独自の進化を遂げてはいますが、
いちおう古典的 XEROX Smalltalk-80 からの直系の派生物で、
その名残を多く残しています)

292 :デフォルトの名無しさん:2014/04/15(火) 22:39:29.15 ID:4TC7MUH1.net
>>290
https://www.ogis-ri.co.jp/otc/hiroba/technical/Squeak4/S4-5-4_1.html
http://pharo.gforge.inria.fr/PBE1/PBE1ch14.html
を読んでみましたが

1. ObjectクラスはObject class(メタクラス)のインスタンス
2. Object class(メタクラス)はClassクラスを継承している
3. ClassクラスはClassDescriptionクラスを継承している
4. ClassDescriptionクラスはBehaviorクラスを継承している
5. BehaviorクラスはObjectクラスを継承している

って事で、Wikipediaの言う再帰関係は成り立ちますね
nilの存在は謎のままですが
間違ってたら教えて下さい

>>291
情報ありしゃす!
勉強はGNU以外でやります

293 :デフォルトの名無しさん:2014/04/15(火) 22:48:36.35 ID:8/R6vbb5.net
大量のベクトル演算をオブジェクト指向で行うのはいい考えではありませんでした。
パフォーマンスが話になりません。

あらためてオブジェクト指向の活用方法が知りたいです。

294 :デフォルトの名無しさん:2014/04/15(火) 22:56:10.29 ID:TDL51eos.net
あたりまえやないかw インラインでやれ。

295 :デフォルトの名無しさん:2014/04/16(水) 05:01:31.46 ID:ZBBb0DXo.net
>>292
それはmeta cyclicというのであってrecursionとは全く別だよ

296 :デフォルトの名無しさん:2014/04/16(水) 08:21:50.02 ID:A1GSn+hc.net
>>295
http://upload.wikimedia.org/wikipedia/commons/f/f9/Smalltalk_80_metaclasses.svg
を拝借するとrecursionはどの部分になりますか?(または当て嵌まらない、とか)
MetaclassとMetaclass classがrecursion?
と言うかmeta cyclicとrecursionは定義はどこを調べればいいんでしょうか
あー分かんなくなってきた

297 :デフォルトの名無しさん:2014/04/16(水) 17:33:35.89 ID:ZBBb0DXo.net
>>296
まず、
全てのクラスの基底となるクラスが存在するかどうかという>>255の話は継承関係の話で、
クラス-インスタンス関係で構成されるメタタワーの話である>>296の話とは
全く別々の話だということはOK?

298 :デフォルトの名無しさん:2014/04/16(水) 18:10:12.53 ID:A1GSn+hc.net
>>297
はいそれは分かってるつもりです
自分が疑問に思ったのは>>259なんで、
nilを継承できる事とObjectが不要である事の関連性を
説明して貰えるとありがたいんですが…

299 :デフォルトの名無しさん:2014/04/17(木) 03:03:07.59 ID:g3SPX8xq.net
isKindOf:等のクラス階層へのアクセスを使わない限りにおいて、
全てのクラスは基底クラスから継承したインスタンス変数やメソッド等を取り込むことで
nilからの継承による実装に置き換えることが出来るのはOK?

300 :デフォルトの名無しさん:2014/04/17(木) 06:51:39.99 ID:XZy5mn+7.net
>>299
はい、続けて下さい

301 :デフォルトの名無しさん:2014/04/17(木) 07:01:46.34 ID:g3SPX8xq.net
>>297>>299を前提とすれば、
全てのクラスの基底クラスとしてのObjectは不必要であることは自明だというのはOK?

302 :デフォルトの名無しさん:2014/04/17(木) 07:48:37.17 ID:XZy5mn+7.net
>>301
いいえ、その飛躍が判りません
nilにObjectクラスと同じ能力があるからObjectクラスは不要だという事ですか?

303 :デフォルトの名無しさん:2014/04/17(木) 09:46:27.34 ID:g3SPX8xq.net
>>302
いいえ、nilにObjectと同じ能力があるなんて誰か言ってるのですか?

304 :デフォルトの名無しさん:2014/04/17(木) 19:48:33.36 ID:XZy5mn+7.net
>>303
じゃあ>>299の解釈が間違ってますね
うーん、Objectの代わりにnilから派生できるよ、としか汲み取れません
でもそれだとクラス階層のルートの必要性とは無関係の話だから違うんだろうな

自明の部分を取り違えないように省略せず説明して頂けませんか?

305 :デフォルトの名無しさん:2014/04/18(金) 02:02:31.47 ID:3m4Hm4jr.net
今更な反応だけど
メソッドチェーンのデバッグどうのこうのは
パワーアサートである程度解決できるんじゃね

テストとデバッグを同一視すんなとか言われそうだけど
そこはなんやかんやで

306 :デフォルトの名無しさん:2014/04/19(土) 11:19:09.69 ID:fQ1JDqwN.net
みんなモデリングツール使ってる?

307 :デフォルトの名無しさん:2014/04/19(土) 15:25:11.54 ID:7lbU/Cwq.net
UMLは手書きのノートに万年筆で描いてるけど?

308 :デフォルトの名無しさん:2014/04/19(土) 15:25:52.03 ID:7lbU/Cwq.net
ああ、もうすぐ司法試験なんだよなぁ・・・
今年も申し込みしてねーや。
仕事辞めたいわ

309 :デフォルトの名無しさん:2014/04/19(土) 15:28:51.08 ID:oGrzc7nx.net
ぜひ弁護士資格を取って人売り屋を訴えてやってください。

310 :デフォルトの名無しさん:2014/04/19(土) 15:32:20.57 ID:7lbU/Cwq.net
弁護士より裁判官志望なんだけどな。
知財専門の裁判官やるわ。

311 :デフォルトの名無しさん:2014/05/02(金) 02:53:15.17 ID:sB1UFa5X.net
裁判官になるのはある意味、終身刑になるようなもの
仕事にやりがいはないし、趣味、嗜好、信仰の類は一切行えない
どうしてもやりたいというなら止めないが、いいもんじゃないぞ

312 :デフォルトの名無しさん:2014/07/11(金) 14:24:19.29 ID:u5XcYD/q.net
確かに日本語ネイティブじゃないと解り難い表現ではある

313 :デフォルトの名無しさん:2014/10/15(水) 02:03:28.04 ID:fxqbNGWP.net
急にスレが死んだ

314 :デフォルトの名無しさん:2014/10/16(木) 17:21:37.89 ID:MhzmuNOz.net
>>217
>ライナスは OO をぼろくそにけなしているね

Linusが批判したのはOOPじゃなくてC++だろ(Cとの比較で)。

315 :デフォルトの名無しさん:2014/10/18(土) 12:18:53.66 ID:/oNwCDSd.net
似たようなものさ‥Linus が GC の存在を受け入れるわけがない

316 :デフォルトの名無しさん:2014/10/18(土) 15:46:58.25 ID:7/IQKq91.net
そりゃ、カーネルやドライバレベルの開発でGC付きの言語環境は要らんわ。
OOPの話題でリーナス発言を引き合いに出すのは的外れすぎる。

317 :デフォルトの名無しさん:2014/11/05(水) 13:15:41.31 ID:QbWIQhdw.net
OOPって結局、こういう考え方すれば分かりやすくなりますよって例でしかないからな
その考え方を前提に置けば、こういう表現ができますよって利点はいろいろな実装があるけど

完全性や効率性を犠牲に、可読性を上げて保守性や再利用性、試験性なんかを上げましょうってそういうものだと思うんだけど

318 :デフォルトの名無しさん:2014/11/05(水) 20:29:01.97 ID:NM+61D3j.net
OOPって結局、…でしかないからな

という奴って、OOP以外にも関数型言語でもアジャイルプロセスでも受託ビジネスでも
みーんな「結局、…でしかないからな」とわかったような気になるだけで
実際には何も身についてないんだよなw

319 :デフォルトの名無しさん:2014/11/05(水) 23:26:57.45 ID:UbfQ7xJO.net
オブジェクト指向は愚かな考え。排便メソッド2 [転載禁止]©2ch.net
http://peace.2ch.net/test/read.cgi/tech/1415122540/

320 :デフォルトの名無しさん:2014/11/06(木) 08:17:55.90 ID:WCLQna6c.net
>>31
「結局、ただの方法論でしかないからな」

方法を知っているかとそれをビジネスで生かせるかは全く別のスキルだしなー

321 :デフォルトの名無しさん:2014/12/15(月) 00:00:56.39 ID:Ovh10mZl.net
カプセル化 ポリモーフィズム 継承を理解して設計出来る人って実際、何人に一人ぐらいに感じる?

322 :デフォルトの名無しさん:2014/12/15(月) 09:52:17.25 ID:z8CdksSX.net
ひとそれぞれ解釈違うからなんとも言えん

323 :デフォルトの名無しさん:2014/12/15(月) 11:05:06.23 ID:cy4sFuPq.net
カプセル化&オブジェクト化の行き先は関数型プログラミングじゃないの?

324 :デフォルトの名無しさん:2014/12/15(月) 12:54:30.82 ID:t6/tpY1X.net
絶対違う

325 :デフォルトの名無しさん:2014/12/15(月) 15:09:37.42 ID:2aP18QTz.net
>>323
北極と南極の違いだろ。
OOPの落伍者のパラダイスが関数型なんだから。

326 :デフォルトの名無しさん:2014/12/17(水) 11:09:29.57 ID:N1jNpsSg.net
ポリモーフィズムは分かりやすいんだけどカプセル化がいまいちわからない
ゲッターセッター書いて何になるの?ってレベルの理解しかないから優しく教えて

327 :デフォルトの名無しさん:2014/12/17(水) 11:58:16.14 ID:qGVIuFRu.net
>>326
カプセル化はむしろ単純セッター書いたら負け
そのクラスの機能のみ提供して、内部実装を隠すのが要点

328 :デフォルトの名無しさん:2014/12/17(水) 13:49:16.52 ID:dSysfVHr.net
カプセル内では、他のオブジェクトの定義を知らなくても済むように書く。
閉じたオブジェクトにすればいい。

329 :デフォルトの名無しさん:2014/12/17(水) 17:36:45.21 ID:FGZvKMUK.net
>>326
基本的にそのクラスのメンバーはそのクラス内でいじられることを保障するため。

330 :デフォルトの名無しさん:2014/12/17(水) 18:56:34.51 ID:qGVIuFRu.net
実装を隠す
→知らなくても使えるように設計する
→使い方さえ変えなければいい
→中は変え放題、新しい使い方も追加放題

>>329
よくあるサンプルみたいに全メンバアクセッサ実装してるようなクソクラスだと
その原則破るための効果の方が強くなってしまうからなぁ

クラスの中から≠クラスファイルの中から
クラスの中から=クラス機能の中から

331 :デフォルトの名無しさん:2014/12/17(水) 19:24:20.07 ID:N1jNpsSg.net
327-330
いろいろありがとう
公開したいとこだけ公開すりゃいいのね

332 :デフォルトの名無しさん:2014/12/17(水) 19:38:57.10 ID:y3DoL19d.net
極論を言えば「公開」したら負けなのがカプセル化

333 :デフォルトの名無しさん:2014/12/17(水) 21:14:17.50 ID:lLmQTo2M.net
>>326
getter-setter をかましておけば、なにかのときに簡単に監視やフックを追加できる

334 :デフォルトの名無しさん:2014/12/17(水) 22:00:02.25 ID:adMFmMY0.net
>>333
ちょっとした用途ならリフレクションから呼べば良いじゃん
機能として提供する必要が出来たならそんな直接参照するような裏ワザ使わないで継承するなり追加するなりしようよ

影響が外に広がらないようにカプセル化して直接参照する手段を封じるんだから
直接参照できるセッターやゲッターつけたら保証できなくなるじゃん

335 :デフォルトの名無しさん:2014/12/17(水) 22:40:02.99 ID:lLmQTo2M.net
>>334
リフレクションは悪、コンパイル時に検出できるエラーがリフレクションにすると検出できなくなってしまう‥
まあ何でもかんでもsetter-getter で公開してしまうのはどうかと思うが(ましてやプロパティを公開してしまうのは最悪)

336 :デフォルトの名無しさん:2014/12/18(木) 15:10:59.93 ID:ZOTu6c+H.net
おいおいインスタンスにアクセサなかったら、
そいつの状態を変えたりモニターしたりどうやるんだよ。

337 :デフォルトの名無しさん:2014/12/18(木) 15:18:48.22 ID:hbsgKLA0.net
>>336
状態をモニタするのは「モニタする」メソッドでやるべきじゃね?
状態を変えるなら、状態を変えるメソッドを通すべきだと思うし

もちろん、カプセル化の観点から見たら、の話ね
何か目的があってカプセル化を崩すなら、それはそれだろうし

338 :デフォルトの名無しさん:2014/12/18(木) 15:31:32.87 ID:ZOTu6c+H.net
いやそのためのメソッドがsetter/getterだろうと。

339 :デフォルトの名無しさん:2014/12/18(木) 16:01:52.60 ID:a38PRbZq.net
>>335
> ましてやプロパティを公開してしまうのは最悪
.NETのクラスは山ほどプロパティを公開してるけど、これも最悪なの?

340 :デフォルトの名無しさん:2014/12/18(木) 22:10:35.29 ID:nYq1QBRW.net
>>339
>>335 はプロパティをフィールドと混同している気がする。
フィールドを公開するのが最悪、なら納得できるもん。

>>338
setter/getterはあくまで、結果としてそうなるだけのものだよ。

あくまで例えばの話だけど setLeft(), setRight(), setWidth() という3つのsetterがあったとして、
内部データは「left,right」でもいいし「left,width」でも「center,width」でも
「center,half_width」でもいい、もっと言えば「width,right」でも構わない。
まあよほど処理上の都合がないかぎり最後のを選ぶ人は少数だと思うけど、
どれが単純なsetter/getterになるのか、どれが違うのかは外からは分からない。
そして、それは分からなくていいものだと思うよ。

状態が最初にあって、それを見たり弄ろうと思うとsetter/getterになっちゃうけど
まずそのオブジェクトで何をしたいのかを考えて、それを実現するための内部構造と考えると
自然とカプセル化されてくもんじゃないかな。

341 :デフォルトの名無しさん:2014/12/18(木) 22:32:07.68 ID:ZOTu6c+H.net
>>340
いやだからアクセサでオブジェクトの状態を変える・モニターするのは別に普通だろと言ってるの。

342 :デフォルトの名無しさん:2014/12/18(木) 22:55:00.66 ID:CbZTNJ5S.net
Entityにgetsetつけてるのって何も考えてないとしか思えない

343 :デフォルトの名無しさん:2014/12/18(木) 23:22:15.68 ID:rHvMFTQj.net
状態変更やモニタするメソッドの名前をgetやsetにするのは自由だけど・・・命名規則的にそれってどうなの?
それに当然モニタリング機能を提供すべき責任を負ってるクラスだけだからな

状態を変更するメソッドならバリデーションや整合性チェック、状態変化に伴う動作まで含めて一つの完結した機能として定義すべきかな
状態変化監視するならオブザーバパターンで、JavaならpropeatyChangeListenerとか
実装して受け取るべきだと思う
もしくは監視用ステータスオブジェクトを返す感じとかか?

344 :デフォルトの名無しさん:2014/12/18(木) 23:28:53.90 ID:ZOTu6c+H.net
ああ、俺が言ってるのは単純にプロパティの事だよ。

345 :デフォルトの名無しさん:2014/12/19(金) 00:08:44.41 ID:Z5vGYKdT.net
こういう説明はどうだろう?
NG:状態変数を取得するために状態変数取得メソッドを作った
OK:状態取得メソッドを作ったので保管場所として状態変数を作った

少なくとも設計段階でデザインするべき物かな
そうやってデザインの結果として一部にクラスに、
結果的に単純プロパティのような形の実装になった物が出来るの悪いことではないと思う

346 :デフォルトの名無しさん:2014/12/19(金) 00:25:25.61 ID:kXOboZoh.net
始めからプロパティとして定義するものもあれば、
プライベート変数を後からプロパティに変更する事もあれば、
プロパティだったものをプライベート変数に変更する事もあるよ。

347 :デフォルトの名無しさん:2014/12/20(土) 09:38:36.96 ID:+GgZ8JtG.net
CTMCPでggr

348 :デフォルトの名無しさん:2014/12/25(木) 01:56:12.77 ID:FXTtDPDb.net
C++とかjavaは元来の意味でのオブジェクト指向じゃないからね
あくまで、オブジェクト指向に便利な機能つけた手続き言語

オブジェクト指向をきちんと使いたいならsmalltalk参考にしてる言語のほうがいいと思われる


例として、整数を文字列に変換するときに
Java
String.valueOf(48)

Ruby
48.to_s

48さんに文字列になって欲しければ、48さんのメソッド呼ぶのが本来のオブジェクト指向ー

349 :デフォルトの名無しさん:2014/12/25(木) 02:01:12.47 ID:FXTtDPDb.net
同じように、通信をするconnectionってインスタンスがあったとして

connection.status = Status::FINISHED

とかやっちゃうのはオブジェクト指向らしくなくて

connection.finish

で、終了処理から内部状態変更やらやってくれるのがオブジェクト指向

350 :デフォルトの名無しさん:2014/12/25(木) 03:27:23.93 ID:plZQlrr3.net
>>348
Staticメソッドを引き合いに出してJavaをけなしてもねえ……

351 :デフォルトの名無しさん:2014/12/25(木) 03:29:07.82 ID:EL6gBj3v.net
>>348
そりゃ OO 的には美しいが、レジスタ一個で収まるところをごてごてとデコレートするのもね‥

352 :デフォルトの名無しさん:2014/12/25(木) 14:56:46.31 ID:UXO0kBFe.net
手続きとOOを排他扱いする時点でお察し

353 :デフォルトの名無しさん:2014/12/25(木) 15:07:57.78 ID:ZM9QeVU6.net
まぁ、速度優先するならOOPだの関数型だの構造化だのオーバーヘッドの必要なルール止めて
シーケンシャルに処理手書きしていけよってなるしな

保守性とかほかの目的で冗長な記述をルール化してるんだし

354 :デフォルトの名無しさん:2014/12/27(土) 21:08:42.89 ID:Dl8SRIg9.net
文字列とか数値とか考えないのがオブジェクト思考じゃないの?

355 :デフォルトの名無しさん:2014/12/31(水) 03:38:42.55 ID:GtslL7/x.net
基底クラスが「人」で、3つの派生クラスを作ってそれぞれに「.work()」を記述した場合で
3つの派生クラスの全インスタンスの「.work()」を実行したいときどのように管理すれば良いのでしょうか
自分では派生クラス毎にループを回すことしか思いつきませんでした

356 :デフォルトの名無しさん:2014/12/31(水) 07:56:11.57 ID:grXbYJWV.net
基底クラスにwork()を定義して、派生クラスでオーバーライドするとか

357 :デフォルトの名無しさん:2014/12/31(水) 11:53:58.04 ID:HNmCF9/p.net
>>355
「職業」インターフェースを追加して、work()を定義するかな

work()を使う側は、人に対して命令しているのではなく、職業の役割に対してその通り働けと言ってるわけだから

358 :デフォルトの名無しさん:2014/12/31(水) 17:22:24.60 ID:/ugoQQzd.net
>>355
そんなん、クラスが「基底か」「派生か」ということとは関係ないじゃん。

基底クラスのインスタンスを複数作成した場合でも、同じでしょ。

複数インスタンスに同時にメッセージを送るということなんだから。

ヒントはリスナー。

359 :デフォルトの名無しさん:2014/12/31(水) 19:32:50.12 ID:NQSYJ4L5.net
>>355
> 3つの派生クラスの全インスタンスの「.work()」を
> 実行したいとき

例えば Smalltalk なら

人 allSubinstances do: #work

とかそういうこと?

360 :デフォルトの名無しさん:2015/01/01(木) 10:15:28.02 ID:J+tSiQ0Q.net
Javaでクラスメソッド書いてると罪悪感あるんだけど、
副作用のない関数を書くんなら問題ないよね?

OOPっぽくないというのが罪悪感の原因だろうけど、
public staticで副作用のない関数だとむしろ書いていくべきだよね?

361 :デフォルトの名無しさん:2015/01/01(木) 10:29:00.83 ID:unDf2EkN.net
>>360
気にするとすれば、そのクラスに対して作用を持たないメソッドが何でそのクラスにあるの?ってところかな

クラスって、データと「そのデータに対する」操作の集まりだから。
影響を受けるデータの方に自身の操作として定義した方が良くない?

良くあるアンチパターンの機能クラスと、データクラスに分かれちゃってる手続き型設計

362 :デフォルトの名無しさん:2015/01/01(木) 10:49:25.84 ID:ZjnnyCSc.net
> そのクラスに対して作用を持たないメソッドが何でそのクラスにあるの?ってところかな

クラスを定義しないと関数を書けないからね。

> クラスって、データと「そのデータに対する」操作の集まりだから。

Math.sinなどのメソッドは、どのデータに対する操作かな?
やっぱ、関数、っていう使い方は生き残ると思うんよね。

363 :デフォルトの名無しさん:2015/01/02(金) 03:24:38.38 ID:Urv5GfAa.net
オブジェクト指向的にはstrategyっぽくオブジェクトにしとくべきなんだろうとは思う

んで、普通はAngleオブジェクトがあってそれがsinやらcosやらのオブジェクト持ってる感じじゃない?

364 :デフォルトの名無しさん:2015/01/02(金) 18:16:39.18 ID:u8eIFPVv.net
この話題でJava固有の話をするのは本意ではないんだけど、
やっぱプリミティブ型ありきの現状考えると、
式の中にAngle a = new Angle(PI/4)からのa.getSin().doubleValue()みたいなんが出てくるのも、
式の途中で new Angle(a + b) みたいな生成が混じるのもシンドイ気がする。

次に、プリミティブ以外に目を向けたとしても、
関数的に表現したほうが自然に見える操作もある。
たとえばファイルのコピーをするメソッドを考えたとき、
file.copyTo(other)というふうにするより、
FileUtils.copy(File src, File dst)となってるほうが自然に見える。
実際、Javaの標準ライブラリにおいてもjava.nio.file.Filesにおいて、
public static Path copy(Path source, Path target, CopyOption... options)
となってる。これも関数的アプローチの無くならない理由というか証拠のような気もする。

365 :デフォルトの名無しさん:2015/01/02(金) 18:23:55.66 ID:IjnWDn9W.net
>>364
public static Angle fromDegree(double degree);
public static Angle fromRadian(double radian);
public double sin();
public double cos();
...
でいいじゃん。
Angle.fromDegree(45).sin()とか。

366 :デフォルトの名無しさん:2015/01/02(金) 20:15:57.81 ID:86rXEaVV.net
三角関数自体は角度の持っている特性だからAngleから取り出せるものだけど、
数学としてそれを導き出す関数で概念化した法則≒数式はMathとして定義されていてもおかしくはないか

ただ、数式自体はオブジェクト(物)を扱わず、その法則のみを抜き出して机上で扱う関数の集合、
数学自体が物事をオブジェクトで表現せずに、関数で表現したもの(ただし、直接使え無いと超非効率になる)
って感じかな

>>364
ファイルのコピーはファイル自体の機能ではなく、その上のストレージに自身の保持してるファイルを複製せよって命令する感じのような

367 :デフォルトの名無しさん:2015/01/02(金) 21:02:15.51 ID:gr/6otir.net
>>365
そのnewを書く書かないとかcreateメソッドを準備するとかは興味なくて、
パラメータ→結果 で済む世界の話に短命オブジェクトを挟むのが嬉しくないよね?
絶対嫌だとか、困るとか言うつもりもないけど、今んとこメリットも見えないような。

>>366
関数型言語に詳しくてウンチクのひとつも言えるなら、
この気持ちスッキリ表せるんだろうけど、今の俺が言えるのは、
関数ありだよね、特に、式には関数だよね、みたいなことだけ…。

ファイルのコピーの例はご指摘を受け、自分の中では少なくとも、
「メソッド方式よりも、関数方式でスッキリする例」で無くなってしまったw
関数方式でスッキリするのはやっぱ数式関係だけ、なのかも。

368 :デフォルトの名無しさん:2015/01/02(金) 23:29:08.38 ID:Wdw9kQqY.net
基本的に読みやすいと言うか、その処理がどういう本質のものかをコード自体で示してるのが良いコードなワケで
数学関係の処理は、元が元だけに関数形式が一番本質に近いから、そりゃ関数形式が読みやすくもなるわな

総レス数 429
140 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★