どうすればより良いオブジェクト指向プログラミングを実践できますか?[閉まっている]


84

私は何年もの間オブジェクト指向言語でプログラミングを行ってきましたが、同僚が羨望の的にしていることのいくつかを密かに見ています。それらの多くは、私がどんなに一生懸命努力しても、私が持っていないいくつかの内部OO本能を持っているようです。私はOOに関するすべての良い本を読みましたが、それでもそれを解読することはできないようです。私はプロのサッカー選手になるために110%を与えたが、それを作るための自然な才能を持っていなかった人のように感じます。私は途方に暮れていて、転職を考えています-どうすればいいですか?


1
多分私は悪いものを読むべきです。
Supertux 2009

3
どの言語で開発していますか?「良い」本のタイトルをいくつか挙げていただけますか?
アキム

8
あなたがとても心配しているこのコードのいくつかを見てみましょう。私はあなたに私が10倍悪い何かを見つけることができるに違いない。
Spencer Ruport 2009

4
良いコードが何をするのか理解するまで100回見て、それを自分で試してみてください
BlackTigerX 2009

3
私はオブジェクト指向プログラミングの大ファンですが、ソフトウェア業界で作業して滞在できる他の言語/テクノロジーがあることを強調しておきます。OOスキル!= OOがどれほど普及したとしても、プログラミングスキル。私は...他の人が同意するだろう願っています
Grundlefleck

回答:


131

私は、オブジェクト指向プログラミングに焦点を当てるのではなく、オブジェクト指向設計に焦点を当てると言います。紙と鉛筆(またはUMLモデリングツール)を手に取り、画面から離れます。

システムの設計方法を練習することで、オブジェクトの関係を自然に感じるようになります。コードは設計の副産物にすぎません。ダイアグラムを描画し、アプリケーションを純粋に非コード形式でモデル化します。関係は何ですか?モデルはどのように相互作用しますか?コードについても考えないでください。

設計に時間を費やしたら...それをコードに変換します。優れたオブジェクト指向設計からコードをどれだけ迅速に記述できるかに驚かれることでしょう。

多くの設計を実践した後、モジュール化または抽象化できる共通の領域が見られるようになり、設計とコードの両方に改善が見られます。


2
私はあなたの考えに感謝します..!
Basheer Kharoti 2017年

ペンと紙で行う方がモニターよりもうまくいくことに同意します!
Aerin 2018

次に、次の質問はおそらく「オブジェクト指向設計をどのように実践できますか?!?」です。OOは、プログラミングを使用して実際の目標を達成する最初の経験であってはならないと思います。ちょうど私の2セント。
aderchox

38

最も簡単な方法は、SOLID、DRY、FIT、DDD、TDD、MVCなどの概念を学ぶことです。これらの頭字語を調べると、他の多くのうさぎの穴にたどり着きます。より優れたオブジェクト指向プログラミングとは何かをよく理解してください。

SOLIDポッドキャスト:http//www.hanselminutes.com/default.aspx? showID = 168 、http//www.hanselminutes.com/default.aspx? showID = 163

固体の内訳:http//butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

乾燥:http//en.wikipedia.org/wiki/Don%27t_repeat_yourself

FIT:http//www.netwellness.org/question.cfm/38221.htm

DDD:http//dddcommunity.org/

DDDの必読:http//www.infoq.com/minibooks/domain-driven-design-quickly

TDD:http//en.wikipedia.org/wiki/Test-driven_development

MVC:http//en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

そして、はい、袖をまくり上げてコーディングすることは常に良い考えです。現在の能力を最大限に活用して小さなプロジェクトを作成します。次に、上から記事を読んでください。次に、今読んだもののニーズを満たすようにコードをリファクタリングします。コードから地獄をリファクタリングするまで繰り返します。最後に、OOが何であるかを知るだけでなく、OOが重要である理由と、OOを初めて取得する方法を説明できる必要があります。リファクタリングの方法を学ぶことも、優れたコードの鍵です。今のことは明日は正しくありません。


ただし、これらの頭字語のすべてが必ずしもオブジェクト指向設計と関係があるわけではありません。(つまり、DRYの原則は、どのタイプのプログラミング言語でも引き続き重要です)
wds

