2009-04-07 11 views
3

コードベース(〜20K LOC)を見直し、1.4.2から5に移行する方法を決定しようとしています。明らかに、これは夜間のプロジェクトではなく、私が受け取った提案は、Java 5に対して新しいコードを書いて、古いコードを断片的な方法で移行することです。また、私はJava 5の新機能について熟知していません(つまり、私はそれらを知っていますが、実稼働環境で使用することは一度も書いていません)。中規模のコードベースをJava 1.4.2からJava 5に移行するための戦略

私の質問は:

  1. のJava 5のどのような機能は通常、製品コードで使用されていますか? (すなわち、ジェネリック、オートボクシングなど)ベストプラクティスであるとは考えられない/回避される機能はありますか?

  2. このサイズのコードベースを移行するために使用できる最適なリファクタリング戦略は何ですか? (つまり、クラスが編集されたときにのみ、クラスを一度に1つずつ変更するなど)。目的 - コードベースのリスクを減らす。制限 - リファクタリングを行うためのリソース。

アドバイスありがとうございます。

UPDATE - 年が遅すぎますが、遅くなく良いですか? =)

コメントありがとうございます。多くの素晴らしい点があります。ソフトウェア開発者の生活の中で、あなたは終わりを目指して努力しているが、もっと「緊急」な何かのために回ってはいけないプロジェクトがいつもあるだろう。それは、私たちは、Java 6

を使用しなかった理由私は強いことが判明したので(当時)は、Java 5の使用に関して

、それは、クライアントの運用環境で必要とされたものでした列挙型、列挙型、およびプリミティブのアンボックス化は、古いコードと新しいコードの両方に最も多く適用する傾向があった機能でした。リファクタリングはかなり簡単でしたが、コードの理解度が大幅に向上し、標準の適用が容易になりました。私が最も困っていたのはジェネリック薬でした。私はそれがまだ完全に把握して感謝するチャンスを持っていない概念だと思うので、ジェネリックの応用が適切だった以前のケースを見つけることは難しかった。

このスレッドに貢献したすべての方々に感謝し、後のフォローアップについてお詫び申し上げます。

+0

IntelliJなどを使用することをお勧めします。これは、ほとんどの変更で自動修正が行われるためです。 –

+0

@Peter残念ながら、私たちはIntelliJにアクセスできませんでした。ちょうどEclipse。 – slau

+0

IntelliJコミュニティ版は無料です。 JDK 1.4から5.0への移行ツールとして使用するだけで、それ以外のものは使用できません。 ;)これまでにやったことがあり、1回の実行からチェックインした中で最も多くの自動修正/変換が7Kでした。 :ユニットテストではP –

答えて

6

のJava 5が一般的にほぼ完全にJavaの4と下位互換性があり、あなたが移行するときしなければならない唯一の変更は、Java 4コードで新しいenumキーワードのいずれかの用法の名前を変更することです。

潜在的な互換性の問題の完全なリストは以下のとおりです:

http://java.sun.com/j2se/1.5.0/compatibility.html

私は実際にはに実行しただけで、他の1は、JAXP実装の変化に関連しています。私たちの場合、単にxerces.jarをクラスパスから削除することを意味していました。

リファクタリングが行われる限り、コレクションクラスを新しい強く型付けされたジェネリックバージョンを使用して移行し、不要なキャストを削除することは良い考えです。しかし、別のポスターが指摘するように、ジェネリックコレクションへの変更は、あなたが垂直スライスで作業する場合に最も効果的な傾向があります。そうしないと、ジェネリック型を非ジェネリック型と互換性を持たせるためにコードにキャストを追加する必要があります。

私がコードを移行するときに使用するもう1つの機能は、@Overrideアノテーションです。コードをリファクタリングするときに継承の問題を捕捉するのに役立ちます。

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Override.html

あなたのコードは、スレッドを使用する場合は、新しい並行処理ライブラリは非常に便利です。たとえば、自家製のスレッドプールをThreadPoolExecutorに置き換えることができます。

http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html#concurrency

私は間違いなくあなたは、通常のメンテナンス時にそれを変更するように、コードを更新するアプローチを取るだろう。互換性の問題以外は、他の理由でコードを変更していない限り、新しいJava 5の機能を使用する魅力的な理由はないと思います。

+1

+1、1.4から5に移行するのは大変な仕事のように見えません。特にオリジナルのポスターのような小さなプロジェクトの場合はそうです。 – JeeBee

2

ジェネリックの「ウイルス性」という性質上、非常に大きな問題が1つあります。アーキテクチャ内の特定のレイヤーにそれらを導入し始めると、一般的にはそれを下にあるレイヤー&の上に導入したいと考えています。ジェネリック医薬品を導入することはおそらく、完全な "垂直"で最も効果的であることが分かりました。しかし、すべてを一度に行う必要はありません。

1

1.4から5への移行でうまくいかないものを移行したいと思いますが(それが何であるかはわかりませんが)の移行には注意が必要です。

