オブジェクト指向の活用方法を教えて下さい
■ このスレッドは過去ログ倉庫に格納されています
お願いします。言語は問いません。
オブジェクト指向言語じゃなくても
オブジェクト指向の話であれば問題ありません。 >>176
なんだ、昨日の続きならそうかけよ
当然、 fooとbarとかの名前なら書いたやつが無能なだけ。
jQueryとかrubyみたいにわかりやすい名前がいい
中身はどこかでまたつかうとか、メソッドチェーンでシンプルに書けるなら有用かもしれない
オブジェクト指向は完璧ではないし、スキルがない人ならやらなくてもいいんじゃない?
ただし、C#とかJavaみたいにオブジェクト指向ありきで設計された言語はやっぱり知識は必要
標準ライブラリ自体オブジェクト指向専用だからね
C#でStreamではなくFileStreamしか受けないメソッドとかを作ってしまったら不便だし、不要なフィールドを公開したら危険だ >>176
オブジェクト指向を使うと、同じものを2つ以上同時に扱うのが簡単なんだよね。
2つのファイルを同時に編集するとか
ぷよぷよの画面を2つならべてみるとか
5人のボンバーマンが同時に動くとかさ。 >>173
スモールトーク系のデバッガーはメソッドチェーンのそれぞれのメソッド呼び出しごとにステップ実行できるらしいよ >>179
具体的な名前書けっつーてるのに...
結局 ID:CUSBQvN9 は口先番長かよ (w 性能低下を防ぐためにメソッドの内容をメインルーチンに直に展開する作業は、
処理系にまかせることもできるだろうが、それによって多態性は失われる。
それよりもソフトウェアを細かく分割して構成する以上、バージョンの依存
関係が複雑に絡み合うほうが問題として大きい。 >>180
スモールトークっていったらスクイークとかじゃないの?
口先番長認定するまえに自分で調べてみたの?
口の中にご飯をスプーンで入れてもらうまで
馬鹿みたいに口開けて上を向いているタイプの人なの? >>182
で、そのスクイークとやらは、ブレークかけられんのか?
当然調べたんだよな (w >>4
ポリモーフィズムはリリースされたプログラムをユーザーが部分的に更新しな
がら使う(ライブラリやDLLを更新する)と、プログラマが当初考えていた以上
の使われ方をして、動作の保証ができなくなる、ってことにならないの?
昔でいうgoto文や、メモリーリークを起こしがちなC言語のポインタみたいに
やっかいなことにならないの? 動作の保証ができなくなるようなことを許すのは単なる欠陥でしょ メソッドごとにコメントアウトすればいいよ
てかメソッドチェーンとしてのチェックってあるかね いい加減に認めろよ……
そもそも仮に「メソッドチェーンはデバッグできない」としても、それは「オブジェクト指向」を否定するのに大事な要素でもないじゃん
何かこだわりでもあるの? >>189
> いい加減に認めろよ……
何を認めるんだ?
ブレーク掛けられるなら >>151
が情弱と言うことだし、かけられないなら >>156 が口先番長と言うだけのことだろ。
どこから、オブジェクト指向の否定が出てきたんだよ (w >>188
ちゃんとしたSmalltalk処理系では(つまりGNU Smalltalkとかの変わり種を除けば)一般に
value foo halt bar baz で、bar のコール直前でデバッガを起動させて bar のステップ実行ができる
ってそういうことではなく? ちなみに halt は古典的なSmalltalkにおけるブレイクポイントみたいなもの。 スモールトークがオブジェクト指向の元祖だからな
スモールトークでできるならオブジェクト指向の欠点とは胃炎な ていうか、一つの式に詰め込んだら便利かどうかなんてオブジェクト指向と関係なくね? Smalltalkには、コードを英文のように読み下せるように書く慣習みたいなものがあって、
value foo bar baz みたいな式だとちょっとメリットをイメージしにくいですが、たとえば
「1 から 9 までの数を配列にして、それをシャッフルして最初の3つを得る」みたいな処理を、
(1 to: 9) asArray shuffled first: 3 というふうに一気にメソッドチェーンにして書くようなことはよくします。
そんなこともあって、メソッドチェーンだからデバッグしづらいというような制約はほとんどうけない仕組みになっています。 >>194
そもそもオブジェクト指向についてあんまり語ってないからいいんじゃね >>191
なるほど、ブレーク+ステップ実行なのね
まあ実用上は十分かな
C# とかでもできるようにしてほしい C++じゃなくてObjective-Cが流行ってれば
オブジェクト指向絡みの論争は半分になったんじゃないかと
思えてしかたがない。
オブジェクト指向が、じゃなくてC++が採用した方法は、な議論大杉 ここ5年ぐらいでiOS用で一気に拡まったけど90年代を通じて
一般の想定するオブジェクト指向と言ったらC++だったからな…
90年代後半からはそこにJavaが加わり…的な。
ある意味バカみたいに基本に忠実なObjective-Cの方が
オブジェクト指向とは〜って議論のたたき台としてはよかったよな的な。 >>197
と言うか、行単位でのブレークポイントなのはデバッガの都合でしかないんだよなあ >>202
式の途中にブレークポイントを入れるのはデバッガだけでは無理っす。 >>203
いや、だからそれって 今の デバッガだからだろ?
技術的にできない訳じゃなかろ 最低限、コンパイラにも手を入れる必要があると思うぞ。 デバッガのブレークポイントの指定が
行単位ってだけで、関数単位でのステップは可能。
そして関数単位で止めたいなら
関数ごとに改行すればいいだけじゃない。 >>206
> デバッガのブレークポイントの指定が行単位ってだけで、
たいていの IDE は行単位ではなくてステートメント単位じゃね?
> 関数ごとに改行すればいいだけじゃない。
そもそもそんなことしたくないか、発端だろ。
デバッグのためにソース弄るとかは最後の手段だろ。 >>206
だーかーらー、
コンパイラが出す行情報以外にどうやって
ブレークかけるアドレスを取り出すわけ?
関数ごとに改行したところで
普通のコンパイラはステートメント単位でしか行番号情報ださねーぞ。
もしかして、単にデバッガのUIの問題だと思ってた?
甘杉 いったいどのデバッガやコンパイラについて話してるのか知らんが、
VS2013とかにはメソッドチェーンのデバッグ機能あるぞ……
メソッドチェーン中の個々のメソッドについて戻り値とその型を表示してくれる オブジェクト指向を使うには、変数や関数がある程度以上の個数がないと無意味。
あとインスタンスが2個以上必要な場合じゃないと意味がない。
俺の分野ではどちらも当てはまらないので、オブジェクト指向が活用できない
という結論に至った。みんな、ありがとう。 オブジェクト指向が活用できない分野ってどんな分野よ 書き換えて再利用とか機能の追加が少ない機械みたいな分野だったら
(構造化言語の)Cそのまんまで十分じゃないの、とは思う。 >>212の日本語訳
「俺がいつも書くコードはオブジェクト指向になっていない。
だから俺の分野ではオブジェクト指向は使えない。」
「オブジェクト指向」の部分にどんな技術を入れても成立する
魔法の言い訳だな。 同じものが沢山作れる、ってのは確かにオブジェクト指向のミソだが、
インスタンスが一つだろうと、オブジェクト指向プログラミングによって得られるものは色々あるぞ
再利用性とか、単体テストのしやすさとか、拡張性とかな
あと、オブジェクト指向プログラミングの重要なデザインパターンに「シングルトン」というのがあって、こいつはインスタンスを一つに限定するものなんじゃな
インスタンス一つだから役に立たない、ってのは世の中のプログラマには通じないと思われる 記述側がより人間の思想に近くなったメリットと、実装側でからくり(C++ なら vtable)を生成コードに常に追加するコストとを天秤にかけたら、どっちに軍配があがるかは人それぞれだね
ライナスは OO をぼろくそにけなしているね >>216
> 再利用性とか、単体テストのしやすさとか、拡張性とかな
単体テストはべつにして、再利用性とか拡張性とか広い意味では複数インスタンスじゃね?
あと、同じものをたくさんじゃなくって、ちょっと違うものを作れるって言うのがミソかと。 >>217
> ライナスは OO をぼろくそにけなしているね
ライナスだけじゃね?w
しかも俺らはカーネル作ってるわけじゃないから、
用途によって言語は変えるべきという正しい考え方からすると、
ライナスが何言っても何使っても関係ないよねw どっちに軍配があがるかは人それぞれというより
用途によりけりってことだろう。
で、大概の用途にOOに軍配が上がると。 ここまでの内容ならライブラリで十分。オブジェクト指向は不要。 ライブラリとオブジェクト指向を同列に語ってる馬鹿は黙ってろよ こういうのを見ると、やっぱりオブジェクト指向が一般的であることがよく分かるよ。
.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)
具体的な実装よりも抽象に依存するべきである。これはコードの分離に有効だ。 >>223
vtableを生成コードに常に追加するコストに見合うものかどうか疑問だね vtableの生成コストとか言い出したら、スクリプト言語なんて論外じゃねーかw C++だとvtableは必要なとこにしか付かないよね ぷらぷら。ぼくはvirtualなメソッドじゃないよ。 なんでここだけC++初心者スレみたいになってんの? 一番知名度のあるオブジェクト指向プログラミング言語はJavaの筈なのにね オブジェクト指向に相対するパラダイムってなによ
関数型+代数的データ型? それは相対する、ってほどでも無いような
オブジェクト指向自体も考え方が複数あるからなあ…
関数型はともかく、手続き型でオブジェクト指向に真っ向から相対して組むとすれば
・データと処理がお互いに依存しないように組む、例えば特定のユーザ定義型に依存する処理などは控え、ひとつずつ引数で渡してもらうなどする
・モジュールは流れに沿って切り分ける、例えば全てのデータはデータモジュールに、全ての初期化は初期化モジュールに、本処理はメインモジュールに書く
とか、そんな感じになるのかな 向いてる方向が違うんだから、遠い近いはあるだろうけど相対って言うのはないんじゃね? 最近ベクトル演算をする必要が出てきたので、オブジェクト指向のプロパティを
使って実現しようと考えている。
○か×か? 同じメソッド呼び出しを何度も行うと呼び出しのコードをコピペすることになっ
てしまいます。何もせず名前の意味も不明な多重のメソッド呼び出しはコピペを
防ぐためだったと判明しました。もちろん手打ちしたとのことです。
オブジェクト指向脳っていうんですか?本当に怖いです。 >>243
それ違う。関数脳っていうの(笑)
同じ関数呼び出しを何度も実行すると
関数を何度もコピペすることになるからね(爆笑) >>243
それ違う。アセンブラ脳っていうの(笑)
同じニーモニック呼び出しを何度も実行すると
ニーモニックを何度もコピペすることになるからね(大爆笑) >>243
人生で同じ英単語・アルファベットを何度もコピペする略(ゲラゲラ) なんか面白いんだろうな...
俺には理解できないけど プログラマはソースのコピペを恐れないでください。誰でも最初は初心者で、
しかも誰もが成長するとは限らないのです。
成長を強いるオブジェクト指向が、万人の解決策になり得ないのは明らかです。
コピペこそが、初心者からベテランまで、万人の解決策となり得るのです。
第一、grepすらできないソースをメンテナンスできるはずありません。
コピペによるプログラミングは、複雑に絡まったバージョン依存問題を解決する
という、潜在的なポテンシャルがあります。
大体、オブジェクト指向を推進する人は、協調性がない人が多く、共同で作業す
るには向いていないのです。冗談のセンスすらありません。 全部反対のことを言っていると見抜けば
>>248が言っていることに納得できるはずw なんか面白いんだろうな...
俺には理解できないけど ここで僕らは「良いソフト部品は、有名なのだけだ」という原則に立ち戻る必要があるだろうね。
誰も使ってない、メンテナンスもされない俺様オブジェクト部品を使うくらいなら、コピペの方がましな
んだよ。宣言型か関数型が使えるならその方がいいし、使えなければテストの自動化で乗り切る
しかないと、もう10年も前からいわれて続けているわけだ。
research.microsoft.com/en-us/um/people/blampson/70-SoftwareComponents/70-SoftwareComponents.htm うん、まったくだ。
有名なソフトは良い。
有名じゃなくても良いソフトはまれにあるけど、
多くの、つまり何万、何十万とある無名なソフトはクソでしかない。 ストラウストラップが「オブジェクト指向というのは継承と再利用なんだよ!」ってやったせいで
えらい風評被害やな。
単にクラスというCでの関数に代わる単位の取り回し方法だから
Objective-C辺りじゃ継承…めんどいから使わない
NSObjectってクラスの基本的ふるまいを持った基底クラスから
テキトーなクラス作って、その中に使えるクラスぶち込んで
メッセージ(メソッド)オーバーライドでふるまい変えて使う。
クラスとは単にレゴブロックみたいなパーツ扱い。 >NSObjectってクラスの基本的ふるまいを持った基底クラスからテキトーなクラス作って
継承してるじゃないの。
むしろC++の方が継承なしのパーツ扱いが多いんじゃないの。 いわゆるObjectクラスが必要な理由って何かあるの? Objective-Cはとにかくクラスの実体ありきで
言語的にひな型からインスタンスを作るんじゃなくて
起動時に存在するファクトリクラスにallocとinitを送って
クラスに"自分のインスタンスを作らせる"から
すべてのクラスはallocやinit、retainカウント、deallocを受け付け管理する
NSObjectを継承していないとクラスとして存在しえないので… 動的な言語だとだいたいObjectクラスが必須だよね >>256
別にObjectじゃなくても言語仕様でやればいいじゃんと思うんだけどそれじゃマズイことってあるのかな 動的な言語でも本来はObjectなんて要らない。
Smalltalk-80だってnilのサブクラスを作れたし。 値の型が動的なのと
変数の型が動的なのとを
区別つけろよ。アホ。
Objectが必要なのは変数に型があって
値の型が動的な場合なだけだ。
変数に型があるが、そこで記述された型だけではなく
互換性がある型を入れられる。
そういう言語でどんな型にも互換性があるのがObject型だ。
変数に型がない言語ではどんな値でも入れられるから
Objectは要らない。変数にはどんな型でも入れられる
とはいうものもコードは互換性がある型を入れてないと
結局正しく動かないんだけどなw 値の型が動的ってどういう事?
さっきまでStringだったけど今みたらIntに変わってたわ!みたいな? 変数の型は固定なんだよ。
この変数は、Numeric型みたいに。
でもNumeric型って書いてあっても
その値は実はInt型だったりFloat型だったりと
Numeric型に互換性がある型に変わっていたりする。
変数の型は固定なのに値の型は違う。
それに対して、変数に型が決まってない言語があるの。
変数に型が書いてないなら変数aにどんな型でも入れられる。 Objectって全部に共通の動作を定義するために使われてるよね普通は。
例えば、自分の型を返すとか。 値が型情報持ってない言語は一応あるね、C言語とか
あれは変数側にしか型がない >>261
SmalltalkではさっきまでByteStringだったオブジェクトが今みたらWideStringだったぜとか普通 >>263
それがルート(基底)クラスだな。
Objective-Cで言えばNSObjectで、全てのクラスのルート。 >>265
それは参照してるオブジェクトが変わったんじゃないの? 共通の動作がなければ、てんでばらばらって事じゃんw >>269
Smalltalkではbecome:というメソッドで
ポインタレベルでのオブジェクトの差し替えが可能なんで
| x y |
x := y := 'abc'
x become: 3.14.
y. "=> 3.14 "
これを応用してオブジェクトの型の変更も容易なんですよ >>259
よく知らないんですけどSmalltalkのnilとObjectって
お互い継承関係にあるんじゃないんですか? >>271
SmallTalk知らないんだけど、それってxというオブジェクトにbecome:という動作をさせてるの?
そうなら、become:という動作は全オブジェクトに共通だよね。 >>271
Smalltalkよくしらないから適当言語だけど...
x = "x"; y = "y"; z = y;
の状態で
y become: x;
とやったら、
zの指してるオブジェクトは"x"になるって事? >>268
つ proxyパターン
>>272
nilはクラスではないところがポイント。
>>273
全オブジェクトに共通ではない。
>>274
なる。xが"x"のままの流派と"y"になる流派とがある。 よく知らない三連星ワロタ
>>275
なるほどそういう意図ですか
1. nillはUndefinedObjectのインスタンス
2. UndefinedObjectはObjectの継承している
3. Objectはnilを継承している
こうかな?
となると全てのクラスの共通となる祖先が存在してるんで
不要論として出すのはやっぱおかしくないですか? 知れば知る程Smalltalkのウンコさが身にしみる ■ このスレッドは過去ログ倉庫に格納されています