同意する。しかし、それらは適切なオブジェクト指向プログラミングにも適用されます。
Andrew Siemer

18

コーディングを最初に、オブジェクトを、最後に考える人が多すぎます。

あなたはあなたが望むすべての本を読むことができますが、それはオブジェクト指向の方法で考える方法をあなたに教えるつもりはありません-それは練習と特定の方法論を必要とします。

  1. これが私を助けてくれたいくつかの方法です:あなたが仕事から離れていてオープンマインドであるとき、あなたはすべてをオブジェクトとして見ることによって練習することができ ます。これらのオブジェクトを見て、どのようにプログラムするのか、プロパティと関数としてのみ見て、どのように相互に関連または継承するのか疑問に思わないでください。たとえば、人を見ると、それらはオブジェクトであるため、クラスを表します。髪の色、肌の色、高さなどの特性があります。特定の機能も果たします。彼らは歩いたり、話したり、寝たりします。これらの人々が行う機能のいくつかは結果を返します。たとえば、それらの仕事関数は金額を返します。すべてがオブジェクトであるため、表示されるすべてのものでこれを行うことができます。自転車、車、星など。

  2. プロジェクトをコーディングする前に、付箋紙とホワイトボードを使用してプロジェクトを設計します。これは、コツをつかむまでは良い習慣になります。あなたの特定のオブジェクト/機能/プロパティについて考えてください。これらの各アイテムには、独自の付箋があります。それらをホワイトボード上の階層として配置します。この点で、関数/プロパティはオブジェクトの下に配置されます。別のオブジェクトがある場合は、そのオブジェクトについても同じようにします。次に、自分自身に問いかけ、これらの付箋(オブジェクト/関数/プロパティ)のいずれかが互いに関連していることを確認します。2つのオブジェクトが同じ関数を使用する場合は、親オブジェクト(ポストイットノート)を作成し、新しいノートの下にある再利用可能な関数を使用して、他のオブジェクトの上に配置します。2つの子オブジェクトから親まで、ホワイトボードマーカーを使用して線を引きます。

  3. これがすべて完了したら、クラスの動作の内部について心配します。


15

私の提案は、何か違うことを学ぶことです。

関数型プログラミングを学び、そこから学んだことをOOPに適用します。C ++を知っている場合は、ジェネリックプログラミングを試してみてください。

非オブジェクト指向言語を学びます。

これらすべてを使用する必要がある(必要がある)ため、またはOOPを完全に置き換える必要がある(おそらく使用しない)ためだけでなく、これらのレッスンをOOPにも適用できるためです。

OOPの秘訣は、それを使用することが常に意味があるとは限らないということです。すべてがクラスというわけではありません。すべての関係または動作の一部をクラスとしてモデル化する必要はありません。

盲目的にOOPを適用しようとしたり、可能な限り最高のOOPコードを記述しようとしたりすると、抽象化と間接化のレベルが多すぎて柔軟性がほとんどない、過剰に設計された巨大な混乱につながる傾向があります。

良いOOPコードを書こうとしないでください。良いコードを書いてみてください。そして、それがその目標に貢献するときは、OOPを使用してください。


実際、元のKayのOOPは、最新のOOP実装が正常に失敗するリアクティブシステムを構築するという唯一のタスクに適しています。彼らの唯一の仕事ですら!
rostamn739 2016年

12

多くの分野で、あらゆる種類のものが一緒になる「エウレカ」の瞬間があります。

高校の幾何学に不満を感じたことを覚えています。証明の各ステップにどの定理を適用するかわかりませんでした。しかし、私はそれを続けました。私は各定理を詳細に学び、それらがさまざまな例の証明にどのように適用されるかを研究しました。各定理の定義だけでなく、その使い方も理解できたので、使い慣れたテクニックの「道具箱」を作り、必要に応じて引き出すことができました。

プログラミングでも同じだと思います。そのため、アルゴリズム、データ構造、およびデザインパターンが調査および分析されます。本を読んでテクニックの抽象的な定義を得るだけでは十分ではありません。あなたもそれが実際に動いているのを見る必要があります。

ですから、自分でコードを書く練習をすることに加えて、もっとコードを読んでみてください。これはオープンソースの美しさの1つであり、学習するコードをたくさんダウンロードできます。そのコードのすべてが良いわけではありませんが、悪いコードを勉強することは、良いコードを勉強することと同じくらい教育的です。


