可能性のある複製:
BIGが答えを書き換えるのはいつですか?
私は小さなチームで、下手に書かれた、半分完成した2D Javaゲームを手に入れました。私たちの目標は、約11週間でできる限り改善することです。私はコードが保守可能ではないと確信しているので、書き換えのアイデアを提案する必要があるかどうかを判断する必要があります(とにかく書き換えの近く)。
たとえば、アプレットであるMainクラスには、ほとんどのゲームロジックが組み込まれています。キーボードとマウスのイベントは巨大なif/elseブロックで処理され、コメント化されず(コメント化されているのはコードのセクションのみです)、描画とアニメーションのコードはすべて1つの巨大な塊になっています。画像は、各ファイルを1行に1つずつ処理する個別のクラスに読み込まれ、静的なImage変数に読み込まれます。これはすべてデザインが悪いようです。
学期の終わり、およそ11週間までは、現在よりもゲームを改善する必要があります。それは再生可能ですが、スポットでひどく壊れています。現在、実装する小さな機能が割り当てられています。キーボードのみで制御できるものではなく、クリック可能なメインメニューです。一方で私はこれを実装できることを知っていますが、もう1つは新しい機能を追加しようとすることを恐れています。なぜなら、a)追加する要素が多いほど、設計の選択が悪いためにプログラムが壊れる可能性が高くなります。 b)すでにそこにある混乱にさらに追加します。
私は週末に、基本的なゲーム機能を別のデザインで再現しようとしました(十分に迅速に実行できるかどうかを確認するため)。スプライトを読み込んでキャッシュし、ゲームエンティティを作成して移動し、ゲームの状態を追跡して、処理するキーボード入力と画面に何を描画するかを決定できます。リストの次はスプライトシートローダーです(ゲームアートはスプライトシートではなく、それぞれが別のファイルにあることがわかりました)。信頼できる友人は、古いコードを維持する必要がある方が良いかもしれないと言いましたが、それを見るとあまりにも脆いです。進行中にリファクタリングすることもできますが、それも難しいと思います。
私たちのグループは今週の金曜日に会います。オーバーホールのアイデアについて話し合い、自分が取り組んでいることを提示するつもりでしたが、今はよくわかりません。シンプルで十分な2D Javaのゲームだと思います。ベースをまとめると、機能を追加するのがはるかに簡単になりますが、ベースコードをすばやくデザインし直す必要があります。 、たぶん2週間から4週間くらいです。そんなに早くできると思いたいのですが、よくわかりません。
私の質問をこれまでに減らすことができると思います:不十分に設計されたコードを維持する時期と、ほぼ完全にゼロから開始する時間を費やす時期をどのように決定するのが最善ですか?
既存のソースコードをリファクタリングします。 私はそれを知っていますsucksしかし、私が開発で学んだ教訓があれば、あなたはただ捨てるのではないということですコードがひどいので作業中のプロジェクト。
ゲームは動作しています。 そのままにします
キーボードイベントが巨大なifブロックで処理されていますか?それをクラスにスピンオフし、機能をメソッドに分離します。 すでに記述されているほとんどのコードを再利用できます。
コメントはありませんか?コードベースの特定の領域をリファクタリングするときにそれらを追加します。
ゲームはスプライトシートを使用していませんか?マネージャーがいないのですか?既存のスプライトをシートに連結し、既存のスプライトロードソリューションに組み込むようにマネージャーを記述します。
描画とアニメーションはすべてゲームロジックと混在していますか?ここでも、これらのチャンクをそれぞれのクラスに移動します。
あなたは私のポイントを得ます。コードベースを解きほぐす必要があることほど悪いことはありません。 5週間を費やして、すでに行われていることを書き直す代わりに、新しい機能をつぶして磨き、追加するのに5週間余分にかかります。
チームと一緒に座って、機能に関してこのプロジェクトで達成する必要があることを詳しく説明します。包括的なリストを作成したら、プロジェクトの成功に直接役立つ意図的なリファクタリングの作成を開始できます。
あなたが説明している状況は、いわゆるlegacy-codeに関して業界のあらゆる場所で遭遇する状況と同じです。ゼロから始めるべきではない理由を理解するには、Joelによるこの素晴らしい記事を読むことをお勧めします。
http://www.joelonsoftware.com/articles/fog0000000069.html
さらに、私は Feathersの本「レガシーコードを効果的に使用する」 のコピーを入手することをお勧めします。
最初から書いてはいけません。必然的に、書き換えで見落としがちなロジックが存在することになるため、コードを深くて汚いものにする練習は価値があります。役立つリファクタリングツールを見つけてください。私はそれがJavaであることを知っていますが、たとえば、Visual Studioには関数を非常に簡単に抽出できるリファクタリングツールがあります。多分あなたはEclipseとそのツールを試すか、プラグインを見つけることができます。
機能的に関連していると思われる大きなブロックを抽出することから始めます。クラスに分離できるロジックを特定できます。依存関係を見つけてパラメーター化します(変数を非グローバル化するなど)。最終的には、まず既存のコードを中心に、より良い構造を確立してみてください。
OO完璧という素晴らしい例に終わらないかもしれませんが、それは目標ではありません。Fuseを使用せずに機能を追加できるように、プロジェクトに保守性を追加することが目標です。
設計が不十分なコードを保守する時期と、ほぼ完全にゼロから開始するために時間を費やす時期をどのように判断すればよいでしょうか。
最も単純な変更が巨大なタスクに変わるとき*の場合は、リファクタリングを開始することをお勧めします。しかし、古いコードを捨てないでください(それについて Joelがしてはいけない10のこと)を読んでください 。
* コードはテスト済みで、バグはないと想定しました。新しいバグが発生した場合、タスクは完了していません。
コードに対してクローン検出器を実行することをお勧めします。これにより、抽象化できる重複コードがどこにあるかを見つけることができ、便利な抽象化(マウスイベントの処理など)を行うことができます。
私たちの CloneDR ツールは、モジュロパラメーターに一致するコードのブロックを見つけます。それは本質的にサブルーチンを提案します(OK、これはJavaであり、それらはメソッドと呼ばれます)。複製されたコードとそれをパラメーター化する方法を示します。