質問

最近、ファンではない同僚と議論しました。 OOP. 。私の注意を引いたのは、彼が言ったことです。

「オブジェクト内でコーディングを行うことに何の意味があるのでしょうか?再利用する場合は、ライブラリを作成し、当面のタスクに必要な関数を呼び出すだけです。ポリモーフィズム、継承、インターフェイス、パターンなどの概念は必要ですか?」

私たちは、電子商取引サイトと不動産に関する小さなプロジェクトを開発している小さな会社です。

「日常的な現実世界」の設定で OOP を活用するにはどうすればよいですか?それとも、OOP は本当に複雑な問題を解決することを目的としており、「日常的な」開発を目的としたものではなかったのでしょうか?

役に立ちましたか?

解決

OOPについての良いものは、行動のセットへのデータのセットを結ぶから来ています。

あなたはデータの関連セットに多くの関連の操作を行う必要がある場合は、

だから、あなたは、構造体を操作する多くの機能を記述したり、オブジェクトを使用することができます。

オブジェクトは、あなたの相続の形でいくつかのコードの再利用の助けを与えるます。

IME、複雑な構造体とそれらを操作する関数のセットを維持することである属性とメソッドの既知のセットを持つオブジェクトで動作するように簡単です。

一部の人々は、継承やポリモーフィズムについて上に行くだろう。これらは貴重ですが、(私の意見では)OOPでの真の価値は、それが行動してデータをカプセル化し、仲間の素敵な道から来ています。

あなたはあなたのプロジェクトでOOPを使用する必要がありますか?それはあなたの言語はOOPをサポートしてどれだけに依存します。それはあなたが解決する必要がある問題の種類によって異なります。

あなたが小さなウェブサイトを実行している場合でも、あなたはまだ私は開発言語での適切なサポート与えられたOOPの設計を使用することになり、十分な複雑さについて話している。

他のヒント

私は個人的に見る:コンテキスト

あなたはOOPでプログラムすると

あなたは、コンテキストの大きな意識を持っています。それはあなたが現実の世界にもオブジェクト指向されているので理解しやすいようにコードを整理するのに役立ちます。

ちょうど仕事に何かを得るよりも - あなたの友人のポイントを、うまく設計されたオブジェクト指向設計は、従うことを拡大して、拡張し、実装するために、理解しやすいです。それは断固として(そうであってもCの構造体がオブジェクトである)に類似しているか、一緒にとどまるべきデータを保持するための作業を委任するために、たとえばそんなに簡単です。

まあ、多くの人が学術的にもっと正確な答えをくれると確信していますが、最も貴重な利点のいくつかについて私の見解を以下に示します。

  • OOP により、より適切なカプセル化が可能になります
  • OOP を使用すると、プログラマはより論理的な観点から考えることができるため、(適切に設計されていれば) ソフトウェア プロジェクトの設計と理解が容易になります。
  • OOP は時間を節約します。たとえば、C++ 文字列オブジェクトやベクトルなどを使って何ができるかを見てみましょう。そのすべての機能(およびそれ以上の機能)は「無料」で提供されます。 さて、これらは実際にはクラスライブラリの機能であり、OOPそのものではありませんが、ほとんどすべてのOOP実装には優れたクラスライブラリが付属しています。それらすべて (またはそのほとんど) を C で実装できますか?もちろん。しかし、なぜ自分で書くのでしょうか?

デザイン パターンの使用を見ると、OOP の有用性がわかります。カプセル化と再利用だけではなく、拡張性と保守性も重要です。物事を強力にするのはインターフェースです。

いくつかの例:

  • オブジェクトなしでストリーム (デコレータ パターン) を実装するのは困難です

  • 新しい暗号化タイプ (戦略パターン) など、既存のシステムに新しい操作を追加することは、オブジェクトがなければ難しい場合があります。

  • PostgresQLの様子を見てください 実装された方法と データベースブックによると、データベースは 実装すると、大きな 差。この本は、 ノードオブジェクトを使用します。Postgres は無数のテーブルを使用し、 これらのノードをエミュレートしようとするマクロ。それははるかにきれいではなく、はるかに そのため、拡張が難しくなります。

リストは続きます。

