物理的な現実世界のオブジェクトを参照せずにオブジェクト指向を教えるにはどうすればよいでしょうか?[閉まっている]


14

オブジェクト指向の背後にある元の概念は、データの状態を保護する方法で複数のシステム間でデータのメッセージングを処理するためのより良いアーキテクチャを見つけることであったことをどこかで読んだことを覚えています。今はおそらく貧弱な言い換えですが、オブジェクトの類推(バイク、車、人など)なしでオブジェクト指向を教える方法があり、代わりにメッセージングの側面に焦点を当てているのだろうかと思いました。記事、リンク、書籍などがある場合、それは役立ちます。


6
OOの起源は、シミュレーション用に設計さた言語にあり、実際のオブジェクトに非常に基づいていると思います。これは、オブジェクト指向が非現実的なオブジェクトには役に立たないという意味ではありませんが、必ずしも照明の歴史を見ることができるとは限りません。
トムアンダーソン

7
教えるとき、なじみのある、理解可能な現実世界のオブジェクトを避けたいのはなぜですか?
アダムクロスランド

1
しかし、これは興味深い質問です。オブジェクト指向が物理的なものではなく、物理的な世界の観点からオブジェクト指向を教えるのが良いアイデアであるかどうかに関係なく、物理的な世界に関係なくそれを教える生産的な方法を知ることは改善されるでしょう。
トムアンダーソン

3
率直に言って、GUIやWebアプリ(データモデルやビューなど)にオブジェクトを使用するいくつかの例を見てみたいと思います。これらは結局のところ、開発の要点です。「現実世界」のオブジェクトは地殻です-有用ですが、良い食事には必ずしも必要ではありません
-HorusKol

1
@HorusKol:まさにその逆です。基礎となるドメインモデルは食事です。それはほとんど常に現実世界のオブジェクトに焦点を合わせています。そうでなければ、なぜソフトウェアを書くのですか?GUIまたはWebプレゼンテーションは単なる提供プレートです。興味深いことに、プレゼンテーションには多大な労力が必要です。おそらく、それはツールの原始性について何かを言っています。
-S.Lott

回答:


4

オブジェクト指向の元の概念は、今日のオブジェクト指向とは何の関係もありません。(「オブジェクト指向」という用語でアラン・ケイが本当に意味することは何ですか?を参照してください。)今日のオブジェクト指向プログラミングは、自転車や家や人などのメタファーのようなオブジェクトの作成に関するものです。メタファーの目的は、既に理解している概念を使用して人々が理解できるようにすることです。相関関係を確認し、その後、オブジェクト指向についてより深く掘り下げた違いを確認します。

編集:今日のオブジェクト指向は、さまざまなメソッド(関数)と属性(別名変数と定数)を使用して、プロパティと機能が完全/部分的に記述された完全な自己完結型オブジェクトを作成することです。


4

結合と結合の概念について話すことができます。オブジェクトは、高い凝集度と暗黙的に高い結合を持つ属性とメソッドで構成する必要があります。それらは、システムが動作するために必要な最小の粒度の操作と属性にマップする必要があります。また、コードをできる限り小さく簡単に保つという欲求、つまり、メンテナンスと拡張性を念頭に置いたコーディングも満たす必要があります。

これはまた、すべての一般的な間違いである「オブジェクトの爆発」、過剰な一般化、および誤ったメタファーの選択を防ぎます。


1
アナロジーに答えるのではなく、実際に質問に答えるのに+1が必要です!
スティーブンジュリス

1
また、これがオブジェクト指向の本質であると思います。これは、オブジェクト指向がどのように見えるかではなく、その利点がどのようなものであるかをオブジェクト指向で説明しています。リストに再利用可能性を追加すると、この回答をもう一度支持したいと思います。; p
スティーブンジュリス

2

私は現実世界のオブジェクトには焦点を合わせませんし、メッセージングにも焦点を合わせません。むしろ、私が使用した例は、「自分自身を描く方法を知っている」オブジェクトを持ちたいグラフィックスです。

たとえば、OOが組み込まれていないCで作業している場合、データオブジェクト内に関数へのポインターを保存すると便利です。もしそうなら、あなたはOOPへの道を切り開いています。

私はあたかも彼がタブレットを伝えているモーゼであるかのように、アラン・ケイを参照するのは好きではありません。むしろ、彼は数学とバイオの訓練を受けていたと思う。数学者として、彼はおそらくラムダ計算にある程度精通していました。ラムダ計算は、ハードウェアとは関係なく、かなり抽象的でした。LCでは、すべてが「オブジェクト」であると言うかもしれません-数字の0や数字の1は、引数が与えられると異なるものに評価されるオブジェクトです。それはSmalltalkにかなりうまくつながります。「メッセージ」の考え方は、ハードウェアについて話すことを避けるためです。関数(またはオブジェクトのメソッド)を呼び出すとメッセージを送信し、戻るとメッセージを(またはあなたの継続に)送信すると言うことができます。これは、別々のハードウェアで非同期に実行されているプログラム間で通信する方法を記述する方法としてラッチされました。それはいいです、しかし、通常のプログラミングでは夢中になります。OOPアイデアの価値を得るために、実行しようとしている具体的なタスクの関連性を否定したり、実行しているハードウェアの具体性を否定したりする必要はありません。不自然な類推の観点からOOPを教えると、データ構造の観点からソフトウェア設計を考えすぎてしまい、設計が過剰になり、コードが肥大化し、パフォーマンスの問題が大きくなります。それは十分に悪くなります。