あなたはこのルートを取る行う場合は、いくつかの質問:

あなたは包括的なテストカバレッジを持っていますか?そうでない場合は、マイグレーションするコードの単体テストを記述する必要があります。

コードベース内で広く使用されているコンポーネントがありますか?もしそうなら、彼らは多分それらのAPI(例えばジェネリックスなどを使用して)の面で移行される候補者です。

Java 5から広く使われている点ではジェネリックスは重要であり、あなたの人生をはるかに簡単にします。私はautoboxingも表示されませんtoo、enums(これはすべて相対的です)。 Varargsはほとんど決してありません。注釈はフレームワークにとっては便利ですが、私はこれらを消費します。私は自分自身を実装したとは思わない。

+0

+0.5、新機能の使用では+0.5です。 – guerda

2

これは本当に難しい質問です。なぜなら、影響を受けるコードと影響を受けるコードに依存するからです。

マイグレーションが重要な仕事でない場合は、自分自身を尊重し、Javaの最新バージョン(Java 6ではなくJava 6)にアップグレードしてください。Java 6は1年半以上使用されていません成熟しています。 Java 5(imho)を選択しない理由はありません。

第2に、ソフトウェアプロジェクトのように、できるだけ早くプロダクションに何かを得ることが目標です。したがって、システムのスライスを特定する必要があります。より小さいほど良い、より多くの非致命的な、より良い。

もう1つのことは、Java 6の下でアプリケーションを起動し、何が壊れているかを確認することです。期待以上に悪いかもしれません。はるかに良いかもしれない。

あなたが知っておく必要があるもう1つのことは、そのサウンドによって、あなたのアプリには廃止されたjar /ライブラリがあるということです。 1.4.2以降のJavaと互換性がないものもあります。これらのすべてを最新のバージョンにアップグレードしたいと思うかもしれません。

これはおそらくより多くの物を壊すことを意味しますが、古いAPIまたは廃止予定のAPIを使用すると、缶を通り過ぎるだけで他の問題が発生します。

アップグレードに大きな影響を及ぼす可能性のある例外はあります。軸1から軸2が気になります。そのような状況は、より慎重な考えが必要です。

どのような機能が使用されていますか...それらのすべてがかなりです。私は頭の上から避けなければならないものは考えられません。

また、私はちょうどあなたのプロジェクトのサイズに気づいた:〜20K LOC。それは実際には非常に小さい(例えば、自分自身で過去3ヶ月間にそのサイズについてのアプリを書いた)。

最後に、これはまた、どのように簡単に壊れたものが見つかるかによって異なります。あなたが良い単体テストカバレッジを持っているなら、素晴らしい。それはかなり稀です。あなたは、アプリを実行し、問題を確実に見つけることができればそれほど悪くない。

シナリオをテストするのが難しい状況にあり、すぐに問題を発見できない可能性があります。それはもっと注意が必要です。

+0

J2SE 5.0はサービス終了時です。可能であればJava SE 6。 –

1

klocは、ビッグバンでジェネリックスを挿入するのに十分小さいものでなければなりません。明らかに、あなたのコードがJava SE 5で実行を最初にコンパイルすることを確認してください。ジェネリックの比較的簡単なことは、それらを追加することでセマンティクスがほとんど変更されないことです(暗黙的なケースのために特定のオーバーロードが変更される可能性があります - Iterator<char[]> iter; ... System.out.println(iter.next());が頭の上から悪い例です)。

ジェネリックを追加することによって、コードの概念的な問題が強調される場合があります。たとえば、1つのMapを2つのマップとして分離キーセットで使用します。 TreeMapは、1つのクラスに2つの異なるモード(Comparator<T>またはComparable<T>を使用)があるJavaライブラリの例です。

拡張機能と自動ボクシングのようなものは非常にローカルであり、少しずつ追加することができます。列挙型はあまりお目にかかれず、実際にどのように使用するかについていくつか考えているかもしれません。

1

あなたはこれについて間違った方法をとっていると思います。現在のコードをすべてJava 1.5に更新するのではなく、すべての現在のコードが1.4.2とまったく同じように1.5.2で実行されるように計画し、今後作成されるすべてのコードは1.5で正常に動作するようにする必要があります。

私はこのようなさまざまなサイズのコードベースのようないくつかの移行を行ってきました。目標は常にユニットテストを1トン持っていることを確認し、1.5を簡単に差し込み、テストを実行できるようにすることでした。私たちは実際に約10の問題に遭遇しました。ほとんどの場合、何かをサポートしていない正規表現ライブラリや、何か別のものをサポートする正規表現ライブラリに関連していまし

新しいコードをすべて1.5で書いてください。何らかの理由で古いクラスを変更した場合は、分を費やしてジェネリックスを実装しますが、すべてをリファクタリングする理由はありません。あなたがテストをしていないと、私にはちょっと危険です。

関連する問題