ほとんどのプログラミング言語の力は、彼らが利用できるように抽象化です。オブジェクト指向プログラミングは、それはあなたが関連するアイデアやアクション間の関係を管理することを可能にする方法で、抽象化の非常に強力なシステムを提供しています。

任意のための領域を計算し、図形のコレクションを拡大するタスクを考えてみましょう。任意のプログラマはすぐに電気ショック療法円、正方形、三角形の面積のための関数を書くことができます。そして、ライブラリに格納します。識別し、任意の形状の面積を計算するプログラムを書くしようとすると困難が来ます。シェイプの新しい種類を追加するたびに、五角形を言う、あなたはあなたのプログラムが新しい形状を識別し、あなたの「関数のライブラリ」から、正しい面積ルーチンを呼び出すことができるようにIFまたはCASE構造のようなものを更新し、拡張する必要があるだろう。しばらくすると、このアプローチに関連したメンテナンスコストがたまり始めます。

オブジェクト指向プログラミングでは、これの多くは、単に面積法が含まれているShapeクラスを定義free--ています。そして、それは本当に問題で具体的にどのようなあなたは、実行時に扱っている形状、単に各幾何学図形に形状を継承したオブジェクトを作成し、地域メソッドを呼び出すことはありません。オブジェクト指向パラダイムが時間内かどうか現時点での詳細を処理し、このユーザ入力で、我々は円形、三角形、四角形、五角形またはちょうど半分分前に追加されました楕円オプションの面積を計算する必要があります。

あなたは面積関数が呼び出された方法の背後にあるインターフェイスを変更することを決定した場合はどう?オブジェクト指向プログラミングでは、あなただけのShapeクラスを更新してしまうと変更が自動的にそのクラスから継承するすべてのエンティティに伝播します。非オブジェクト指向システムを使えば、あなたの「関数のライブラリ」を通じて強と、個々のインターフェイスを更新するタスクに直面することでしょう。

要約すると、オブジェクト指向プログラミングは、あなたのコード内で繰り返しを排除し、機能拡張やメンテナンスを合理化することで、あなたの時間と労力を節約することができます抽象化の強力なフォームを提供しています。

不要な複雑さを隠し:

すべてのプログラミングパラダイムは、同じ目標を持っています。

あなたの友人が使用するように

いくつかの問題は簡単に、必要不可欠なパラダイムで解決されています。他の問題は簡単にオブジェクト指向のパラダイムで解決されます。他の多くのパラダイムのがあります。主なもの(論理プログラミング、関数型プログラミング、および命令型プログラミング)は、すべて、互いに等価です。オブジェクト指向プログラミングは通常のプログラミング命令型の拡張として考えられています。

オブジェクト指向プログラミングプログラマは似ていますが、同じではありませんアイテムをモデル化されたときに最高の使用です。不可欠パラダイムは一つの関数にモデルの種類を置きます。オブジェクト指向のパラダイムは、関連するオブジェクトに異なるメソッドにモデルの種類を分離する。

あなたの同僚が1つのパラダイムで立ち往生しているようです。幸運を。

1994年ごろ、私は同時にOOPとC ++の意味を理解しようとしていた、と私はOOPの値が何であったか、原理的には理解できるにもかかわらず、自分がイライラしました。私は私はいくつかの学術的な抽象化を支持して生産性をあきらめたように見えたことを他の言語からアプリケーション(主に、基本的な組み立て、およびパスカル家族の言語)のいずれかの部分の状態を台無しにできることに使用されました。残念ながら、MFCのようなオブジェクト指向のフレームワークと私の最初のいくつかの出会いは、それが簡単にハックするためになさが、必ずしも啓発の方法で多くを提供していませんでした。

これは、永続性の組み合わせを介してのみであった、露光は、両方1)が働き、2)同等の手続きコードよりも多くのコヒーレントかつ直感的に読み取る(非C ++)オブジェクトを扱う方法、およびオブジェクト指向のコードを慎重に分析を交互に私は実際にそれを得るために始めています。そして15年後、私は私が手続き的なアプローチのようにきちんとやって想像できない巧妙な、まだ印象的なシンプルなオブジェクト指向のソリューションの発見(私には)新しいにて定期的に驚いています。

