web-dev-qa-db-ja.com

このレガシーにアプローチする方法Javaプロジェクト?

編集:私は「終わり」までこのプロジェクトに留まると仮定します。

問題

私は現在取り組んでいます 遺産おもしろい Java project(s)。私が作業しているため、完全な書き換えは現在のところ問題外ですalone、および現在の望ましい機能は数か月前(プロジェクトに入る前)でした。

かなり大きく、次のものが含まれます。

  1. JDK 1.5
  2. 本質的に0%のテストカバレッジ
  3. 7個別Java very循環ビルドを含むプロジェクト
  4. AntとMaven(Gradleにアップグレードしたい)
  5. A Java Webstart GUIアプリ
  6. Drools 5.5(ほとんどすべての重要な機能を管理します)
  7. 3つのApache Tomcatサーバー(2006年に最後に更新されたApache Axisを実行)
  8. そして他の多くの非推奨のライブラリ...

新しい開発環境で正しくコンパイルして実行し、JDKを1.5からアップグレードして、可能な場合は1.6/1.7/1.8の使用を開始しました。 Droolsも5.6に更新しました。私は、プロジェクトを非推奨の環境で実行している間に、変更を加えて、それをいくぶん正常な方法で検証することができるところまでたどり着きました。ただし、大きなチャンクが他のプロジェクトにコピーアンドペーストされ、それ以降は異なる方法で維持されているコードの領域が多数あります。 「主な流れ」以外では、私は何が何をしているのかほとんどわかりません。

@!#$って何?入った?

欲しいもの、これは理にかなった方法でリファクタリングすることですが、あまり長くはかかりません。すべてのタイプをリッピングして、その機能によって別の「SharedJunk」プロジェクトに循環させることを考えていましたか?

しかし、私が必要とするものは、新しい機能を取得することであり、昨日求められました。

このプロジェクトをこの維持不可能な死の状態に導いたのと同じ品質の仕事をさらに追い出すことに顔をたたくだけですか?または私はリファクタリングしますか?実行するクリーニングの量は無限です。

私の上司は非常に忍耐強く、これを「正しい方法で行う」ことを望んでいますが、彼は会社の他の領域からのプレッシャーと戦っていて、彼は永遠に頑張らないかもしれません。

オプション

  1. 永遠にリファクタリング
  2. 必要最小限のリファクタリング
  3. 新しいコードを叩くように私の顔を叩きます
  4. 泣く

この種のプロジェクトで何をすべきかについての一般的なアドバイスは大歓迎です。私は現在、レガシーコードの効果的な使用とパターンへのリファクタリングを読み直しています。これは明確にできますが、何を追加すればよいかわかりません。

ありがとうございました。

5
Nathan

要件がないので、要件は基本的に次のようになります。特に指示がない限り、古いことを行うようにします。私はこれをうまく処理する一つの方法しか知りません。

このシステムの使用に関連する限り、できるだけ多くのデータを作成/取得/検索する必要があります。つまり、大量の入力データが必要です。この戦略ではボリュームが重要です。既存のコードを通じて手に入れることができるすべての入力データを実行します。入力を結果の出力に関連付けることができる方法で編成されたすべての出力をキャプチャします。

システムによっては、これは簡単な場合もあれば、難しい場合もあります。ステートレスシステム(状態を変更しない)の場合、通常は非常に簡単です。それ以外の場合、更新状態は出力であり、それもキャプチャする必要があります。

次に、まったく同じ入力(データベースの状態が含まれる)を取得し、それを新しいバージョンで実行し、古いバージョンと同じ方法でキャプチャします。すべての新しい出力を対応する古い出力と(スクリプトを使用して)比較するタイムスタンプやUUIDなどの特定のフィールドを無視または合理化する必要がある場合があります。見つかった変更はすべて、新しい要件によるものです。それ以外は、回帰エラーか、意図せずにバグを修正した「ハッピーアクシデント」です。結果のレビューに時間をかけることができるため、これらは保持する価値がないかもしれません。ここで重要なのは、正確に一致するテストの量を最大化し、目で評価する必要のあるものの数を最小化することです。不一致の検証を自動化できれば、それは大きな勝利です。

これは決して防弾ではありません。それはあなたがそれに押し込む入力と同じくらい良いだけです。シナリオを見逃した場合は、すべてが一致する結果がクリーンになり、引き続き回帰の問題が発生する可能性があります。シナリオが何であるかわからないので(コードが手がかりになるかもしれません)、できることは多くありませんが、さまざまな入力をたくさん取得しようとします。何かが抜け落ちても、絶望しないでください。見逃したシナリオをテストするデータを見つけて繰り返します。私はこのアプローチを何度も使用し、優れた結果を得ました。多くの場合、これにより、標準のテスト方法よりも多くの問題が明らかになります。

3
JimmyJames

リファクタリングしないでください。

「正しい方法で行ってください」はお尻を覆うだけで、あなたのものではありません!

  • 明確な要件を取得し、最小限のコード変更でそれらを実装します。

  • アプリが機能し、要件が満たされていることを確認します。

4
Ewan