質問

を使うオブジェクト指向言語(Java)のかかっただけでも"クール"を開始した符号といいます。んなことになって考えていたのもつい最近まで申込みが多くの質問OOP.一般の印象を取得しまう人には苦労します。私が思うと、とか思いず、天才うと思っていなければならない見逃していたものは誤解されます。

なぜOOPすればよろしいでしょうか? うすればよろしいでしょうか?

役に立ちましたか?

解決

私個人の力学のOOP比較的容易に把握しずらい。にくかったの"なぜ"です。初めてさまようにシークエンサーデータ検索の問題です。ここにいくつかの例がありますの理由が思いのほとんどの人には厳しく:

  1. まぁ教OOからであろう。手続きの符号化ではない"悪い癖"とはツールの一部です。個人法OOプログラムが僕の手続きを見い.さらに、学習の手続きグは十分には、その限界となり、○○なものです。

  2. 前のことができるの把握OOを把握しておく必要があり、基礎データ構造および下旬に結合/高としました。でgrok多型が基本的にパスを回しながらのポインタをデータバンチの機能に対する操作を行うデータのない場合でも理解する概念の構造化データの代わりに用プリミティブのパスを回しながら高次機能へのポインタ。

  3. デザインパターンの指導が必要であると考えて何かの基本OOなります。デザインパターンを助けしていますので、森の木々の間から、比較的、具体例を示すことがOOを簡略化でき問題は現実には、いったいこれらについて学ぶととにかく.さらに、だんOO、デザインパターンが鮮明になっ後から振り返ってみると.

他のヒント

まだ言及されていない要因がいくつかあると思います。

まず第一に、少なくとも「純粋なoop」(例えば、smalltalk)で すべての オブジェクトは、あなたの心をかなり不自然な構成にひねらなければなりません。 21 (たとえば)本当に ただの値。 OOPの大きな利点は現実をより密接にモデル化することであると言われている場合、これは特に問題になりますが、LSDにインスパイアされたビューのようにひどく見えるものを、最も基本的で明白な部分でさえも採用することから始めます。現実。

第二に、OOPの継承は、ほとんどの人のメンタルモデルにも非常に密接に従うことはありません。ほとんどの人にとって、物事を最も具体的に分類します いいえ 機能するクラス階層を作成するために必要な絶対ルールの近くにどこにでもあります。特に、aを作成します class D それは別のものから継承します class B そのオブジェクトを意味します class D 絶対に、前向きに共有してください すべて の特性 class B. class D 独自の新しい異なる特性を追加できますが、 すべて の特性 class B 無傷のままでなければなりません。

対照的に、人々が物事を精神的に分類するとき、彼らは通常、はるかにゆるいモデルに従います。一例として、人がオブジェクトのクラスを構成するものについていくつかのルールを作成する場合、他のルールが十分に守られている限り、ほとんどすべてのルールを破ることができることが非常に典型的です。実際に壊れることができない少数のルールでさえ、とにかくほぼ常に「伸ばす」ことができます。

たとえば、「車」をクラスと見なします。それを見るのはとても簡単です 広大 ほとんどの人が「車」と考えているものの大部分には、4つの車輪があります。しかし、ほとんどの人は、3輪しかない車を見ています(少なくとも写真の写真を見ています)。適切な年齢の私たちの何人かは、6つの車輪などがある80年代前半(またはそれ以降)からのレースカーまたは2つのレースカーを覚えています。これにより、基本的に3つの選択肢が残ります。

  1. 車の車がいくつあるかについては何も主張しないでください。しかし、これは常に4つになるという暗黙の仮定につながる傾向があり、別の数で壊れる可能性が高いコードにつながる傾向があります。
  2. すべての車には4つの車輪があると断言し、他の車を「車ではない」と分類するだけです。
  3. 念のため、クラスを設計して、念のため、この機能が必要、使用、または適切にテストされる可能性が十分にある可能性が高いにもかかわらず、車輪の数の変動を可能にします。

