web-dev-qa-db-ja.com

オブジェクト指向設計で何をしなければならないかを実際に見つける方法は?

最初の免責事項:この質問がこのWebサイトに当てはまるかどうかは本当にわかりませんが、私だけでなく、初心者である他の人にとっても関連する質問です。ここに収まるように質問を改善できる場合は、intコメントを指摘してください。それが合わない場合は、私にも知らせてください。これに適したフォーラムが見つからなかったため、可能であればどこで議論できるかを教えてください。

PHPを勉強した2009年にプログラミングの方法を学びました。 2012年の後半に、C#と.NETに移行しました。とにかく、コーディングは問題ではなく、アルゴリズムを書き留めることは私の問題ではありません。私の実際の問題は、要件を達成するためにwhatをコーディングする必要があることとwhereをコーディングする必要があることを知ることです。

Webで利用可能なほとんどのコースは、how-特定の言語でコードを記述する方法、APIの一部のセットを使用する方法などに取り組んでいます。それは、ここでのポイントではありません。

ここ数年、オブジェクト指向の分析と設計、設計パターン、ドメイン主導の設計など、多くのことについて多くを読みました。たとえば、SOLIDの原理、ドメインエキスパートの関与の必要性、ユビキタス言語の開発など、DDDの主要なアイデアの一部を理解しています。あえて言うと、 理論的少なくとも妥当な背景。

しかし、練習に関しては、私は災害のように感じます。少し前に、誰かがすでに開発していた金融システムの開発を継続する必要がありました。それは、C#とWinFormsで開発されたそのような「古いシステム」です。実際にドメインが複雑で、多くのビジネスルールなどがあるプロジェクトを選んだのはこれが初めてでした。

私は、ほとんどの場合、要件を受け取ったとき、「これは一体どのようにしてできるのか」と思います。 -何をすべきかを理解するための要件に取り組み始める方法すら私にはわかりません。私が信じている私の主な混乱は、私がコーディングしなければならないこと、どのクラス、インターフェイス、および各ロジックがどこに行くのか、各クラスはどのクラスでなければならないのかです。問題は、どこから始めればよいかわからないことです。

ほとんどの場合、かなりの考えで結局いくつかのアイデアが出てきますが、自分のアイデアが正しいかどうかを判断する方法はわかりません。

ソフトウェアアーキテクチャとオブジェクト指向に関するたくさんのことを読んだことをお伝えしたので、これは理論の欠如だとは思いませんが、推奨されましたが、実際に何をしなければならないかを特定するのにはあまり役に立ちませんでした。 。

では、どうすればreallydoオブジェクト指向の設計を学ぶことができますか?私が学びたいことは、与えられた要件は、何をしなければならないか、そして各コードがどこに属しているかを見つけることにつながるプロセスでそれらに取り組み始める方法を知っていることです。自分のアイデアが正しいかどうかを判断する方法も教えてください。

これをここでの答えとして完全に説明することは不可能だと思います。しかし、私が探しているのは、サイトのスタイルに応じたものかもしれませんが、概要を示し、いくつかの参考文献(本、オンラインコースなど)を指し示すだけで、アイデアを拡張して実際にこれらを学ぶことができます。

12
user1620696

では、どうすればオブジェクト指向の設計を実際に行うことができるでしょうか?私が学びたいことは、与えられた要件は、何をしなければならないか、そして各コードがどこに属しているかを見つけることにつながるプロセスでそれらに取り組み始める方法を知っていることです。自分のアイデアが正しいかどうかを判断する方法も教えてください。

まず第一に、オブジェクト指向の設計を正しいと考えるのをやめます。それは英語を正しいと考えるようなものです。

オブジェクト指向のパラダイムは正しくありません。これには特定の利点と欠点があります。理想です。それだけではありません。何もないよりはましですが、すべてではありません。

私は何十年もコーディングをしてきました。アイデアが存在する限り、私はこのようなものを研究してきました。私はまだそれが何を意味するかを学んでいます。専門家はまだそれが何を意味するかを学んでいます。私たちの分野全体は100年も経っていません。

ですから、山積みの要件を取り、それらを満足させるコードを作成するとき、あなたが書いたコードはあなただけではない悲劇的な混乱のように感じます。実用的なコードは、優れたコードへの最初のステップにすぎません。機能するだけでなく、他の人が簡単に読んで理解できるコード。要件が変更されたときにすばやく適応できるコード。座って「うわー、それはとても簡単だ」と言いたくなるコード。

