X



オブジェクト指向の活用方法を教えて下さい
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2014/03/25(火) 21:44:07.66ID:AtcH5MLU
お願いします。言語は問いません。
オブジェクト指向言語じゃなくても
オブジェクト指向の話であれば問題ありません。
0177デフォルトの名無しさん
垢版 |
2014/03/30(日) 19:02:38.40ID:qe+yThv9
>>176
なんだ、昨日の続きならそうかけよ

当然、 fooとbarとかの名前なら書いたやつが無能なだけ。
jQueryとかrubyみたいにわかりやすい名前がいい
中身はどこかでまたつかうとか、メソッドチェーンでシンプルに書けるなら有用かもしれない


オブジェクト指向は完璧ではないし、スキルがない人ならやらなくてもいいんじゃない?
ただし、C#とかJavaみたいにオブジェクト指向ありきで設計された言語はやっぱり知識は必要
標準ライブラリ自体オブジェクト指向専用だからね
C#でStreamではなくFileStreamしか受けないメソッドとかを作ってしまったら不便だし、不要なフィールドを公開したら危険だ
0178デフォルトの名無しさん
垢版 |
2014/03/30(日) 22:50:01.50ID:rCEPh8in
>>176
オブジェクト指向を使うと、同じものを2つ以上同時に扱うのが簡単なんだよね。
2つのファイルを同時に編集するとか
ぷよぷよの画面を2つならべてみるとか
5人のボンバーマンが同時に動くとかさ。
0179デフォルトの名無しさん
垢版 |
2014/04/01(火) 20:30:56.47ID:c88mFqYR
>>173
スモールトーク系のデバッガーはメソッドチェーンのそれぞれのメソッド呼び出しごとにステップ実行できるらしいよ
0181デフォルトの名無しさん
垢版 |
2014/04/02(水) 21:15:51.80ID:R40jOAQ7
性能低下を防ぐためにメソッドの内容をメインルーチンに直に展開する作業は、
処理系にまかせることもできるだろうが、それによって多態性は失われる。
それよりもソフトウェアを細かく分割して構成する以上、バージョンの依存
関係が複雑に絡み合うほうが問題として大きい。
0182デフォルトの名無しさん
垢版 |
2014/04/02(水) 21:49:26.89ID:YdJBhj/R
>>180
スモールトークっていったらスクイークとかじゃないの?
口先番長認定するまえに自分で調べてみたの?
口の中にご飯をスプーンで入れてもらうまで
馬鹿みたいに口開けて上を向いているタイプの人なの?
0184デフォルトの名無しさん
垢版 |
2014/04/03(木) 00:45:59.14ID:OChVK7bs
>>4
ポリモーフィズムはリリースされたプログラムをユーザーが部分的に更新しな
がら使う(ライブラリやDLLを更新する)と、プログラマが当初考えていた以上
の使われ方をして、動作の保証ができなくなる、ってことにならないの?
昔でいうgoto文や、メモリーリークを起こしがちなC言語のポインタみたいに
やっかいなことにならないの?
0186デフォルトの名無しさん
垢版 |
2014/04/03(木) 02:22:36.23ID:Dr19mwRL
メソッドごとにコメントアウトすればいいよ
てかメソッドチェーンとしてのチェックってあるかね
0189デフォルトの名無しさん
垢版 |
2014/04/03(木) 08:26:44.88ID:oN99KWq6
いい加減に認めろよ……

そもそも仮に「メソッドチェーンはデバッグできない」としても、それは「オブジェクト指向」を否定するのに大事な要素でもないじゃん
何かこだわりでもあるの?
0190デフォルトの名無しさん
垢版 |
2014/04/03(木) 08:48:37.07ID:syg3Ul2m
>>189
> いい加減に認めろよ……