OOPについて教えることは、しばしば巨大な分類法を構築することに焦点を当てています。たとえば、地球上のすべての既知の生命の巨大な階層、またはその順序で何かの断片の断片です。これは2つの問題を提起します。何よりもまず、多くの人々が、手元の質問とはまったく無関係な膨大な量の情報に集中することに導く傾向があります。ある時点で、私は犬の品種をモデル化する方法、そして(たとえば)「ミニチュアプードル」が「フルサイズのプードル」から継承すべきか、その逆を継承すべきか、または抽象的なベース「プードル」があるかどうかについて、かなり長い議論を見ました。 「クラス、「フルサイズのプードル」と「ミニチュアプードル」が両方とも継承されています。彼らがすべて無視しているように思われたのは、アプリケーションが犬のライセンスの追跡を維持することに対処することになっていたことであり、目的の目的のために、「品種」(またはその順序で何か)という名前の単一のフィールドを持つことは完全に適切でした。品種間の関係のモデリング。

第二に、そしてほとんど重要なことは、手元のタスクにとって重要な特性に焦点を合わせるのではなく、アイテムの特性に焦点を合わせることにつながることです。それは物事をそのままモデリングすることにつながります。実際に必要なのは、私たちのニーズを満たす最も単純なモデルを構築すること、そして抽象化を使用して適合することです 必要 私たちが構築した抽象化に合うサブクラス。