問題は、そのすべてを行うために給与が支払われていないことです。私たちが専門家だからです。常に締め切りがあるので、上司が見ていなくても、すべてのことをしなければなりません。しかし、私たちは5年後に戻って、初心者に「ええ、私はそれを書きました。それでも動作しますか?クールです」と言いたいです。

どうやってそこに行くのですか?練習。信仰に関するいかなるデザインのアイデアも受け入れないでください。イベント駆動型の設計がこの設計をどのように簡素化するかについて誰かが黙っていませんか?彼らが正しいかどうかわからない?オブザーバーパターンを使用して、自宅で独自のおもちゃプロジェクトを構築します。それを台無しに。それが役に立たないものを見つけるようにしてください。

読んだ。質問。テスト。繰り返す。

あなたがあなたの人生の80%のためにそれをしているポイントに達するとき、あなたは私と同じように混乱するでしょう。

私は、ほとんどの場合、要件を受け取ったとき、「これは一体どのようにしてできるのか」と思います。 -何をすべきかを理解するための要件に取り組み始める方法すら私にはわかりません。私が信じている私の主な混乱は、私がコーディングしなければならないこと、どのクラス、インターフェイス、および各ロジックがどこに行くのか、各クラスはどのクラスでなければならないのかです。問題は、どこから始めればよいかわからないことです。

私は同じように感じていました。その後、リファクタリングの喜びを発見しました。コードを書くときにデザインを適応させてください。事前にすべてを紙に書き出そうとするのは難しい方法です。間違っていると証明できるコードを書き、間違っていることを証明し、修正します。

21
candied_orange

ソフトウェア開発は、すべての受け入れ基準を満たしながら、予定どおり、予算どおりに稼働するソフトウェアを提供することを意味します。あなたがそれをなんとか成し遂げたと仮定すると、コードの知覚された品質またはその構造は二次的な関心事です。

もちろん問題は、新しいグリーンフィールドコードを書くことは、レガシーコードを維持するよりもはるかに安価で簡単なことです。そのため、コードの品質やアーキテクチャーにこだわるのではなく、本当の問題が保守性であることを忘れないでください。

通常、コードの変更に関連するコスト、時間、およびリスクが、バグの修正や要件への変更の実装が依然として費用効果が高いほど十分に低く、それらの変更を実装することによって「死のスパイラル」が永続しない場合、コードは保守可能であると見なされます。 "コードエントロピーの。

逆に、コードはnmaintainableと見なされます。何かを壊したり、過度の時間/お金を費やして何も壊されないという重大なリスクがないと、自信を持って変更またはリファクタリングできないときです。つまり、時間、コスト、リスクそのコードでの作業に関与することは、変更を加えることの利点と比較して非常に高いです(つまり、雇用主または顧客は、新機能の追加、バグの修正などでお金を失うことはありません)。

最も破壊的なスパゲッティの混乱でさえ、潜在的にmaintainableであり、混乱を回避するための十分な準備がある場合(そのようなケースはまれですが)に注意してください。スパゲッティの混乱の問題は、特に変更を遡及的に行う場合、破壊的な変更から保護することは非常に高価で非効率になる傾向があることです。

おそらく、保守可能なコードを確実に作成するための最も信頼できる方法は、(合理的に可能な場合)十分な自動テストのスイートを同時に(同時に、利用可能な他の静的分析ツールを最大限に活用しながら)行うことです。

十分な自動テストを行ってリファクタリングできるようにするために、TDD/BDDなどの厳密な開発方法論に特に従う必要はありません。将来の偶発的な変更からコードを保護するために必要なのは十分だけです。

コードが自動化されたテストでカバーされている場合、それらのテストでカバーされていることを知っていれば、コードの設計と構造についてリラックスできます。後日、積極的にリファクタリングすることも、破棄してやり直すこともできます。

これは、簡単にテストできるコードをどのように書くかという疑問を引き起こします。これは通常、次のSOLID原則の主な引数です。実際、SOLID原則に準拠しているコードの特徴は、その簡単で時間/費用効果が高いことです。ユニットテストを書く。

もちろん、単体テストを作成する時間がない場合もあります。ただし、質問を念頭に置いてすべてのコードを記述した場合"自動テストを作成するにはどうすればよいですか?"(実際にこれらのテストを実装していなくても)、おそらくまた、合理的に保守可能な設計を見つけることに成功しました。

1
Ben Cottrell