エウレカの瞬間について同意します。パターンやアーキテクチャについては、Supertuxと同じように感じていましたが、ある日、心が開いたばかりでした。しかし、私はたくさん読まなければなりませんでした。
GR7 2009

10

別の言語を学びましょう!Javaのみを使用するほとんどの開発者(例として)は、言語の機能と概念を分離できないため、OOについての理解が限られています。まだわからない場合は、Pythonをご覧ください。Pythonを知っているなら、Rubyを学んでください。または、関数型言語の1つを選択します。


7

aswerはあなたの質問にあります;)

練習、練習、練習。

自分のコードを確認して、間違いから学びましょう。


1
ここでのニールの答えに沿って、あなたのコードとそのコードの何がそんなに違うのですか?彼らのパターンを<del>盗む</ del>してくれませんか。:-)
フランクV


4

書くコードが多ければ多いほど、特定のプログラミング手法の落とし穴に気付くでしょう。十分な時間と十分なコードがあれば、これらの落とし穴の警告サインを特定し、それらを回避することができます。コードを書くとき、私が必要なことをしていても、これを行うためのより良い方法があるかもしれないと私に告げるこのかゆみを頭の後ろに感じることがあります。私の最大のプログラミングの弱点の1つは、物事を「過剰に分析」しすぎて、開発時間が劇的に遅くなり始めることです。私は、設計にもう少し時間を費やすことでこれらの「かゆみ」を防ごうとしています。これにより、通常、コードの記述にかかる時間が大幅に短縮されます。

...密かに同僚が羨ましいことをしていることをいくつか見ています。それらの多くは、私が持っていないいくつかの内部OO本能を持っているようです-私がどんなに一生懸命努力しても...

あなたはここであなた自身の質問に答えたと思います。良いコードを読むことは良いスタートであり、良いコードを理解することはさらに良いことですが、その良いコードに到達するためのステップを理解することが最善です。羨ましいコードを見つけたら、作成者にどのようにしてその解決策にたどり着いたのかを尋ねることができます。これは、職場環境と同僚との関係に完全に依存しています。いずれにせよ、私が書いたコードの背後にある思考プロセスを誰かが私に尋ねた場合、私は彼らに私のために同じことをしてもらいたいと思っているので、遠慮なく彼らに伝えます。


4

言語設計者は、「オブジェクト指向プログラミング」をさまざまな方法で解釈してきました。たとえば、OOPという用語を最初に使用したAlanKayがどのように定義したかを見てください。

私にとってのOOPとは、メッセージング、ローカルの保持と保護、および状態プロセスの非表示、およびすべてのものの極端な遅延バインディングのみを意味します。SmalltalkとLISPで実行できます。これが可能な他のシステムもあるかもしれませんが、私はそれらを知りません。

http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_enから引用)。

彼がJavaとC ++のOOP言語を考慮していないのは奇妙に思えるかもしれません。しかし、最初で最高のOOP言語の1つ(Smalltalk)の設計者として、彼にはそれに対する彼自身の正当な理由があります。Alan KayがLispをオブジェクト指向言語と見なしたのにJavaとは見なさなかったのはなぜですか?その質問は、OOPを理解していると主張する人は誰でも真剣に検討する必要があります。

Erlangにはまったく異なるOOPの実装があり、Schemeには別の実装があります。これらすべての代替ビューを検討する価値があります。可能であれば、これらすべての言語を学びましょう!それはあなたに広い展望を与え、あなたの手にいくつかの新しくて強力なツールを置き、あなたをより良いプログラマーにするでしょう。

この記事では、Smalltalk、Scheme、Erlangから借りたアイデアに基づいて、OOP言語を実装した実験を要約しました。


4
       public void MasteryOfOOP() 
    { 
       while(true)

        /* My suggestion is: */
     DO: find a lot of well-written object oriented code and read it.  Then 
try to use the insights from it on your own coding.  Then do it again.  Then 
have a colleague who is a good OOP look at it and comment. Maybe post a chunk 
of your code on SO and ask for how it could be improved.

        Then read some more of those books.  Maybe they make a little more 
sense now...?

        Now go back to the top of this post, and do it again. 

        Repeat Forever.

        }
    }