最後に、もう一度言います:私たちは ゆっくり 長年にわたってデータベースによって取られた同じパスに従ってください。初期のデータベースは階層モデルに従いました。データのみに焦点を当てる以外に、これは単一の継承です。しばらくの間、いくつかのデータベースがネットワークモデルに従っていました - 本質的に複数の継承と同一です(そして、この角度から見ると、複数のインターフェイスは複数のベースクラスとは十分に違います。

ただし、昔、データベースは主にリレーショナルモデルに収束していました(SQLではありませんが、このレベルの抽象化では、現在の「NOSQL」データベースもリレーショナルです)。リレーショナルモデルの利点は十分によく知られているため、ここでそれらを繰り返すことを気にしません。プログラミングにあるリレーショナルモデルの最も近いアナログは汎用プログラミングであることに注意してください(そして申し訳ありませんが、名前にもかかわらず、Java Genericsは、例として、実際には資格がありませんが、それらは正しい方向)。

OOPには抽象的に考える能力が必要です。プロのプログラマーでさえ、ほとんどの人々が本当に持っている贈り物/呪い。

このように基本的な難易度を要約できると思います。

// The way most people think.
Operation - object - parameters
// Example:
Turn the car left.

// The way OOP works conceptually
Object - operation - parameters
// Example:
Car.Turn(270);

確かに、人々は270として「左」のマッピングに慣れることができ、ええ、「ターン・ザ・カー」の代わりに「car.turn」と言うことはそれほど大きな跳躍ではありません。しかし、これらのオブジェクトにうまく対処し、それらを作成するには、通常の考え方を反転する必要があります。

オブジェクトを操作する代わりに、実際に自分で物事を行うようにオブジェクトに言っています。それはもう難しくないかもしれませんが、窓が自分自身を開くように言うことは奇妙に聞こえます。この考え方に使用されていない人々は、最終的にそれがどういうわけか自然になるまで、その奇妙さと何度も闘わなければなりません。

どんなパラダイムでも、ほとんどの人にとって、把握するには「エッジの上」の特定のプッシュが必要です。定義上、それは新しい思考モードであるため、古い概念を一定の量の手放し、新しい概念が役立つ理由を完全に把握する必要があります。

問題の多くは、コンピューターのプログラミングを教えるために使用される方法が一般的にかなり貧弱であることだと思います。 OOPは今では非常に一般的であるため、それほど目立ちませんが、機能的なプログラミングでは頻繁に見られます。

  • 重要な概念は奇妙な名前の後ろに隠されています(FP:モナドとは?

  • 奇妙な概念は、彼らが実際に何をするか、なぜあなたがそれらを使用するのか、または誰かがそれらを使用することを考えた理由ではなく、比phorで説明されています(FP:モナドはスペーススーツであり、それはいくつかのコードを包みます。オブジェクトはアヒルのようなもので、動物から騒ぎ、歩き、継承することができます)

  • 良いものは人によって異なるため、どの学生にとっても転換点が何であるかは明確ではなく、多くの場合、教師は覚えていません。 (FP:ああ、モナドでは、タイプ自体に何かを隠し、毎回何が起こっているのかを明示的に書き留めることなく、それを持ち歩くことができます。

最悪なことは、質問が示すように、一部の人々はすぐに概念が良い理由を理解するためにスナップし、一部の人々はそうしないことです。それは本当に転換点が何であるかに依存します。私にとって、そのオブジェクトを把握することは、そのデータのデータとメソッドを保存することが重要でした。その後、オブジェクトからのメソッド呼び出しが、そのオブジェクトを最初のパラメーターとして静的呼び出しにすることに非常に似ていることに気付くように、後でジャンプしました。

後で小さなジャンプは理解を洗練するのに役立ちますが、「OOPが意味をなさない、なぜ人々はこれをするのですか?」から人を連れて行くのは最初のものです。 「OOPが最善です、なぜ人々は他のことをするのですか?」

OOPの基本的な説明は、フィールドでの使用方法とはほとんど関係がないためです。それを教えるためのほとんどのプログラムは、「車をオブジェクトと考え、ホイールをオブジェクト、ドア、トランスミッションとして考えてください...」などの物理モデルを使用しようとしますが、シミュレーションプログラミングの不明瞭なケースの外では、オブジェクトは、非物理的な概念を表したり、間接を導入したりするために、はるかに頻繁に使用されます。効果は、人々が間違った方法でそれを直感的に理解させることです。

デザインパターンからの指導は、OOPを記述するためのはるかに優れた方法です。これは、抽象的に説明するのではなく、オブジェクトで実際のモデリングの問題を効果的に攻撃する方法をプログラマーに示しているためです。

私は国立大学志望の浪人生でdsimchaの答えは:

  1. 教OOからないものは悪いこと以内のものに関する情報は見つかりませんで手続きを教えます。重要なのはこう書く明確で、簡潔で、粘性コードを問わずOOまたは手続き.

  2. 個々の手法の良いプログラムOOない傾向にある手続きのみです。このような真の進化のOOの言語(読むC#ではC++のその他のOO語ん)とその構文がますます複雑に日(lambdas、LINQ to objectsます。しかも性格とOOの方法論や手続きの言語は、線形の自然を、それぞれるものかどうか疑問を持つも変わ間非営利団体)が存在している。

  3. できないマスター手続きの言語を知らずのデータ構造です。のポインタがコンセプトとしての重要な手続きの言語とOO。パラメータを渡すことができると考えるのは手続き上の言語を必要とする理解のポインタなどでを習得するために必要な一定為OO。

  4. いとは思わないデザインパターンの指導が必要であると考え早OOプ全でないという理由によって、基本的にOOグです。一ファイルをダウンロードすると良いOOプログラマは知らなデザインパターン実際にできるので上手に利用して知られるデザインパターンになるということを知ることについては文書化して適切な名前が書いて書いてきました。何を教えを根本的にデザインの原則などの単一の責任、ありとインターフェけた。残念ながら、多くの人OOのプログラマは、いずれかを知らないこの基本的な考え方や視するので、いいゴミ○○コードがあります。みを徹底的に理解し、これらの原則はデザインパターン紹介します。

回答元のポスターの質問がありOOは難しい概念を理解しよ手続きプログラミングこれはいいと思っている点でプロパティとメソッドの実際のオブジェクト。例えば、ヒト脳機能しない"TurnOn"方法としてのテレビがその機能としての人間がonになります。同様に、多型である外国人の概念は、人間の脳が一般的には各実際のオブジェクトには、"フェイス"。相続が不自然にな脳のだからといって開発なんでいます。一般的に、人間の脳の必要を学習させることに成功OOながら手続きの言語が自然です。

多くのプログラマーは、最初の設計と計画に困難を抱えていると思います。誰かがあなたのためにすべてのデザインを行っていても、OOPの原則から脱却することはまだ可能です。スパゲッティコードをたくさん撮ってクラスに捨てた場合、それは本当にOOPですか? OOPを理解していない人は、まだJavaでプログラムできます。また、特定のメソジョロジーに従うことやそれに反対することをいとわないことで理解するのが難しいことを混同しないでください。

あなたは読むべきです オブジェクトは決して?まあ、ほとんどありません。 (ACMメンバーシップが必要)Mordechai Ben-Ariは、OOPが非常に困難であることを示唆しています。なぜなら、それは実際に何かをモデル化するのに自然なパラダイムではないからです。 (私はこの記事について留保していますが、彼がどの基準であるかが、OO言語を使用した手続き的なパラダイムとは対照的に、それがOOPパラダイムに書かれていると言うために満足する必要があると感じている基準が明らかではないからです。)

オブジェクト指向プログラミング自体は難しくありません。

難しい部分はそれをうまくやっています。コード間のカットをどこに配置して、物事を一般的なベースオブジェクトに簡単に移動し、後で拡張できるようにすることができますか?他の人がコードを使用できるようにする方法(クラスを拡張し、プロキシでラップし、メソッドをオーバーライドする)をフープを飛び越えて行うことなく。

それは難しい部分であり、正しく行われた場合は非常にエレガントであり、ひどく行われれば 非常に 不器用。私の個人的な経験は、十分にやるために、あなたがそれを違ったやり方でやってほしいと願っていたすべての状況で多くの練習を必要とすることです これ 時間。

リチャード・ファインマンが、人々が実際にまったく異なる方法論を考えているのかを話し合っているのを議論しているビデオを見ていました。

ハイレベルのデザインを行うとき、私はたまたまオブジェクトを視覚化し、それらを見て、彼らのインターフェイスを見て、どの経路情報が通過する必要があるかを見ることができます。

また、詳細を思い出すのに苦労しており、OOは素晴らしい組織の援助であることがわかりました。これは、サブルーチンのゆるく組織化されたリストをスキャンするよりも、機能を見つけるのが簡単です。

私にとってOOは大きな利益でしたが、同じ方法を視覚化しないか、高レベルのアーキテクチャをしないと、おそらく無意味で迷惑です。

GW-BasicとTurbo Pascalのプログラミングをかなり前にOOに紹介することができたので、最初はそれを やりました 私の頭をしてください。

これが他の人に起こることであるかどうかはわかりませんが、私にとってはこのようなものでした。プログラミングに関する私の思考プロセスは純粋に手続き的でした。 「そのようなことなどが発生し、次にそのようなものが次に起こる」など。変数とデータは、プログラムの流れの中でつかの間の俳優以上のものとは考えていませんでした。プログラミングは「アクションの流れ」でした。

把握するのが簡単ではなかったもの(今のように愚かなように)は、データ/変数が実際に 本当に重要です, 、プログラム「フロー」のつかの間の俳優であるよりも深い意味で。またはこれを別の言い方をするために:私は何を介してそれを理解しようとし続けました 起こります, 、何ではなく , 、それを把握するための本当の鍵です。

理解するのは難しいとは思わないが、プログラマーの多くが手続き型言語から来ているコンセプトにとって新しいものである可能性があるかもしれない。

私が見たものから、(少なくともフォーラムで)多くの人々を見た/読んだことから、OOPの「結果」を探しています。あなたが戻ってコードを拡張しない手続き上のプログラマーである場合、おそらく利点を理解するのは難しいかもしれません。

また、人々がそれを読んだり見たりしているのであれば、多くの悪いoopがそこにあります。

IMOそれが「クリック」するまで待つ必要があります。または、本当の知識を持っている人に教えられる必要があります。急いではいけないと思います。

OOPが多くの人にとって難しい理由は、ツールが実際にそれを促進しないためだと思います。

今日のコンピューター言語は、コンピューターで起こっていることの抽象化です。

OOPは、抽象化を表す抽象化された方法です。

したがって、抽象化を使用して、抽象化を使用して抽象化を構築しています。これに加えて、私たちが抽象化しているのは、通常非常に複雑な身体的/社会的相互作用であり、不思議ではないことをお勧めします。

私は実際に「オブジェクト指向プログラミングの闘争」と呼ばれるブログを持っています。それは、それを学ぶこととの闘争のいくつかから生まれました。手続き上のプログラミングを使って非常に多くの時間を費やしたので、理解するのは特に難しいと思います。そして、オブジェクトが属性と行動のコレクションで表現できるという考えを頭に導くのに苦労しました(私は慣れていました単に変数とメソッドのコレクション)。

また、言語オブジェクト指向 - 継承、インターフェイス、多型、構成などを作る多くの概念があります。実際にコードを効果的に書くことができる前に、そしてオブジェクト指向のコードを作成する前に、それの理論について学ぶべきことがたくさんあります方法は、手続き上のプログラミングでは、変数のメモリ割り当てや他の方法へのエントリポイント呼び出しなどのことを理解するだけの問題です。

モチベーションすくう時はあまり見かけないのはなぜ、もできない場合はを見て何をしたかと図かったです。

何が必要かというと小さな案件を使用するOOい有物です。い提案を通して見ている書籍のデザインパターンとしては明らかに役立つものとOO.(使った戦略を一度に試みたのです。ようにフライ級またはシングルトンすれば、それらの利用を考える物全般を使用しないオブジェクト遂行す。)

私はそれが年齢(経験の代理としての年齢)と、さらに重要なことに関心に依存すると思います。あなたが「若い」(つまり、グリーン、おそらく)、他の方法を考えたことがないなら、それは非常に簡単に思えます。一方、それがあなたが今まで見た中で最もクールなものだと思うなら、28歳か何かで私に起こった - それは簡単に鳴るのは簡単です。

一方、私のJavaの学生の多くが行ったように、「なぜ私たちはこれを学んでいるのか、それはただの流行だ」と思うなら、学ぶことは事実上不可能です。これは、ほとんどのテクノロジーに当てはまります。

どのパラダイム(OOP、機能など)に関係なく、コンピュータープログラムを作成するために、プログラムがどのようなステップを実行するかを知る必要があります。

プロセスを定義する自然な方法は、その手順を書き留めることです。より大きなタスクのために、タスクをより小さなステップに分解することです。これが手続き的な方法であり、これがコンピューターの動作です。これが、チェックリストを段階的に進める方法です。

OOPは別の考え方です。ステップバイステップで行う必要があるタスクのチェックリストを考える代わりに、オブジェクト、その能力、関係について考えます。したがって、多くのオブジェクト、小さな方法を書くと、プログラムは魔法のように機能します。これを達成するには、あなたの心をひねる必要があります...

そして、これがOOPが難しい理由です。すべてがオブジェクトであるため、彼らがするのは他のオブジェクトに何かをするように頼むことだけであり、他のオブジェクトは基本的にいくつかを行います。したがって、OOPプログラムのコントロールは、オブジェクト間で激しくジャンプすることができます。

現在、プログラミングを学んでいて、この分野でいくつかの問題を抱えている人として、私はそれがあまり多くのことではないと思います。これは、この概念の特定の実装と同様に、概念を理解するのが難しいと思います。 OOPのアイデアを得て、PHPで約1年間使用しているので、これを言いますが、C#に進み、他のプログラマーのオブジェクトの使用を見ると、多くの人が方法でそうしていることがわかります。私が理解していないこと。これは、OOPの原則をよりよく理解するために私を導いてくれたのはこれです。

もちろん、私はこの問題がネイティブに勤務する言語での私の経験の欠如であり、時間が経つにつれて、私が新しいプログラマーと同じように不明確なオブジェクトを利用する新しい方法を見つけることができることを理解しています。現在経験しています。ジェリー・コフィンは、特に彼のコメントで、これに数回触れます:

OOPの大きな利点は現実をより密接にモデル化することであると言われている場合、これは特に問題になりますが、LSDにインスパイアされたビューのようにひどく見えるものを、最も基本的で明白な部分でさえも採用することから始めます。現実。

私はこれが非常に正確であると思います。なぜなら、それは本当に物事ではないもののために誰かがクラスを作成しているのを見たときによく得られる印象です - 特定の例は私を逃れますが、私がその場で思いつくことができる最も近いのは、距離を扱うことですオブジェクト(次にこの同じ混乱を引き起こす何かが表示されるときに編集します)。時には、OOPは一時的に独自のルールを無視しているようで、直感的ではなくなります。これは、オブジェクトがオブジェクトを生成しているときに発生し、それらをカプセル化しているクラスから継承する場合に発生します。

私のような人にとっては、オブジェクトの概念を複数のファセットを持っていると考えるのに役立つと思います。ほんの少しのパラダイムシフトを備えた距離のようなものは、理論的なオブジェクトとして出くわすことができますが、あなたの手に保持されることはありません。プロパティのセットを持っているが、そのプロパティへのアクセスなど、より抽象的な動作セットを持っていると考えなければなりません。これが私の理解の鍵であることは肯定的ではありませんが、私の現在の研究が先導しているようです。

用語は、オブジェクト指向プログラミング(うんち)の原則を学習するときの道路の私の衝突でした。それはあなたが作品が所定の位置に落ち始めた基礎を把握するときです。新しい概念を学ぶすべてのことと同じように、新しい概念は少し難しいです。

少なくともOOPに平行に設計パターンを採取する必要があることに同意しました。

私にとっての主なジャンプは、OOPの抽象的な概念を理解することでした。今、私は一般的にプログラミングに非常に慣れていないので、1年から1年半のプログラミングを今すぐプログラミングしているので、OOPへの紹介はActionScriptと処理を使用していました。 ActionScriptコーディングを初めて学んだとき、それはOOPではありませんでした。アクションパネルに直接コーディングすることを学びました。これが、プログラミングの基本的な基礎(変数、関数、ループなど)を学んだ方法です。それで、私はそれをフラッシュまたは処理でステージに直接何かしていると学びました。

OOPが物事に入ったとき、オブジェクト内で使用して再利用できるようにメソッドとプロパティを作成できることに気付いたことは、最初は把握するのが少し困難でした。すべてが非常に抽象的で処理が困難でしたが、プログラミング言語自体ははるかに優れていますが、最初はそれらのつながりを作るために信仰の飛躍を遂げました。

レシピ

良いOOPの理解=優れたメンターまたは良い本、または両方 +個人的な興味 +練習。

個人的な興味

私の個人的な経験から、 個人的な関心は、メンターや良い本、または両方を合わせた適切な入力で、手続き上のプログラミングからOOPまで橋を渡るための長い道のりがあります.

練習、練習、練習

私の親友 OOPをよりよく理解することは、 練習。 これは間違いなくあなたのOOP能力を促進します。

ことわざにあるように 「ハードワークに代わるものはなく、成功への近道もありません。」

幸運を!

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top