私は過去数年間にわたり関数型プログラミングパラダイムの意味を理解しようとする闘争の同じセットを通過してきました。あなたは、電源の連続を見下ろしているときにポール・グレアムを言い換えするには、あなたが欠けているすべてのものを参照してください。あなたは、電源の連続を探しているときに、あなたがパワーが表示されていない、あなただけのすごみを参照してください。

私が思うに、別の方法が何かをすることにコミットするためには、あなたが誰かは明らかに、より強力な構築物をより生産的であること、あなたが壁に当たって自分自身を見つけるとき2)不信中断参照)1にあります。これはおそらく、あまりにも、新しいパラダイムの理解でに沿って、さらに、少なくともほんの少しであるメンターを持っているのに役立ちます。

あなたは誰かがすぐにOOモデルの価値を完全に理解したい場合は、不信を中断するために必要な機智がなければ、私はあなたがon Railsの達人プログラマ帳で一週間過ごすために誰かを聞いてより多くのより悪い行うことができると思います。それは残念ながら魔法がどのように動作するかの詳細の多くを残しんが、それはオブジェクト指向の抽象化のシステムのパワーにかなり良い紹介です。 、その本を働いた後、あなたの同僚は、まだいくつかの理由でOOの値が表示されない場合は、彼/彼女は絶望的なケースかもしれません。彼らは作品強く独断OO設計を持ち、0-60手続き型言語で同じことを行うよりもはるかに速いからそれらを取得するアプローチでの作業はほとんどの時間を過ごすために喜んでいる場合でも、ただの希望があるかもしれません。私はあなたの仕事は、Web開発を伴わない場合でも、それが本当だと思います。

私は、モデリング、それは特にC#やJavaのような静的型付け言語で、ということが判明するので、「現実世界」は、優れたアプリケーションを書くための作業のフレームワークと同じくらいのセールスポイントになるまで持ち込むほどわかりません現実の世界では、多くの場合、曲がりくねった抽象化が必要です。あなたは「形状」(形状、楕円、円)の幾何学的な抽象化のように表向きはシンプルなものをモデル化するために苦労して何千人もの人々を見て、現実の世界をモデル化することの難しさの具体的な例を見ることができます。

あなたは継承とポリモーフィズムについて話し始めるまで、

私には、OOPのパワーは、それ自体は表示されません。

OOPのための1つの引数は、カプセル化と抽象化の概念をかかっている場合は、

、よくそれは私にとって非常に説得力の引数ではありません。私は、ユーザーが注意したいこと、それに巨大なライブラリと文書のみのインターフェイスを書くことができ、または私はフィールドをプライベートにするエイダのパッケージのような言語レベルの構造に依存しているだけで、それは私がしたいことが何であるかを公開することができます公開しています。

しかし、本当の利点は、それがまったく同じコードのインターフェイスが同じ結果を達成するためにさまざまな機能に使用されていることを後でように再利用できるように、私は、一般的な階層内のコードを書いている時に来ています。

なぜこれが便利なのですか?私は私の現在のタスクを達成するために巨人の肩の上に立つことができるので。アイデアは、私が最も基本的な部品、構成オブジェクトを構成するオブジェクト...プロジェクトを構成するオブジェクトまで、問題の部分を沸かすことができるということです。一般的なケースでは非常によく動作を定義するクラスを使用することにより、私は同じことのより具体的なバージョンをビルドして、同じことのより具体的なバージョン、そしてさらにより特定するために、同じ実証済みのコードを使用することができます同じことのバージョン。キーは、これらの各エンティティは、既に符号化され、テストされた共通性を持っていることである、と後で再びそれをreimplimentする必要はありません。私はこのために継承を使用しない場合、私は、共通の機能を再実装するか、明示的に私は、制御フローのバグを導入するためのシナリオを提供し、古いコードに対する私の新しいコードをリンクすることになります。