3

オブジェクト指向システムの設計方法に迷った場合は、データから始めてください。追跡する必要のあるものと、自然に連携する情報を把握します(たとえば、自動車グループのモデルのすべての仕様をうまくまとめます)。

あなたが追跡することに決めたこれらの種類のもののそれぞれがクラスになります。

次に、特定のアクションを実行できるようにする必要がある場合(たとえば、車のモデルを廃止済みとしてマークする)、または特定の質問をする(たとえば、特定の年に特定のモデルの車がいくつ販売されたかを尋ねる)必要がある場合は、ロードします。その機能は、最も頻繁に相互作用するクラスに組み込まれます。

一般に、特定のコードがクラス構造内に存在するためには、常にかなり自然な場所が必要です。ない場合は、構造を構築する必要がある場所があることを示しています。


3

オブジェクトに関する情報が多すぎます。最も重要なことは、基本をマスターすることであり、すべてがより簡単に所定の位置に収まります。

オブジェクトについて考える方法は次のとおりです。手続き型言語のデータ構造について考えてください。それらは、動作のないフィールドのグループです。それらのデータ構造へのポインターを受け取り、後者を操作する関数について考えてください。ここで、それらを分離する代わりに、構造の定義内で関数を定義し、関数が通常、操作するデータ構造へのポインターを受け取ると想定します。そのポインタはこれと呼ばれます。要約すると、オブジェクトをステータス(データ)と動作(メソッド-OOPの関数の仮の名前)の組み合わせと考えてください。

これは絶対的な基本です。絶対に習得しなければならない概念がさらに3つあります。

継承-これはすべてコードの再利用に関するものです。

カプセル化-これはすべて、インターフェースから実装を隠すことです。簡単に言えば、他の方法で証明されるまで、すべてがプライベートである必要があります。

ポリモーフィズム-参照変数のタイプは重要ではありませんが、どの動作(メソッド)が呼び出されるかを知るための実際のインスタンスのタイプは重要です。定義上、すべてがポリモーフィックであるため、Javaではこの概念を簡単に表示することはできません。.Netを使用すると、多態性とそうでないものを決定するときに理解しやすくなり、動作の違いに気付くことができます。これは、仮想とオーバーライドの組み合わせによって実現されます。

これらの概念が非常によく理解されていれば、問題はありません。

最後の最後のヒント:あなたは最高の本に言及します。ブルース・エッケルの「Thinking inJava」を読んだことがありますか?OOPの概念が明確に示されているので、.Netを始めたばかりの人にもこの本をお勧めします。



2

OOPスキルは時間とともにやって来ます。1、2 ... 10冊の本を読んでもそれはうまくいきません。いくつかのコードを書く練習をしてください。あなたがプログラミング環境で働いているなら...それは役に立つかもしれません。そうでない場合は、1つに入ってみてください。いくつかのアプリケーションを無料で開発することを申し出てください。あなたは手を汚さなければなりません。覚えておいてください...ゼロから完璧なアプリケーションはありません。そのため、リファクタリングがあります。

また... OOPに夢中になりすぎないでください...時間の経過とともに多少なります。完全に機能するアプリケーションの開発について心配する。


2

最も純粋なオブジェクト指向言語の1つであるSelfでプログラミングを試してみてください。実際、非常に純粋なので、クラスすらなく、オブジェクトだけがあります。また、変数、フィールド、統計、属性はなく、メソッドのみがあります。また、システム内のすべてのオブジェクトが画面上のオブジェクトでもあり、その逆も同様であるという事実も興味深いです。

Selfに関する興味深い論文のいくつかは、SELF 4.0を使用したプロトタイプベースのアプリケーション構築(Selfチュートリアル)、Self:シンプルさの力、およびクラスなしのプログラムの編成です。また、Self:The Video(Randall B. Smith; Dave Ungar)は素晴らしく、言語のデザイナーの2人がSelfのアイデアを説明しています。

これは、実際には、少なくとも私にとっては、ほとんどすべての概念で機能します。学習したい概念を最も純粋に具体化する言語を見つけて、それを使用するだけです。


2

取引を処理し、利息を計算し、すべてを追跡する銀行のようなプログラムをプログラムしようとした後、OOはついに私のためにクリックしました。私はJavaを学んでいる間にそれをしました。私はそれを試して、それを完了することを提案します、そしてあなたが終わったら、良い解決策を見て、あなたがより良くすることができたものを見てください。


2

また、OOPスキルは主に練習によって強化されると思います。3年以上滞在している場合は、会社を変更することを検討してください。確かに、これはすべての仕事に当てはまるわけではありませんが、多くの場合、男性は会社でのプロジェクトや慣行に慣れ、時間が経つにつれて前進を停止します。


1

袖をまくり上げてコードを書きましょう!


4
彼は何をしていると思いますか?彼は別の方法を探しています。
ludwi 2009

Ludwi:彼は十分な方法にさらされています。彼はそれらを使用する必要があります。
ジョン

2
私はこれらの答えが嫌いです。練習は永続的であり、完璧ではありません。
マーティン

誰かが(彼が持っている)たくさんの本を読んだのにそれでも読めないと言っているのを見ると、彼らは十分に試していません。IDGARAさん、私の答えが気に入らない場合でも、何かを試してみることが私の進歩の大部分を占めており、私を混乱させる別の意見を見つけることはありません。
ジョン

1

あなたは自分で答えを言いました:練習。これに対する最善の解決策は、ゲームを開発することです。そこにある本で学んだ概念を使用してください。


1

ScottMeyersの「EffectiveC ++」本の初版からオブジェクト指向の章を読んだことがありますか?それ以降の版には届きませんでしたが、それは素晴らしい説明でした。タイトルは基本的に、適切な慣習について「あなたが言うことを言う、あなたが言うことを意味する」でした。

実際、ここで同様の質問に対する私の答えを見たいと思うかもしれません

HTH

乾杯、


0

物事を計画します。オブジェクトを相互にどのように関連付けたいかを自問し、物事をどのように変更してモジュール化できるかを探します。

1つのコードを変更したい場合は、その1つのコードを変更するだけで、50のインスタンスを変更する必要がないようにコーディングしてください。


0

OOPは、何千冊もの本を読んで習得できるものではありません。むしろ、あなたは内なる概念を感じなければなりません。何でも読んでください、しかしあなたが読んだものを感じてみてください。心の奥底で概念を構築し、新しいシナリオに直面したときにそれらの概念と一致するようにしてください。新しいことを探求するときに、概念を確認して更新します。

幸運を!


0

ビールが役立ちます。真剣に。A3サイズの落書きパッド、ペン、ビールを置いてソファに横になります。犬、猫、妻を外に閉じ込めてください。そして、リラックスしながら問題について考えてください。あえてAPIを描画しないでください!

フローチャート、責任カード(CRC)、ビール(ただし多すぎない)は大いに役立ちます。

コードをリファクタリングする最も簡単な方法は、そもそもリファクタリングする必要がないことです。


-1

http://misko.hevery.com/code-reviewers-guide/

これらの小さな単純なルールは、より優れたOOプログラマーになります。コードを作成するときは、規則に忠実に従ってください。そうしないと、コードが他の方法よりも優れていることがわかります。

また、Solid Principlesについても学びたいと思うでしょう:http//butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

これらの原則とプログラミングの方法が議論を引き起こすのと同じくらい、それらは本当に優れたコードを書く唯一の方法です。

あなたはすでにこの方法でコードを書いていて、それを知らないかもしれません-もしそうなら、素晴らしいです。しかし、努力する目標が必要な場合、これらはゴールドスタンダードです。


Youtubeが今とても悪いように見える理由を推測しますか?グーグルがそれを台無しにしたので、そしてあなたはこの腸がどこで働くか知っていますか?Googleで。彼らはすべてを台無しにします。しかし、理由を説明すると、この男は「テスト容易性」だけを気にします。プログラマビリティは、これとははるかに異なる概念です。テスト容易性は、カプセル化、特にi OOPを破る必要があるため、プログラムを悪化させます。
luke1985 2013年

-1

あきらめる!なぜそのOOPが必要なのですか?使えるアプリを書いてください。OOP、手続き型または機能的アプローチを使用してメッターを使用しません。

Python言語を選択するWhataverアプローチは、それを実践するのに適しているはずです。


最初のパラの+1。-1秒
nawfal 2012

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