何を認めるんだ?
ブレーク掛けられるなら >>151
が情弱と言うことだし、かけられないなら >>156 が口先番長と言うだけのことだろ。
どこから、オブジェクト指向の否定が出てきたんだよ (w
0191デフォルトの名無しさん
垢版 |
2014/04/03(木) 15:05:44.04ID:v6ez+Y0x
>>188
ちゃんとしたSmalltalk処理系では(つまりGNU Smalltalkとかの変わり種を除けば)一般に
value foo halt bar baz で、bar のコール直前でデバッガを起動させて bar のステップ実行ができる
ってそういうことではなく? ちなみに halt は古典的なSmalltalkにおけるブレイクポイントみたいなもの。
0193デフォルトの名無しさん
垢版 |
2014/04/03(木) 17:07:01.60ID:4OpITLe5
スモールトークがオブジェクト指向の元祖だからな
スモールトークでできるならオブジェクト指向の欠点とは胃炎な
0194デフォルトの名無しさん
垢版 |
2014/04/03(木) 17:16:43.96ID:hov1QvrO
ていうか、一つの式に詰め込んだら便利かどうかなんてオブジェクト指向と関係なくね?
0195デフォルトの名無しさん
垢版 |
2014/04/03(木) 19:17:35.74ID:/A78gSRK
Smalltalkには、コードを英文のように読み下せるように書く慣習みたいなものがあって、
value foo bar baz みたいな式だとちょっとメリットをイメージしにくいですが、たとえば
「1 から 9 までの数を配列にして、それをシャッフルして最初の3つを得る」みたいな処理を、
(1 to: 9) asArray shuffled first: 3 というふうに一気にメソッドチェーンにして書くようなことはよくします。

そんなこともあって、メソッドチェーンだからデバッグしづらいというような制約はほとんどうけない仕組みになっています。
0197デフォルトの名無しさん
垢版 |
2014/04/03(木) 21:23:31.55ID:y3U0PHNW
>>191
なるほど、ブレーク+ステップ実行なのね
まあ実用上は十分かな
C# とかでもできるようにしてほしい
0198デフォルトの名無しさん
垢版 |
2014/04/04(金) 00:28:50.72ID:T327aBHM
C++じゃなくてObjective-Cが流行ってれば
オブジェクト指向絡みの論争は半分になったんじゃないかと
思えてしかたがない。
オブジェクト指向が、じゃなくてC++が採用した方法は、な議論大杉
0201デフォルトの名無しさん
垢版 |
2014/04/04(金) 03:12:14.91ID:T327aBHM
ここ5年ぐらいでiOS用で一気に拡まったけど90年代を通じて
一般の想定するオブジェクト指向と言ったらC++だったからな…
90年代後半からはそこにJavaが加わり…的な。
ある意味バカみたいに基本に忠実なObjective-Cの方が
オブジェクト指向とは〜って議論のたたき台としてはよかったよな的な。
0206デフォルトの名無しさん
垢版 |
2014/04/04(金) 10:52:39.43ID:N5FO4XZ5
デバッガのブレークポイントの指定が
行単位ってだけで、関数単位でのステップは可能。

そして関数単位で止めたいなら
関数ごとに改行すればいいだけじゃない。
0207デフォルトの名無しさん
垢版 |
2014/04/04(金) 13:07:13.88ID:JslAeCyW
>>206
> デバッガのブレークポイントの指定が行単位ってだけで、

たいていの IDE は行単位ではなくてステートメント単位じゃね?

> 関数ごとに改行すればいいだけじゃない。

そもそもそんなことしたくないか、発端だろ。
デバッグのためにソース弄るとかは最後の手段だろ。
0208デフォルトの名無しさん
垢版 |
2014/04/05(土) 08:19:53.84ID:nKpGUjgO
>>206
だーかーらー、
コンパイラが出す行情報以外にどうやって
ブレークかけるアドレスを取り出すわけ?
関数ごとに改行したところで
普通のコンパイラはステートメント単位でしか行番号情報ださねーぞ。

もしかして、単にデバッガのUIの問題だと思ってた?
甘杉
0210デフォルトの名無しさん
垢版 |
2014/04/05(土) 10:05:58.71ID:AlWzj+6w
いったいどのデバッガやコンパイラについて話してるのか知らんが、
VS2013とかにはメソッドチェーンのデバッグ機能あるぞ……
メソッドチェーン中の個々のメソッドについて戻り値とその型を表示してくれる
0212デフォルトの名無しさん
垢版 |
2014/04/05(土) 21:29:41.29ID:LGGjyQ0u
オブジェクト指向を使うには、変数や関数がある程度以上の個数がないと無意味。
あとインスタンスが2個以上必要な場合じゃないと意味がない。
俺の分野ではどちらも当てはまらないので、オブジェクト指向が活用できない
という結論に至った。みんな、ありがとう。
0214デフォルトの名無しさん
垢版 |
2014/04/05(土) 22:16:36.14ID:iKzYf4PO
書き換えて再利用とか機能の追加が少ない機械みたいな分野だったら
(構造化言語の)Cそのまんまで十分じゃないの、とは思う。
0215デフォルトの名無しさん
垢版 |
2014/04/06(日) 06:09:18.41ID:IRmFVDmN
>>212の日本語訳
「俺がいつも書くコードはオブジェクト指向になっていない。
だから俺の分野ではオブジェクト指向は使えない。」

「オブジェクト指向」の部分にどんな技術を入れても成立する
魔法の言い訳だな。
0216デフォルトの名無しさん
垢版 |
2014/04/06(日) 06:50:21.75ID:7fCDh1Rd
同じものが沢山作れる、ってのは確かにオブジェクト指向のミソだが、
インスタンスが一つだろうと、オブジェクト指向プログラミングによって得られるものは色々あるぞ
再利用性とか、単体テストのしやすさとか、拡張性とかな

あと、オブジェクト指向プログラミングの重要なデザインパターンに「シングルトン」というのがあって、こいつはインスタンスを一つに限定するものなんじゃな
インスタンス一つだから役に立たない、ってのは世の中のプログラマには通じないと思われる
0217デフォルトの名無しさん
垢版 |
2014/04/06(日) 09:28:19.55ID:v5F7vKVc
記述側がより人間の思想に近くなったメリットと、実装側でからくり(C++ なら vtable)を生成コードに常に追加するコストとを天秤にかけたら、どっちに軍配があがるかは人それぞれだね
ライナスは OO をぼろくそにけなしているね
0218デフォルトの名無しさん
垢版 |
2014/04/06(日) 11:55:32.65ID:X8q2hYwd
>>216
> 再利用性とか、単体テストのしやすさとか、拡張性とかな

単体テストはべつにして、再利用性とか拡張性とか広い意味では複数インスタンスじゃね?

あと、同じものをたくさんじゃなくって、ちょっと違うものを作れるって言うのがミソかと。
0219デフォルトの名無しさん
垢版 |
2014/04/06(日) 12:55:51.09ID:hTzu53D+
>>217
> ライナスは OO をぼろくそにけなしているね
ライナスだけじゃね?w

しかも俺らはカーネル作ってるわけじゃないから、
用途によって言語は変えるべきという正しい考え方からすると、
ライナスが何言っても何使っても関係ないよねw
0220デフォルトの名無しさん
垢版 |
2014/04/06(日) 12:56:37.04ID:hTzu53D+
どっちに軍配があがるかは人それぞれというより
用途によりけりってことだろう。

で、大概の用途にOOに軍配が上がると。
0223デフォルトの名無しさん
垢版 |
2014/04/06(日) 13:29:28.28ID:d9KztC3X
こういうのを見ると、やっぱりオブジェクト指向が一般的であることがよく分かるよ。

.NETにおけるSOLID設計原則とデザインパターン
http://www.infoq.com/jp/news/2013/09/solid-principles-revisited

SOLIDとは5つの設計原則の頭字語である。氏の簡潔な説明を借りれば:

単一責務の原則(Single Responsibility Principle)
  すべてのオブジェクトは唯一の責務を持たなければならない。すなわち,実行することはただひとつでなければならない。

開放/閉鎖の原則(Open-Closed Principle)
  クラスは拡張に対しては開いて(Open),修正に対しては閉じて(Close)いなければならない。

Liskovの置換原則(Liskov Substitution Principle)
  派生クラスは親クラスの置換として使用可能でなければならない。なおかつ,同じ振る舞いをしなければならない。

インターフェイス分離の原則(Interface Segregation Principle)
  使用しないインターフェースへの依存をクライアントに強制してはならない。

依存関係逆転の原則(Dependency Inversion Principle)
  具体的な実装よりも抽象に依存するべきである。これはコードの分離に有効だ。
0225デフォルトの名無しさん
垢版 |
2014/04/06(日) 18:19:41.32ID:7fCDh1Rd
vtableの生成コストとか言い出したら、スクリプト言語なんて論外じゃねーかw
0233デフォルトの名無しさん
垢版 |
2014/04/09(水) 01:49:33.61ID:eVIzB16V
オブジェクト指向に相対するパラダイムってなによ
関数型+代数的データ型?
0234デフォルトの名無しさん
垢版 |
2014/04/09(水) 03:10:51.74ID:j9Z2BVsM
それは相対する、ってほどでも無いような
オブジェクト指向自体も考え方が複数あるからなあ…
関数型はともかく、手続き型でオブジェクト指向に真っ向から相対して組むとすれば

・データと処理がお互いに依存しないように組む、例えば特定のユーザ定義型に依存する処理などは控え、ひとつずつ引数で渡してもらうなどする
・モジュールは流れに沿って切り分ける、例えば全てのデータはデータモジュールに、全ての初期化は初期化モジュールに、本処理はメインモジュールに書く

とか、そんな感じになるのかな
0235デフォルトの名無しさん
垢版 |
2014/04/09(水) 08:48:53.28ID:lgQL/971
向いてる方向が違うんだから、遠い近いはあるだろうけど相対って言うのはないんじゃね?
0240デフォルトの名無しさん
垢版 |
2014/04/10(木) 22:59:06.71ID:EbsHnFyb
最近ベクトル演算をする必要が出てきたので、オブジェクト指向のプロパティを
使って実現しようと考えている。

○か×か?
0243デフォルトの名無しさん
垢版 |
2014/04/11(金) 02:56:48.62ID:HtRnBfLu
同じメソッド呼び出しを何度も行うと呼び出しのコードをコピペすることになっ
てしまいます。何もせず名前の意味も不明な多重のメソッド呼び出しはコピペを
防ぐためだったと判明しました。もちろん手打ちしたとのことです。

オブジェクト指向脳っていうんですか?本当に怖いです。
0244デフォルトの名無しさん
垢版 |
2014/04/11(金) 09:11:53.91ID:nUaUWR93
>>243
それ違う。関数脳っていうの(笑)
同じ関数呼び出しを何度も実行すると
関数を何度もコピペすることになるからね(爆笑)
0245デフォルトの名無しさん
垢版 |
2014/04/11(金) 09:12:29.97ID:nUaUWR93
>>243
それ違う。アセンブラ脳っていうの(笑)
同じニーモニック呼び出しを何度も実行すると
ニーモニックを何度もコピペすることになるからね(大爆笑)
0248デフォルトの名無しさん
垢版 |
2014/04/12(土) 12:55:19.47ID:5P9XNUOV
プログラマはソースのコピペを恐れないでください。誰でも最初は初心者で、
しかも誰もが成長するとは限らないのです。
成長を強いるオブジェクト指向が、万人の解決策になり得ないのは明らかです。
コピペこそが、初心者からベテランまで、万人の解決策となり得るのです。
第一、grepすらできないソースをメンテナンスできるはずありません。

コピペによるプログラミングは、複雑に絡まったバージョン依存問題を解決する
という、潜在的なポテンシャルがあります。

大体、オブジェクト指向を推進する人は、協調性がない人が多く、共同で作業す
るには向いていないのです。冗談のセンスすらありません。
0251デフォルトの名無しさん
垢版 |
2014/04/13(日) 10:45:23.58ID:839g2ruV
ここで僕らは「良いソフト部品は、有名なのだけだ」という原則に立ち戻る必要があるだろうね。
誰も使ってない、メンテナンスもされない俺様オブジェクト部品を使うくらいなら、コピペの方がましな
んだよ。宣言型か関数型が使えるならその方がいいし、使えなければテストの自動化で乗り切る
しかないと、もう10年も前からいわれて続けているわけだ。
research.microsoft.com/en-us/um/people/blampson/70-SoftwareComponents/70-SoftwareComponents.htm
0252デフォルトの名無しさん
垢版 |
2014/04/13(日) 10:51:49.05ID:oaa109sw
うん、まったくだ。
有名なソフトは良い。

有名じゃなくても良いソフトはまれにあるけど、
多くの、つまり何万、何十万とある無名なソフトはクソでしかない。
0253デフォルトの名無しさん
垢版 |
2014/04/13(日) 11:22:22.91ID:2QOmxkhr
ストラウストラップが「オブジェクト指向というのは継承と再利用なんだよ!」ってやったせいで
えらい風評被害やな。

単にクラスというCでの関数に代わる単位の取り回し方法だから
Objective-C辺りじゃ継承…めんどいから使わない
NSObjectってクラスの基本的ふるまいを持った基底クラスから
テキトーなクラス作って、その中に使えるクラスぶち込んで
メッセージ(メソッド)オーバーライドでふるまい変えて使う。
クラスとは単にレゴブロックみたいなパーツ扱い。
0254デフォルトの名無しさん
垢版 |
2014/04/13(日) 11:38:57.62ID:Vp4hM6j5
>NSObjectってクラスの基本的ふるまいを持った基底クラスからテキトーなクラス作って
継承してるじゃないの。

むしろC++の方が継承なしのパーツ扱いが多いんじゃないの。
0256デフォルトの名無しさん
垢版 |
2014/04/13(日) 12:17:57.96ID:2QOmxkhr
Objective-Cはとにかくクラスの実体ありきで
言語的にひな型からインスタンスを作るんじゃなくて
起動時に存在するファクトリクラスにallocとinitを送って
クラスに"自分のインスタンスを作らせる"から
すべてのクラスはallocやinit、retainカウント、deallocを受け付け管理する
NSObjectを継承していないとクラスとして存在しえないので…
0258デフォルトの名無しさん
垢版 |
2014/04/13(日) 15:38:34.94ID:j71fNHt+
>>256
別にObjectじゃなくても言語仕様でやればいいじゃんと思うんだけどそれじゃマズイことってあるのかな
0259デフォルトの名無しさん
垢版 |
2014/04/13(日) 15:55:24.32ID:BqlLq9pK
動的な言語でも本来はObjectなんて要らない。
Smalltalk-80だってnilのサブクラスを作れたし。
0260デフォルトの名無しさん
垢版 |
2014/04/13(日) 16:04:45.61ID:oaa109sw
値の型が動的なのと
変数の型が動的なのとを
区別つけろよ。アホ。

Objectが必要なのは変数に型があって
値の型が動的な場合なだけだ。
変数に型があるが、そこで記述された型だけではなく
互換性がある型を入れられる。
そういう言語でどんな型にも互換性があるのがObject型だ。

変数に型がない言語ではどんな値でも入れられるから
Objectは要らない。変数にはどんな型でも入れられる
とはいうものもコードは互換性がある型を入れてないと
結局正しく動かないんだけどなw
0261デフォルトの名無しさん
垢版 |
2014/04/13(日) 16:17:49.14ID:Vp4hM6j5
値の型が動的ってどういう事?
さっきまでStringだったけど今みたらIntに変わってたわ!みたいな?
0262デフォルトの名無しさん
垢版 |
2014/04/13(日) 16:24:02.51ID:oaa109sw
変数の型は固定なんだよ。
この変数は、Numeric型みたいに。

でもNumeric型って書いてあっても
その値は実はInt型だったりFloat型だったりと
Numeric型に互換性がある型に変わっていたりする。

変数の型は固定なのに値の型は違う。

それに対して、変数に型が決まってない言語があるの。
変数に型が書いてないなら変数aにどんな型でも入れられる。
0263デフォルトの名無しさん
垢版 |
2014/04/13(日) 16:26:13.02ID:Vp4hM6j5
Objectって全部に共通の動作を定義するために使われてるよね普通は。
例えば、自分の型を返すとか。
0264デフォルトの名無しさん
垢版 |
2014/04/13(日) 17:45:48.17ID:CtgsENNt
値が型情報持ってない言語は一応あるね、C言語とか
あれは変数側にしか型がない
0266デフォルトの名無しさん
垢版 |
2014/04/13(日) 18:07:49.11ID:+sscY2hT
>>263
それがルート(基底)クラスだな。
Objective-Cで言えばNSObjectで、全てのクラスのルート。
0271デフォルトの名無しさん
垢版 |
2014/04/13(日) 20:31:47.78ID:yhlLeWxx
>>269
Smalltalkではbecome:というメソッドで
ポインタレベルでのオブジェクトの差し替えが可能なんで

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

これを応用してオブジェクトの型の変更も容易なんですよ
0272デフォルトの名無しさん
垢版 |
2014/04/13(日) 20:36:46.47ID:1ZgLAbLW
>>259
よく知らないんですけどSmalltalkのnilとObjectって
お互い継承関係にあるんじゃないんですか?
0273デフォルトの名無しさん
垢版 |
2014/04/13(日) 20:46:56.28ID:+sscY2hT
>>271
SmallTalk知らないんだけど、それってxというオブジェクトにbecome:という動作をさせてるの?
そうなら、become:という動作は全オブジェクトに共通だよね。
0274デフォルトの名無しさん
垢版 |
2014/04/13(日) 20:50:21.03ID:Vp4hM6j5
>>271
Smalltalkよくしらないから適当言語だけど...
x = "x"; y = "y"; z = y;
の状態で
y become: x;
とやったら、
zの指してるオブジェクトは"x"になるって事?
0275デフォルトの名無しさん
垢版 |
2014/04/13(日) 20:59:39.25ID:BqlLq9pK
>>268
つ proxyパターン

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

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

>>274
なる。xが"x"のままの流派と"y"になる流派とがある。
0276デフォルトの名無しさん
垢版 |
2014/04/13(日) 21:09:17.21ID:1ZgLAbLW
よく知らない三連星ワロタ

>>275
なるほどそういう意図ですか
1. nillはUndefinedObjectのインスタンス
2. UndefinedObjectはObjectの継承している
3. Objectはnilを継承している
こうかな?
となると全てのクラスの共通となる祖先が存在してるんで
不要論として出すのはやっぱおかしくないですか?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況