プロジェクトを開始するたびに、重要な瞬間にコアクラスを完全に変更し、あいまいなエラーに巻き込まれることを決定します。私は事前に計画を立てて、通常は良い足から始めますが、別の日にそれを行って、「別の方法」でそれを実行したいと思います。
クラスのマッピングや単体テストの開始など、プロジェクトを開始するときに、標準的なものはありますか?中規模プロジェクトを計画および開始する際の良い慣例は何ですか。
最後に立ち上げられたプロジェクトは、発射体モーションシミュレータでした。
計画を立てるときは、事前にアプリケーションについてあらゆることを計画する必要はありません。ベビーステップで計画します。アプリケーションの使用を開始するために必要な絶対最低限の機能は何ですか?そこから始めましょう。
プロジェクトを開始するときは、最小限の機能のみをコーディングしてください。コード化するときは、スマートカプセル化を使用して良い、クリーンなコードを記述していることを確認してください。これにより、後で変更を加えることによるエラーが最小限に抑えられます。
満足するまで、最低限の機能を繰り返します。次に、新しい機能と拡張機能を1つずつ追加していきます。ここでも、スマートなカプセル化を使用して、優れたクリーンなコードを書くことに焦点を当てます。
ベビーステップで計画し、クリーンなコードを書くと、実際に行う必要がある変更の数が最小限になります。最初の機能を書き終えたときには、アプリケーションの基盤となるパターンを採用しているはずです。その基盤に問題がある場合、次の機能で問題をすぐに明らかにする必要があります。ピースがどのように統合されるかがわかりやすくなります。この時点で行う変更により、混乱が最小限に抑えられます。
あなたの計画は役に立たないようです。実行可能な計画を立てるのに十分な経験がないので、それは当然のことです。解決策は簡単です。そんなに計画を停止します。コードを記述して書き直すことを受け入れるだけです。あなたの時間を除いて、コードは無料ですので、それは問題ありません。 UIアプリケーションを作成している場合は、空白のウィンドウから始めて、完了するまで少しずつ追加します。より多くの経験がある場合、プロジェクトはより速く進みます。あなたがコードを変更しているので心配することは、実際に浪費されているすべてのノートについて心配している音楽の学生のようなものです。
特定の量のコードをコーディングするまで、最適なデザインが何であるかは誰にもわかりません。したがって、優れた設計の秘訣は、最初のドラフトが必然的に次善のものであることを認識し、より小さな部分をより早くより頻繁に書き換えることを計画することです。ほぼ完全なプログラムを破棄する代わりに、行や関数、クラスの欠陥を認識したらすぐに書き直してください。
経験豊富な優れたプログラマは、通常、最初のドラフトでもそれを正しく行いません。経験に伴うものは、悪いデザインをより早く認識する能力と、より迅速に書き直す能力です。
私の経験では、この問題は、いくつかの経験を積むと解消します。機能するものと機能しないものの感覚をつかむことができます。さらに、適切なカプセル化により、設計変更のコストを削減できます。モジュールがよりしっかりとカプセル化されているほど、後で変更するのにかかるコストは低くなります。クラスを分けておくための優れた動機と考えてください。
http://nathanmarz.com/blog/suffering-oriented-programming.html
これはあなたの問題に対処します。彼は、ソフトウェアが可能であることを確認し、プロトタイプを作成して作成することから始めました。それから、彼はコードを取り、それを解体し始めます。次に、彼はそれを最適化します。
アプリケーションの設計には2つの側面があります。 1つ目は、アプリケーションで実行できることを決定することです。 2つ目は、その方法を設計することです。それが行うことへの変更はかなり重要であり、アプリケーションの成熟度(およびアプリケーションの方向のシフト)に応じて、再作業ではなく書き換えとしてアプローチするのが最善です。
二つ目はその方法です。単体テストとアジャイル開発プラクティスを使用して、リファクタリングによって特定の機能がどのように実行されるかを変更する影響を最小限に抑えることができます。これらのテクニックを活用する方法を学ぶことの一部は、練習練習練習です。
何度も何度もアドバイスをしていきます。ペットプロジェクトを選択してください。自分の能力を最大限に活用してください。新しいことを学び、学んだことを応用して、プロジェクトの開発への取り組み方を改善します。
たとえば、Todoリストから始めます。簡単にしてください...最初はデータベースストレージについても気にしないでください。ちょうどそれを働かせる。次に、その基礎の上に構築を開始します。 MVVMとWPFを学びたいと思うかもしれません...メモリ内のToDoリストを実装する方法をすでに知っているので、解決すべき問題が1つ少なくなります。ここで、複数のユーザーがデータベースから自分のToDoリストをロードできるようにする必要があります。あなたは記憶を解き、プレゼンテーションを分離したので、データアクセスの学習に集中できます。そこからアプリケーションを拡張して、より複雑なドメインモデル(Todoリストからプロジェクト管理ソリューションへの変更など)、Webインターフェース、またはモバイルデバイスで実行することもできます。この作業を行うための鍵は、進行状況をマークでき、時間の経過とともに成長できる、自分で達成可能なものを選択することです。
私の経験では、システムの設計には、実際のコーディングと同じかそれ以上の時間がかかることがよくあります。 「事前に計画する」と言ったとき、実際に何を計画しますか?たぶん古い学校に行き、実証済みの設計手法の1つを使用します。または、古い学校に行って、実際のコードを書く前に疑似コードを書いてください。
もともとの計画にこだわるのではなく、どうして重要な瞬間に物事を変えているのか、自問してみてください。元の計画に欠陥がありましたか?それとも、物事を行うためのより良い方法を示した洞察に満ちた瞬間がありましたか?それは実際に良いのか、それともただ違うのですか?
あなたが経験を積むにつれて、あなたはより少ない頻度で書き直し/スクラッチして最初からやり直す必要があります。解決しようとしている問題を書き留めます。必要だと思う漠然としたクラスの説明を書き留め、がどのように対話する必要があるかを書き留めます。すべてがどのように機能するかについて考え、コードを作成します。クラスのすべてのプロパティ、メソッドを書き込むのに膨大な時間を費やさないでください。この段階では、自分が何をすべきかを5万フィートで表示しようとしています。コーディングを開始したら、詳細を書き留める必要がある場合は、それに進んでください。そうでない場合は、コーディングを開始します。
これが難しいと感じる理由は、アイデアはあるものの、何をしたいのか完全にはわからないためです。あなたがあなた自身のプロジェクトをやっていて、あなたが彼らが望んでいることをあなたに言う顧客がいないなら、それはあなた自身の顧客であることはあなた次第です。顧客の立場に立って、不可能なウィッシュリストの作成を開始します。
つまり、開始するときDo n't design ANYTHING !!!です。
システムに実行してほしいことの大きなリストができたら、すべてに優先順位を付け、基本的なシステムを実行するための最低限の機能を決定します。これは、単一の基本的な機能でも、画面全体でもかまいませんが、顧客がテストするのに十分役立つと感じるものである必要があります。
したがって、機能のリスト+基本的な優先順位= 要件です。
これらすべてが揃ったら、非常に高度な設計を行います。座って、最初のいくつかの優先順位を設定して実行するためにシステムが必要とするものについて考えてください。必要に応じて変更してください。ただし、ここで、コードまたはシステム構成をスパイクして、何が可能かについて詳しく知ることができます。設計の基本的なアイデアを検証するのに十分な距離を置いてください。
すなわち:[〜#〜] now [〜#〜]あなたのデザイナーの衝動にふける。
完了したら、機能の実装を開始します。各機能について基本的な機能仕様を作成します。これは、機能ステートメントのコレクションと同じくらい簡単かもしれません。お好みでストーリーカード。これにより、少し頭の中でアイデアを発展させ、specificationになる一連のステートメントを作成できます。実装のテストと構築を行います。
Cry Havoc、犬を滑らせましょう...コード!!
そこから、仕様に一致するようにテストを実装し、各テストについてコードを記述します。ビルドして「リリース」し、プロジェクトが十分に完成したと判断するまで、次の機能を繰り返します。
それは本当に経験に帰着しますが、私が見つけたこのアプローチは、すべてをやりすぎて延々と延期するという無限のサイクルに縛られるのではなく、何をすべきかに心を集中させるのに役立つ簡単な公式です。一度。
プロジェクトの目標を設定し、要件のリストを取得し、外部システムへのインターフェースをロックするなどの基本を完了した後。
次に、ユーザーインタラクションごとにユースケースまたは「ストーリー」を実行する必要があります。ボリュームは「良い」ユースケースやストーリーを作るものについて書かれており、多くのバリエーションがあります。ユースケースは、私が遭遇した最も効果的な設計ツールの1つです。それらは、不必要な機能を排除すると同時に欠けている機能を拾い上げ、本質的なところまでデザインを取り除くのを助けます。私が言ったように方法論は異なりますが、ほとんどの実践者は同意します:-
主要なクラスを指定する準備ができたら:
UML-Universal Modeling Language。クラスを設計するための標準ツールです。各クラスのパブリックメンバーとメソッドを指定し、明確で簡潔なグラフィカルモデルでそれらをリンクします。
シーケンス図、データモデルと組み合わせて、コーディングを行う前に設計を検証および改善できます。
取得したい結果に焦点を移し、新しい実装を学習/試行することで得られる潜在的な利益と、正直に戻る道を行くリスクを比較検討します。
スクエア1に戻った場合でも、経験を積んでもすべてが失われることはありません。
締め切りがある場合(たぶんあなたは楽しみのためにプログラミングしているように聞こえます)、これは本当にトリッキーです。継続的に一方向に進むと、時間が経つにつれて古い方法を使用するリスクがあります。継続的に他の方法を使用すると、遅い速度で出力を生成する結果にリスクが生じます(学習冒険の結果に応じて、速度は可変的に遅くなります)。
私は仕事を一生懸命やって、年々速く物事を成し遂げていました、そしてある日、私は自分のスキルセットで非現在になりつつあることに気付きました。