オブジェクト指向の活用方法を教えて下さい
■ このスレッドは過去ログ倉庫に格納されています
お願いします。言語は問いません。 オブジェクト指向言語じゃなくても オブジェクト指向の話であれば問題ありません。 >>288 GNU Smalltalk は名前から受ける印象と違って 単なるファンお手製の勝手実装なうえに、 Smalltalk としてもかなりの変わり種なので あれを元に Smalltalk がどういうものか学ぶのはちょっと問題が。 できれば VisualWorks 、悪くても Squeak/Pharo で 試すようにするのがよいと思います。 (これらの処理系はそれぞれ独自の進化を遂げてはいますが、 いちおう古典的 XEROX Smalltalk-80 からの直系の派生物で、 その名残を多く残しています) >>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以外でやります 大量のベクトル演算をオブジェクト指向で行うのはいい考えではありませんでした。 パフォーマンスが話になりません。 あらためてオブジェクト指向の活用方法が知りたいです。 >>292 それはmeta cyclicというのであってrecursionとは全く別だよ >>295 http://upload.wikimedia.org/wikipedia/commons/f/f9/Smalltalk_80_metaclasses.svg を拝借するとrecursionはどの部分になりますか?(または当て嵌まらない、とか) MetaclassとMetaclass classがrecursion? と言うかmeta cyclicとrecursionは定義はどこを調べればいいんでしょうか あー分かんなくなってきた >>296 まず、 全てのクラスの基底となるクラスが存在するかどうかという>>255 の話は継承関係の話で、 クラス-インスタンス関係で構成されるメタタワーの話である>>296 の話とは 全く別々の話だということはOK? >>297 はいそれは分かってるつもりです 自分が疑問に思ったのは>>259 なんで、 nilを継承できる事とObjectが不要である事の関連性を 説明して貰えるとありがたいんですが… isKindOf:等のクラス階層へのアクセスを使わない限りにおいて、 全てのクラスは基底クラスから継承したインスタンス変数やメソッド等を取り込むことで nilからの継承による実装に置き換えることが出来るのはOK? >>297 と>>299 を前提とすれば、 全てのクラスの基底クラスとしてのObjectは不必要であることは自明だというのはOK? >>301 いいえ、その飛躍が判りません nilにObjectクラスと同じ能力があるからObjectクラスは不要だという事ですか? >>302 いいえ、nilにObjectと同じ能力があるなんて誰か言ってるのですか? >>303 じゃあ>>299 の解釈が間違ってますね うーん、Objectの代わりにnilから派生できるよ、としか汲み取れません でもそれだとクラス階層のルートの必要性とは無関係の話だから違うんだろうな 自明の部分を取り違えないように省略せず説明して頂けませんか? 今更な反応だけど メソッドチェーンのデバッグどうのこうのは パワーアサートである程度解決できるんじゃね テストとデバッグを同一視すんなとか言われそうだけど そこはなんやかんやで ああ、もうすぐ司法試験なんだよなぁ・・・ 今年も申し込みしてねーや。 仕事辞めたいわ ぜひ弁護士資格を取って人売り屋を訴えてやってください。 弁護士より裁判官志望なんだけどな。 知財専門の裁判官やるわ。 裁判官になるのはある意味、終身刑になるようなもの 仕事にやりがいはないし、趣味、嗜好、信仰の類は一切行えない どうしてもやりたいというなら止めないが、いいもんじゃないぞ 確かに日本語ネイティブじゃないと解り難い表現ではある >>217 >ライナスは OO をぼろくそにけなしているね Linusが批判したのはOOPじゃなくてC++だろ(Cとの比較で)。 似たようなものさ‥Linus が GC の存在を受け入れるわけがない そりゃ、カーネルやドライバレベルの開発でGC付きの言語環境は要らんわ。 OOPの話題でリーナス発言を引き合いに出すのは的外れすぎる。 OOPって結局、こういう考え方すれば分かりやすくなりますよって例でしかないからな その考え方を前提に置けば、こういう表現ができますよって利点はいろいろな実装があるけど 完全性や効率性を犠牲に、可読性を上げて保守性や再利用性、試験性なんかを上げましょうってそういうものだと思うんだけど OOPって結局、…でしかないからな という奴って、OOP以外にも関数型言語でもアジャイルプロセスでも受託ビジネスでも みーんな「結局、…でしかないからな」とわかったような気になるだけで 実際には何も身についてないんだよなw >>31 「結局、ただの方法論でしかないからな」 方法を知っているかとそれをビジネスで生かせるかは全く別のスキルだしなー カプセル化 ポリモーフィズム 継承を理解して設計出来る人って実際、何人に一人ぐらいに感じる? カプセル化&オブジェクト化の行き先は関数型プログラミングじゃないの? >>323 北極と南極の違いだろ。 OOPの落伍者のパラダイスが関数型なんだから。 ポリモーフィズムは分かりやすいんだけどカプセル化がいまいちわからない ゲッターセッター書いて何になるの?ってレベルの理解しかないから優しく教えて >>326 カプセル化はむしろ単純セッター書いたら負け そのクラスの機能のみ提供して、内部実装を隠すのが要点 カプセル内では、他のオブジェクトの定義を知らなくても済むように書く。 閉じたオブジェクトにすればいい。 >>326 基本的にそのクラスのメンバーはそのクラス内でいじられることを保障するため。 実装を隠す →知らなくても使えるように設計する →使い方さえ変えなければいい →中は変え放題、新しい使い方も追加放題 >>329 よくあるサンプルみたいに全メンバアクセッサ実装してるようなクソクラスだと その原則破るための効果の方が強くなってしまうからなぁ クラスの中から≠クラスファイルの中から クラスの中から=クラス機能の中から 327-330 いろいろありがとう 公開したいとこだけ公開すりゃいいのね >>326 getter-setter をかましておけば、なにかのときに簡単に監視やフックを追加できる >>333 ちょっとした用途ならリフレクションから呼べば良いじゃん 機能として提供する必要が出来たならそんな直接参照するような裏ワザ使わないで継承するなり追加するなりしようよ 影響が外に広がらないようにカプセル化して直接参照する手段を封じるんだから 直接参照できるセッターやゲッターつけたら保証できなくなるじゃん >>334 リフレクションは悪、コンパイル時に検出できるエラーがリフレクションにすると検出できなくなってしまう‥ まあ何でもかんでもsetter-getter で公開してしまうのはどうかと思うが(ましてやプロパティを公開してしまうのは最悪) おいおいインスタンスにアクセサなかったら、 そいつの状態を変えたりモニターしたりどうやるんだよ。 >>336 状態をモニタするのは「モニタする」メソッドでやるべきじゃね? 状態を変えるなら、状態を変えるメソッドを通すべきだと思うし もちろん、カプセル化の観点から見たら、の話ね 何か目的があってカプセル化を崩すなら、それはそれだろうし いやそのためのメソッドがsetter/getterだろうと。 >>335 > ましてやプロパティを公開してしまうのは最悪 .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になっちゃうけど まずそのオブジェクトで何をしたいのかを考えて、それを実現するための内部構造と考えると 自然とカプセル化されてくもんじゃないかな。 >>340 いやだからアクセサでオブジェクトの状態を変える・モニターするのは別に普通だろと言ってるの。 Entityにgetsetつけてるのって何も考えてないとしか思えない 状態変更やモニタするメソッドの名前をgetやsetにするのは自由だけど・・・命名規則的にそれってどうなの? それに当然モニタリング機能を提供すべき責任を負ってるクラスだけだからな 状態を変更するメソッドならバリデーションや整合性チェック、状態変化に伴う動作まで含めて一つの完結した機能として定義すべきかな 状態変化監視するならオブザーバパターンで、JavaならpropeatyChangeListenerとか 実装して受け取るべきだと思う もしくは監視用ステータスオブジェクトを返す感じとかか? こういう説明はどうだろう? NG:状態変数を取得するために状態変数取得メソッドを作った OK:状態取得メソッドを作ったので保管場所として状態変数を作った 少なくとも設計段階でデザインするべき物かな そうやってデザインの結果として一部にクラスに、 結果的に単純プロパティのような形の実装になった物が出来るの悪いことではないと思う 始めからプロパティとして定義するものもあれば、 プライベート変数を後からプロパティに変更する事もあれば、 プロパティだったものをプライベート変数に変更する事もあるよ。 C++とかjavaは元来の意味でのオブジェクト指向じゃないからね あくまで、オブジェクト指向に便利な機能つけた手続き言語 オブジェクト指向をきちんと使いたいならsmalltalk参考にしてる言語のほうがいいと思われる 例として、整数を文字列に変換するときに Java String.valueOf(48) Ruby 48.to_s 48さんに文字列になって欲しければ、48さんのメソッド呼ぶのが本来のオブジェクト指向ー 同じように、通信をするconnectionってインスタンスがあったとして connection.status = Status::FINISHED とかやっちゃうのはオブジェクト指向らしくなくて connection.finish で、終了処理から内部状態変更やらやってくれるのがオブジェクト指向 >>348 Staticメソッドを引き合いに出してJavaをけなしてもねえ…… >>348 そりゃ OO 的には美しいが、レジスタ一個で収まるところをごてごてとデコレートするのもね‥ まぁ、速度優先するならOOPだの関数型だの構造化だのオーバーヘッドの必要なルール止めて シーケンシャルに処理手書きしていけよってなるしな 保守性とかほかの目的で冗長な記述をルール化してるんだし 文字列とか数値とか考えないのがオブジェクト思考じゃないの? 基底クラスが「人」で、3つの派生クラスを作ってそれぞれに「.work()」を記述した場合で 3つの派生クラスの全インスタンスの「.work()」を実行したいときどのように管理すれば良いのでしょうか 自分では派生クラス毎にループを回すことしか思いつきませんでした 基底クラスにwork()を定義して、派生クラスでオーバーライドするとか >>355 「職業」インターフェースを追加して、work()を定義するかな work()を使う側は、人に対して命令しているのではなく、職業の役割に対してその通り働けと言ってるわけだから >>355 そんなん、クラスが「基底か」「派生か」ということとは関係ないじゃん。 基底クラスのインスタンスを複数作成した場合でも、同じでしょ。 複数インスタンスに同時にメッセージを送るということなんだから。 ヒントはリスナー。 >>355 > 3つの派生クラスの全インスタンスの「.work()」を > 実行したいとき 例えば Smalltalk なら 人 allSubinstances do: #work とかそういうこと? Javaでクラスメソッド書いてると罪悪感あるんだけど、 副作用のない関数を書くんなら問題ないよね? OOPっぽくないというのが罪悪感の原因だろうけど、 public staticで副作用のない関数だとむしろ書いていくべきだよね? >>360 気にするとすれば、そのクラスに対して作用を持たないメソッドが何でそのクラスにあるの?ってところかな クラスって、データと「そのデータに対する」操作の集まりだから。 影響を受けるデータの方に自身の操作として定義した方が良くない? 良くあるアンチパターンの機能クラスと、データクラスに分かれちゃってる手続き型設計 > そのクラスに対して作用を持たないメソッドが何でそのクラスにあるの?ってところかな クラスを定義しないと関数を書けないからね。 > クラスって、データと「そのデータに対する」操作の集まりだから。 Math.sinなどのメソッドは、どのデータに対する操作かな? やっぱ、関数、っていう使い方は生き残ると思うんよね。 オブジェクト指向的にはstrategyっぽくオブジェクトにしとくべきなんだろうとは思う んで、普通はAngleオブジェクトがあってそれがsinやらcosやらのオブジェクト持ってる感じじゃない? この話題で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) となってる。これも関数的アプローチの無くならない理由というか証拠のような気もする。 >>364 public static Angle fromDegree(double degree); public static Angle fromRadian(double radian); public double sin(); public double cos(); ... でいいじゃん。 Angle.fromDegree(45).sin()とか。 三角関数自体は角度の持っている特性だからAngleから取り出せるものだけど、 数学としてそれを導き出す関数で概念化した法則≒数式はMathとして定義されていてもおかしくはないか ただ、数式自体はオブジェクト(物)を扱わず、その法則のみを抜き出して机上で扱う関数の集合、 数学自体が物事をオブジェクトで表現せずに、関数で表現したもの(ただし、直接使え無いと超非効率になる) って感じかな >>364 ファイルのコピーはファイル自体の機能ではなく、その上のストレージに自身の保持してるファイルを複製せよって命令する感じのような >>365 そのnewを書く書かないとかcreateメソッドを準備するとかは興味なくて、 パラメータ→結果 で済む世界の話に短命オブジェクトを挟むのが嬉しくないよね? 絶対嫌だとか、困るとか言うつもりもないけど、今んとこメリットも見えないような。 >>366 関数型言語に詳しくてウンチクのひとつも言えるなら、 この気持ちスッキリ表せるんだろうけど、今の俺が言えるのは、 関数ありだよね、特に、式には関数だよね、みたいなことだけ…。 ファイルのコピーの例はご指摘を受け、自分の中では少なくとも、 「メソッド方式よりも、関数方式でスッキリする例」で無くなってしまったw 関数方式でスッキリするのはやっぱ数式関係だけ、なのかも。 基本的に読みやすいと言うか、その処理がどういう本質のものかをコード自体で示してるのが良いコードなワケで 数学関係の処理は、元が元だけに関数形式が一番本質に近いから、そりゃ関数形式が読みやすくもなるわな >>367 Angleがどうして短命なわけ?Pointとの本質的な違いは? 全てはあんたの一方的な思い込みだよw >>367 は関数型に詳しくないだけじゃなくオブジェクト指向も初心者レベルだよw beanというかバリューオブジェクト?とユーティリティクラスって 効率のためにあえてオブジェクト指向の設計を崩して、 構造化プログラミングで設計するときに利用するものって考えでいいんですかね? 構造体と機能モジュールの関係そのまんまだし ブログラマの質にできるだけ影響を受けないように プログラムの質を維持するのが目的だろ。 プログラマの質の水準をどの程度と見るかで 求められる効果が変わってくる。 恥ずかしながらC#やった時に初めて理解できたわ IEnumerableとかIDisposableを継承すると馬鹿でも分かると思う マスゴミ・売国奴・医療業界が隠そうとする真実---------------------安楽死---------------------奴隷に勝手に死なれては困る 安楽死旅行企画が大人気|竹田恒泰チャンネル https://www.youtube.com/watch?v=XmP1TRsAe88 武田邦彦:安楽死と大麻、そして売春・・・オランダに学ぶ https://www.youtube.com/watch?v=nWV8YOY39tw 安楽死党 https://www.youtube.com/watch?v=8nU2UaSlGx0 自殺は後遺症が怖い!だから-----------------------------------安楽死制度-------------------------------------安心して生きるために 全ての識別子をグローバルにして誰かと共同制作したいならどうぞ、って感じだな データ(変数群)と関数を関連付けすることでデータがデータとして存在するだけで意味がわかるのがオブジェクト指向 たとえば貨幣として扱いたいデータに対して、貨幣として必要な機能だけに関数を限定させれば、それはもうデータが存在するだけで貨幣として意味がわかる(貨幣以外の動作が起こり得ないから) 関数型言語だとデータを出力するまで貨幣かどうかは信用できない 変数 kahei に対して全ての関数が利用できるから、kahei はどうとでもなり得る コメントつけろとかそういう原始的な話じゃなくてね その辺は言語の構造によって違うが つーかオブジェクトの使われ方も言語によって全然違ったりするのでね あ、オブジェクト指向言語の実装とはちょっとかけ離れた例え話な 関数型言語で生きてきた人間にオブジェクト指向を説明する時にこういう話し方をする 勿論、実際には外部にある関数を変数に関連付けするわけじゃなくてクラス内部にメソッド(≒関数)を実装するわけなんだが カッチカチの関数型人間がオブジェクト指向の意味を理解できるように、多少強引に言葉を改編してる つっても >>377 で理解できるのはカプセル化のメリットだけだからまだ全然オブジェクト指向を説明しきれていないが ネットで調べていてもオブジェクト指向が分からない…。 仕事でVB(昔の)やってたんだけど、画面のプログラムは目次状態で動かす部分は全てモジュールに作って入れてた。 画面の目次(仮名)には <モジュール名>//○○を行う が続いてる状態で中身はモジュールへ、モジュール使い回ししながら作ってたんだけど(時折モジュール内にも目次できたりしてた) これはオブジェクト指向とは違うの?? モジュールがクラスになっただけちゃうんかなって、うーん良く分からない。 違いを教えてください。 全てプリミティブかつアクセサ禁止って破綻してる アクセスできないからプログラムも書けん >>380 vbのユーザー定義型とそれを扱うモジュール内の関数を一つのかたまりとして収めたのがクラスの考え方の原型。 vb なら本当のクラスも定義出来るんだが使ったこと無いのか? >>382 ありがとう。 うーん、前職、書き方に制限ありまくりだったからクラスって本当に分からない。 情報系の大学だったけどプログラミングはほとんどやらなかったのに、基礎があるからって叩き上げられた形だったのよね。前職。 VB456にあるのかな。 .NET使う頃にはSEになってしまったから.NETもさわりしか分からない。 何かもう自分取り残されてるな…。 一ヶ月も前のをまだ待ってたんかいな。 検索すればいきなり出てきそうなもんだけど。 オブジェクト指向ってのは、 データ構造と処理構造を動的にかつ個別に、そしてそれらを一体化して管理できるようにできる仕組み。 全部まとめたその一連の一体がクラス 動的に個別に扱ってるデータがインスタンス インスタンスに対応した処理がメソッド インスタンスを発生させるのがそのクラスのコンストラクタ いらないインスタンスを消すのがデストラクタ インスタンスってのは、動的に作られたクラスデータ(専用型)であり、さらにそのクラスが持つメソッドを呼び出すことが出来る。 したがってこう書ける。 //インスタンス = クラス名->コンストラクタ(引数); //戻り値 = インスタンス->メソッド名(引数); うさぎ = 動物->new(耳が長い、白い); //コンストラクタ起動。動的に新データを生成します。うさぎが産まれました。インスタンスは必要な情報を全て保持しているかのように振舞います。 きりん = 動物->new(首が長い, 黄色い); //きりんが産まれました。 跳ねた距離 = うさき->動け(跳ねろ); //動物クラスが持つ、動くメソッドをうさぎに適用しました。うさぎは跳ねたときのデータに書き変わります。疲労度が増えてるかもしれません。戻り値は跳ねた距離です。 食った葉っぱの枚数 = きりん->食え->(柳); //きりんに柳の葉っぱを食わせます。きりんの内部データは自動で腹が膨れます。戻り値として食った葉っぱが返されます。 きりん->死ね; //デストラクタ。キリンに関するデータを全部メモリから消去します。 メソッドは関数のようですが、当然インスタンスからしか呼ぶことができず、名前空間を汚しません。 きりんからメソッドを呼ぶと、メソッドはきりんの情報を受け取ります。(もしくはメソッドやクラス全体はきりんの情報をすでに持っていて、きりんから呼ばれたことをメソッド自身は知っており、きりんのデータを扱えます)。 勘違いが多々見受けられるので、もう少し勉強したほうがいいね。 その言語のオブジェクト指向か、オブジェクト指向自体の定義か。 かなり違う。 結局、設計って何のためにするの? って言ったら読む人間にわかりやすくするためだから いくら哲学でガチガチに固めても読み手が 「何これさっぱりわからなーい」って言ったらそこで終わりな 設計書と内容が乖離してるソースもクソだし どの仕様を実現しようとして書いたコードなのかわからないのもクソ そもそも仕様の定義が明確でないのなんてソース書く前からクソが漏れてる ブリブリブリブリ漏れてる! サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ https://www.youtube.com/watch?v=NDq1QoJY0nY 宇ドナルドアナリストパワーストーンコーチングとしまえん サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足 サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題 春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残 コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題 マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了 校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント 高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート オブジェクト指向に何故するかと言えば 変数、プロパティは全てpublicにすればいいじゃないかと言うところから始まる ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる