web-dev-qa-db-ja.com

良い学習OOPデザインといくつかの悪い習慣の学習解除

重複の可能性:
実践的に学ぶためにどんな本やリソースをお勧めしますかOO設計と開発の概念?

私はこれまでのところ、C++の知識を持って、これまでほとんどCプログラマーでした。私は主にSTLが提供する利便性のためにC++に依存しており、優れた設計手法に焦点を当てることはほとんどありません。私が新しい仕事のポジションを探し始めたとき、私のこの悪い習慣は私を悩ませるために戻ってきました。インタビュー中に、私はOOPを使用して問題(チェスやその他のシナリオなど)を設計するように求められましたが、それは本当にひどいことでした(あるインタビューからのフィードバックを通じてこれを知るようになりました) )。

私はグーグルのものを試してみて、どこから始めればいいのかわからないほどたくさんの意見や関連する本を思いついた。 OOP理論だけでなく、実用的なデザインを学ぶことができるデザインの紹介を通して、良いものが必要です。

私の要件を満たす本を教えてもらえますか?私はC++が好きですが、良い習慣を身につけることができれば、他のどの言語でも構いません。

また、本はこれまでしか行けないことも知っています。また、OOPの概念を学び、改善するのに役立つ、優れた実践プロジェクトのアイデアをいただければ幸いです。

1
TinkerTanner

トレーニングについては、 http://www.cleancoders.com/ にアクセスして、それらを確認することをお勧めします。彼らは非常に重要なアイデアをカバーしています。

ビデオを見終わったら、Head First Design Patternsを見てください。これで、いくつかの問題と解決策がわかります。

具体的なプロジェクトの提案はありませんが、Javaなどのオブジェクト指向言語でプロジェクトを試すことをお勧めします。 C++を使用すると、ごまかしが簡単になりすぎます。

4
Ben

(IMO)ソフトウェア設計に関する素晴らしい本はありません。パターンブックの多く(私は オリジナル が好きですが、他のいくつかについては良いことを聞いています)は、用語を理解して概念を固めるのにかなり良いですが、いくつかの練習の後にのみ使用する必要があります。最初に練習をしなければ、プログラマーは設計パターンを過剰に適用したり、パターンが防止する問題を誤解する傾向があります。

練習問題に関しては、あなたが最初にやったことをお勧めします。次に、ドメインとそれが何をすべきかを理解し、設計のみに集中できます。ほとんどの場合、繰り返す必要があります。プログラムを設計して実装し、どのように機能するかを確認します(機能しません)。新しい問題について学んだ教訓を生かして新しいデザインを作り、繰り返します。

プログラムの設計は、最終的に科学よりも技術的なものになるものの1つです。それを維持し、あなたは徐々に良くなるでしょう。

3
Telastyn

Ben の答えで言及されている「HeadFirstDesignPatterns」の本は素晴らしいです。オリジナルの「GangofFour」デザインパターンブックのアイデアを実際に実現します。

Telastyn が答えで述べているように、ドメインを理解することは重要であり、これは実際にオブジェクトモデルに通知するのに役立ちます。このために、私は本当にエリックエバンスの ドメイン駆動設計 をお勧めします。また、OOに関する本の優れた参考文献もあります。

最後に、テストへのアプローチは、ソフトウェアの設計方法と、使用するOOパターン)を通知します。

コンストラクターで依存関係の1つを作成するいくつかのレガシーコードの単体テストを作成する必要があるまで、実際にファクトリーパターンを「取得」しませんでした。

これにより、テストが非常に困難になり、コードをリファクタリングして、テストの実行時にモックオブジェクトを返すように設定できるFactoryによって作成された依存関係を作成するようになりました。

2
worldofchris

この主題に関するすばらしい本は、 オブジェクト指向設計ヒューリスティックス です。この本には、言語に依存しない60を超えるヒューリスティックが含まれています。理論に加えて、この本にはC++の例の122ページの付録があります。この本はあまりお勧めできませんが、素晴らしい入門書です。

読み方は少し難しいですが、 MLとパターンの適用 も素晴らしい入門です。この本は巨大ですぐには読めませんが、2つのケーススタディを使用して資料を紹介しています(独占ゲームとPOSシステム)。

これらの2冊の本(および リファクタリング )は、私のプログラミングキャリアにおける最も大きな影響の3つです。あなたは失望することはありません。

2
Phil Patterson

ボブおじさんの アジャイルの原則、パターン、実践 はあなたにとって本当に良い本だと思います。この本は多くの例でC#を使用していますが、それらの例は製品のC#ではなく疑似コードと考えてください。本が教えるすべては、ほぼすべてのOO言語に簡単に適用でき、資料のレベルはおそらくあなたにぴったりです。

あなたが新しくて学習している間、私は「デザインパターン」の本から離れることを強く勧めます。あまりにも多くの人がそれらを拾い、いくつかのパターンを学び、あちこちでそれらを叩き始めます。ボブおじさんが上記の本で指摘しているように、最初に特定のパターンを構築するという目標から始めるのではなく、1つが発展しているのを見たときにパターンにコード化する必要があります。ただし、パターンにつながる設計上の決定を行う前に、OOPセンスが必要です。

本以外の資料に関しては、私はSOLID、KISSおよびDRYの原則を学ぶと言います。そして、私が「学ぶ」と言うとき、私はしません」つまり、それらについて読んで理解していると思うということです。つまり、コーディングするときは、生きてそれらの原則を呼吸します。別の関数や変数を追加するたびに、次のことを自問してください。

  • 既存のコードを複製していますか?
  • 私の関数/クラスはあまりにも多くのことをしていますか?
  • 私が書いたばかりのことをもっと簡単にできますか?
  • ....

@worldofchrisが言及したように(その答えの+1)、OOを学習している間にTDDを学習することもお勧めします。この2つは密接に連携して適切に設計されたコードであり、簡単にテストできます。逆に、コードがすでにテスト可能である場合、単体テストの対象範囲がないコードに比べて品質が高くなる傾向があります。

1
DXM
  • クリーンコード

  • 実用的なプログラマ

  • レガシーコードの操作

本の大部分はあなたを幸せに感じさせるでしょう。それはあなたに仕事を与えません。

Pragmatic Programmerのいくつかの章を読むことから始めて、次にCleanCodeに進みます。本を読んでリファクタリングを開始しながら、古いコードを確認してください。

本を読んでも経験は得られませんが、コードを「クリーン」にすることはできます。コードの品質に関していつ線を引くかを決めるのはあなた次第です。

私がこれらの本を推薦する理由は、それらを書いた人が何十年もこの業界で働いていて、何がうまくいくか、何がうまくいかないかについて非常に良い考えを持っているからです。

1
CodeART