オブジェクト指向プログラミングの練習方法は?[閉まっている]


13

私は常に手続き型言語でプログラミングしてきましたが、現在はオブジェクト指向に向かっています。私が直面した主な問題は、効果的な方法でオブジェクトの向きを練習する方法が見つからないことです。私のポイントを説明します。PHPとCを学んだときは、練習するのはとても簡単でした。何かを選択し、そのアルゴリズムを考えるだけでした。

たとえば、PHPでは、座って考えてみるのが問題でした。「実は、製品を追加できる管理領域を備えたアプリケーションを1つ作成してみましょう」。これは非常に簡単でした。ユーザーを登録し、ユーザーをログインし、製品を追加するアルゴリズムを考える必要がありました。これらをPHPの機能と組み合わせて、練習するのに良い方法でした。

さて、オブジェクト指向では、さらに多くのものがあります。アルゴリズムについて考えるだけでなく、要件をより深く分析し、ユースケースを記述し、クラス図、プロパティとメソッドを理解し、依存関係の注入などを設定します。

主なポイントは、私がオブジェクト指向を学習している方法では、良いデザインが重要であるように思えるのに対し、手続き型言語では曖昧なアイデアで十分だったということです。手続き型言語では、設計なしで良いソフトウェアを書くことができると言っているのではなく、それを実践するために実行可能であるだけであり、オブジェクト指向では、実行するためでさえ、適切な設計なしでは行けないようです。

これは問題のようです。練習するたびに多くの要件やユースケースなどを把握する必要がある場合、オブジェクトの向きを改善するのに良い方法ではないようです。練習するたびにアプリのアイデアを1つ持つようにしています。

そのため、オブジェクトの向きを練習する良い方法は何ですか?


1
私の大学の初期の頃、OOPを紹介したのは、ブルース・エッケルの著書「Thinking in Java」です。それは初心者のプログラミングと手続き型開発のバックグラウンドから来た人々の両方に推奨される読み物でした-多分それはあなたを助けるでしょう。
イヴァイロスラヴォフ

3
PHPはオブジェクト指向です。あなたはそれを使っていません。 php.net/manual/en/language.oop5.php
ロバートハーベイ

OOPアプローチを使用して、同じアプリを再度実装することができます。結局のところ、それは単なるツールです。GOFブックを作成し、既存の手続き型コードをオブジェクト指向の方法で再考することを以下から推奨することも良い習慣です。
JensG

開始時に小さなゲーム(グラフィックスなし)、カードゲームなどを作成し、それらのゲームでクラスを再利用してみてください。 stackoverflow.com/questions/1301606/...
grizwako

回答:


20

さて、オブジェクト指向では、さらに多くのものがあります。

いいえ、あなたはしません...

アルゴリズムについて考えるだけでなく、要件をより深く分析し、ユースケースを記述し、クラス図、プロパティとメソッドを理解し、依存関係の注入などを設定します。

オブジェクト指向プログラミングを実践するために、これらのことは必要ありません。

これは非常に簡単でした。ユーザーを登録し、ユーザーをログインし、製品を追加するアルゴリズムを考える必要がありました。

すべてのオブジェクト指向プログラミングは、これらの手順を実行するアルゴリズムを考えるのではなく、これらの手順を実行するために必要なオブジェクト、必要な機能、そのために必要な状態、および公開するインターフェイスの種類について考えますユーザーに。手続き型プログラミングで行う必要があるように。

唯一の違いは、必要な機能とその機能に焦点を当てるのではなく、機能と状態がどのように責任にグループ化され、それらの責任がどのように相互作用するかに集中することです。

練習方法は?手続き型プログラミングを練習するのと同じ方法:問題を選択し、クラスのバンドルを使用して問題を解決します。それがどのように吸われたかを把握し、学んだ教訓で繰り返します。


3
+1「それがどのように吸い込まれたのかを把握する」それが私がコーディングする方法です。
WernerCD

1
アプローチが好きです。複雑になりすぎてすべてを一度に学習しようとする代わりに、小さなステップから始めて、得られたすべての知識を繰り返し適用します。
superM

6

良い質問。もちろん、あなたが言っているのは、OOPの実践は実際にはこれらすべてのこと(要件分析、ユースケース、設計パターンなど)を実践することを意味するということです。

私のアドバイスは、テスト駆動開発単一責任原則という2つのことを念頭に置いて、練習セッションを開始することです。

次に、PHP / Cの場合と同じように始めます。アイデアを思いつき、そのために必要なものを考え、これらを次々に実装します。ただし、テストから開始する必要があることに注意してください(そうしないと、適切なインターフェイスを定義する必要があります。そうしないと、テスタビリティがすぐに低下します)。TDDは赤緑リファクタリングを意味します。言い換えれば、あなたはほんの少しの機能しか持っておらず、それが機能し始めたら、リファクタリングして最初から作らなかった場合は適切なオブジェクト指向設計を取得します(そうしません)。