多型は、私は、オブジェクトの特定の機能を実現する必要がある場合において、非常に便利ですが、同じ機能にも似ていますが、ユニークな種類の中から必要とされています。例えば、Qtの中で、データを表示することができ、あなたは簡単にそのオブジェクトのメタデータを維持できるように、モデルにアイテムを挿入するという考え方があります。多型がなければ、私は現在、(つまり私は元々モデルに行くことを意図していた項目と同じビジネスロジックを行って同じコードのインターフェイスを実装する必要があります)行うよりもはるかに詳細に自分自身を気にする必要があります。私のデータバインドオブジェクトの基本クラスはモデルとネイティブに相互作用しているので、私が代わりにノートラブルで、このモデルにメタデータを挿入することができます。私はモデルが必要なものの上には関係ないと対象外必要なものを取得し、モデルが、それは私がクラスに追加したものの上には関係ないと必要なものを取得します。

彼の非常にルーム内の任意ののオブジェクトハウスや市... を可視化するために、あなたの友人に尋ねると、彼はいくつかの意味のある作業を行うことが可能である自体がシステムと単一なオブジェクトを伝えることができれば。一人で何かをして、ボタンイマイチのような

物事 - それは、電話をかけるために、オブジェクトの多くを取ります。
同様に自動車のエンジンは、クランクシャフト、ピストン、点火プラグで構成されています。 OOPS概念は、私たちの生活の中で自然のプロセスや物事に私たちの感覚から発展してきました。

「インサイドCOM」の本は、質問をすることにより、動物を特定の幼年期のゲームから類推を取ることによってCOMの目的を伝えます。

デザインは、技術や方法論を切り札。グッドデザインは、このようなオブジェクト指向言語機能を体系化するために努力するものの核心であるデメテルの法則として複雑管理の普遍的な原理を取り入れる傾向があります。

グッドデザインは、それはそれらを使用するもの最善の利益に一般的にではあるがOO特定の言語機能の使用に依存するものではない。

作るだけでなく、

  • 他の人 (そしてあなた自身) にとって、現在の状況でのプログラミングがより簡単/より保守しやすくなります。
  • すでにデータベースの CRUD (作成、更新、削除) 操作が容易になりました。

詳細については、以下を参照してください。- Java :冬眠する -ドットネット:エンティティフレームワーク

LINQ (Visual Studio) がプログラミング作業をいかに簡単にするかをご覧ください。

  • また、現実の問題を解決するためにデザイン パターンを使い始めることもできます (デザイン パターンはすべて OO に関するものです)。

おそらく、小さなデモを使ってデモンストレーションするのも楽しいでしょう。

  • 同様の方法で、従業員、アカウント、メンバー、書籍をテキスト ファイルに保存する必要があるとします。

.PS.PSEUDO的な方法で書いてみました:)

○○のやり方

呼び出すコード:io.file.save(objectsCollection.ourFunctionForSaving())

クラスオブジェクトコレクション

文字列としての関数 ourFunctionForSaving()

文字列_オブジェクト

   for each _Object in objectsCollection
         Objects &= _Object & "-"
   end for

_Objects戻る end メソッド

NON-OO ウェイ

OO 以外のコードを書き留めるつもりはありません。しかし、考えてみてください:)

さあ、言ってみましょう

OOのやり方で。上記のクラスは、書籍、従業員、メンバー、アカウントなどを保存するためのすべてのメソッドの親クラスです。テキストファイルへの保存方法を変更したい場合はどうすればよいでしょうか?たとえば、現在の標準 (.CVS) と圧縮できるようにするためです。

そして、load 関数を追加したいとします。どのくらいのコードを記述する必要があるでしょうか?OO の方法では、すべてのデータをパラメータに分割できる New Sub メソッドを追加するだけで済みます (これは 1 回だけ行われます)。

あなたの同僚にそれについて考えさせてください:)

状態と振る舞いが不十分に整列されているドメインで、オブジェクト指向得られたシステムは脆くなり、これらのドメイン内の全体的な依存密度(すなわち複雑さ)、減少させる。

オブジェクト指向のの本質は、の組織的、それは治療、全く状態と行動の間dustinguishていない、という事実の両方に均一に「機能」などに基づいているため、

このです。オブジェクトは、の全体的なの依存性を最小限に抑えるだけで機能を設定しますclumpledされます。

他のドメインでは、オブジェクト指向は、最善のアプローチではありません。さまざまな問題のための異なる言語パラダイムがあります。経験豊富な開発者は、このことを知っている、そしてドメインに最も近いどんな言語を使用して喜んでいる。

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