私が参照した議論を読むと、Alan KayがOOと呼んでいるものが現代のOOとは何の関係もないことが指摘されていることがわかります。だから私はそれを参照しました。
ケネス

@ケネス:ここにリンクがあります。AKが言っているのは聞いていませんが、彼は自分のアイデアを誰かの聖書にしたかったのです。彼の推定では、本当に良いアイデアであるというのはただの賢いアイデアでした。彼は特に改善としてヒューイットの計画(私は徹底的に教訓を得た)に言及しています。これらは賢い人たちが持っていた素晴らしいアイデアであり、他の物事を比較して不完全と見なすべき聖杯と見なされることは決してありません。
マイクダンラベイ

@Mikeおそらく、あなたはまだ私が言っていることを誤解しているでしょう...私は彼の元のアイデアが今日のオブジェクト指向にあまり当てはまらないことを指摘するために私がした議論を参照しました。私は間違いなく彼のアイデアを崇拝したり、研究したりしません。
ケネス

@Kenneth:真の OOPやAKの本当の意味について人々が話すのを聞くときのように、私は「ホットボタン」に包まれます。ごめんなさい。
マイクダンラベイ

@Mike Alan Kayは、微生物学のトレーニングから多くのインスピレーションを得ていると言っています。特に、オブジェクトの彼の概念は、セルに基づいていました(そして、彼がこれについて言及している彼の論文/講演の中で、私は覚えていません)。
フランク・シーラー

1

例として物理オブジェクトを使用する場合と、例として非物理オブジェクトを使用する場合にほとんど違いがないと主張します。コードでは、両者はまったく同じ部分を持っています。グラフィックの例を使用して、球、立方体、円柱を使って教える場合、ボール、箱、ポールを使用するのとほぼ同じです。

したがって、物理的な例を使用せずに教えるには、例をまったく使用しないことをお勧めしますが、物理的な例を必要としない理由がわかりませんので、トピックに対する私の姿勢は

いいえ、物理的な現実世界のオブジェクトなしで教えるべきではありません


1

現実世界のメタファーで始めることを避ける方法はわかりませんが、そこに留まりたくありません。OOPを正しく行うと、すぐに抽象化されますが、次のレベルの理解では、学習者はオブジェクトをオブジェクトとして理解する必要があります。


1

興味深いことに、私のお気に入りの例のいくつかは物理的なオブジェクトではありません。例として銀行口座を取り上げます。deposit()とwithdraw()が残高の値を変更するために呼び出しコードに依存するのではなく、サービス料を請求する理由を誰もが「理解」し、サービス料を忘れないようにします。画面上の図形は二重に無形であり、Stroustrupは古典的な「Shapes」の例は彼が知っている2つの最も古いOOの例の1つであり、40年前にさかのぼります(もう1つは44歳の車両です)。

重要なのは、人々があなたの例をすぐに理解することです。エレベーターは、エレベーターに精通している人にのみ良い例です。等。


1

プログラミンググループに参加している場合は、何人かの人を集めて、システムに必要なことを行うように互いに伝える方法について話し合います。文字通り、システム内で役割を果たします(各役割を演じるだけでこれを自分で行うことができますが、グループで行う方が簡単です。自分でいる場合はおもちゃが役立ちます)。どのデータを持っているかではなく、各人が何をしているか、何をしようとしているのかに集中してください。人々と一緒にこれを行うと、メッセージや役割に焦点を当てるのに役立ちます。人々は自分がしていることを覚えているが、持っているデータは覚えていないためです。

互いに依頼しなければならないこと、およびそれを行うために必要な情報をメモします。他のプログラマがあなたのデータに何かノーと言って、彼にそれが必要な理由を尋ねる場合、あなた自身のデータを保護してください(データのカプセル化に役立ちます)。


さらに、これはデータコレクションだけのオブジェクトがあるかどうかを確認する良い方法であると付け加えます。文字通り何もすることがない人になってしまうからです。次に、オブジェクトデータが使用されている場所を考え、そのデータが単にそれらのオブジェクト内にある方が理にかなっています。
コーマックマルホール

0

ボトムアップ/メタルアプローチが役立つと思います。まず、プリミティブを直接使用するのではなく、データをどのように構造化できるかを示すために、Cスタイルの構造体とポインターを説明します。次に、遅延バインディングと関数ポインターについて説明します。次に、これらを使用してオブジェクトを構築できることを説明します。オブジェクトとは、基本的にカプセル化されたデータの山であり、データの操作に必要な関数へのポインターです。

この説明は、実装とは無関係に概念を教える従来の数学/ comp sciの方法と矛盾しますが、それは私(明らかに、comp sciではなく、エンジニアリングのバックグラウンドを持つ人)が最終的にオブジェクト指向を取得した視点です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.