このリファクタリング手順を実行するときは、常にSRPを思い出してください。オブジェクトに2番目の責任を追加した場合は、新しいものを作成します。

このように開発する場合、最終的なソリューションは最初のソリューションとは大きく異なることに注意する必要があります。学習曲線もかなり急になります。たとえば、Factoryパターンが何であるかは学習しませんが、代わりに、さまざまな方法でクラスのインスタンスを作成する何かの必要性を認識します。そのため、オブジェクト指向のデザインパターンをまったく聞いたことがない場合は、それらについて並列して少し読んでおくとよいでしょう。


1
つまり、基本的に「TDDとGOFを学ぶ」と言っているのです
ロバートハーベイ

3

OOPを始めたばかりの場合は、現実世界のシステムについて調べ、オブジェクトとは何か、オブジェクト間の関係は何か、それらがサポートするメソッド/インターフェースを検討することで、自分で楽しんでオフラインで「練習」できます。クラス階層でインスタンス化されたオブジェクトのコレクションとしてそれらをどのように表現するか、オブジェクトの所有関係はどうなるかなど(注:上記の「アルゴリズム」という言葉はまったく言及しません)。ドローたくさんのあなたが何かをコーディングについて考える前に、ダイアグラムのを(UMLまたは類似のビットをご覧ください)。

これにより、IS-AおよびHAS-A関係のより良い感覚を養うことができます。これは、おそらくすべてのOOP設計で最も重要な分類です(そして、それにもかかわらず、多くのベテランのOOP言語プログラマーが苦労しているもののようです) )。IS-A / HAS-Aをマスターする場合、IS-IMPLEMENTED-IN-TERMS-OFもあります(IS-KIND-OF-Aとして説明されているのも見ました:^)

真剣に、次のスーパーへの旅行では、誰かがあなたに場所のOOPシミュレーションを書く仕事を与えたと想像してください...


生物学者が無線タグ付けされたトラを追跡するのに役立つソフトウェアを作成している場合、トラが動物でストライプを持っているという事実は重要ではなく、ソフトウェアに反映されません。しかし、トラを抽象的かつis-aとhas-aの観点から考えると、それが得られるものです。
マイケルショー

1
しかし、それがこの種の運動を提案している理由です。トラや縞は良い解決策とは無関係であることがすぐに明らかになるはずです。トラッカーのOOPデザインがキャプチャするべきものの一種です。「現実世界のシステムを見る」と言うとき、私は純粋に物理的な属性を超えて見ることを意味します。たとえば、スーパーマーケットのシミュレーションには、明らかな「カート」や「買い物客」だけでなく、「キュー」などのより抽象的な概念を含める必要があります。
ティムデイ

1

私がC時代(過去にさかのぼる)から覚えていることは、私たちはその責任に基づいて関数と手続きを異なるファイルに分離するために使用していました。私はそれが完璧だと主張しているわけではありませんが、実際にオブジェクト指向言語でプログラミングを始めたのは良い出発点でした。したがって、ファイルをオブジェクトに変換することから始めることができます。

OOPに関する限り、それは実際にすべての実践と改善のための努力です。めったに誰もそれを一からやり直しません。したがって、プロジェクトのライフサイクル全体で反復が発生します。


0

のは、いくつかの用語で、追加してみましょうオブジェクト指向分析オブジェクト指向設計のように、ピーター・コードが行った 1990年代に。

これらが一緒になって、コードを記述およびテストする時点でプログラマーを(適切に)サポートできるソフトウェアエンジニアリング分野OOADを形成ます。オブジェクト指向プログラミングは、プロジェクトレベルで指定された機能目標と設計要件を満たすために、適切なレベルの粒度、プログラミング言語機能を巧みに使用することができます。

時にはそれが一人のプロジェクトであり、それからあなたはすべての帽子を着用しなければなりません(しかし、必ずしも同時にすべてである必要はありません)。私は自分の個人プロジェクトのテスト駆動開発の大ファンです(フランクの推奨を参照)が、それはオブジェクト指向のソフトウェア開発だけに関係するものではありません。

チームプロジェクトでは、適切な責任を分担することが、実装を成功させるための鍵です。オブジェクト指向のデザインパターンを上手に使用すると、分析、データフィード、およびビジネスロジックに必要な表示可能なインターフェイスを制限して、使用可能なフレームワークを共有することで、チームの理解が促進されます。


0

「まあ、実践するために、製品を追加できる管理領域を持つアプリケーションを1つ作成してみましょう」これは非常に簡単でした。ユーザーを登録し、ユーザーをログインし、製品を追加するアルゴリズムを考える必要がありました。

今回はユーザーオブジェクトと製品オブジェクトで同じことをしてみませんか?また、手続き型とオブジェクト指向の両方をサポートする言語を使用している場合は、ファイルオブジェクトなど、手続き型標準ライブラリに基づいてオブジェクトを実装することもできます。

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