12

私は、多くのレガシーCOBOLコードがあり、分岐と分岐を可能な限り最小限に抑えるための方法論が採用されている小さなショップで働いています。

特定のリリースには、次の3つのレベルがあります。

  • CORE-最下層、このコードはすべてのリリースに共通です
  • GROUP-複数の顧客に共通のオプションのコード。
  • CUSTOMER-単一の顧客に固有のオプションのコード。

プログラムが必要な場合、最初にCUSTOMERで検索され、次にGROUPで検索され、最後にCOREで検索されます。特定のアプリケーションは、この順序ですべてが検索される多くのプログラムを呼び出します(WindowsではexeファイルとPATHを考えてください)。

また、このレガシーコードと相互作用するJavaプログラムもあります。コアグループと顧客のルックアップメカニズムは、Javaに簡単に対応できないため、顧客ごとにCVSブランチで成長する傾向があり、メンテナンスが多すぎます。Java部分とバックエンド部分は並行して開発される傾向があります。

私は、2つの世界を出会いさせる方法を見つけるように割り当てられました。

基本的に、リリースごとにソースを含む単一のコードベースを持つことができるJava環境が必要です。この環境では、グループと顧客を簡単に選択して、その顧客に合わせてアプリケーションを操作し、別のコードセットに簡単に切り替えることができます。そしてその顧客。

コア、顧客、グループごとにEclipseプロジェクトを使用するシナリオを考えていたので、プロジェクトセットを使用して、特定のシナリオに必要なものを選択しました。私が頭を悩ませることができない問題は、どのグループと顧客が選択されたかに関係なく機能するCOREプロジェクトでどのように堅牢なコードを作成するかということです。渡されたClassオブジェクトのどのサブクラスを、すべての新しいものではなく呼び出すかを知っているファクトリクラス?

他の人も同様のコードベース管理の問題を抱えていたに違いありません。共有する経験を持っている人はいますか?


編集:上記のこの問題の結論は、CVSを、多くのブランチを同時に処理し、履歴を保持しながら1つのコンポーネントから別のコンポーネントにソースを移行するのに適したソースコード管理システムに置き換える必要があるということです。slf4jとlogbackによる最近の移行に触発されて、ブランチを非常にうまく処理するgitを現在検討しています。SubversionとMercurialも検討しましたが、単一の場所、複数のブランチを持つプロジェクトにはgitの方が適しているようです。私は別の質問でPERFORCEについて質問しましたが、私の個人的な傾向は、これと同じくらい重要な何かのためのオープンソースソリューションに向かっています。


編集:もう少し熟考した後、私たちの実際の問題点は、CVSでブランチを使用することであり、すべてのファイルをブランチする場合、CVSでのブランチが最も扱いやすいことがわかりました!改訂された結論は、それぞれが上記のレベルの1つに対応するJavaプロジェクトのフォレストに切り替え、Eclipseビルドパスを使用してそれらを結び付け、各CUSTOMERバージョンが適切なグループを取り込むことにより、CVSのみでこれを行うことができるというものです。とCOREプロジェクト。それでも、より優れたバージョン管理システムに切り替えたいと考えていますが、これは非常に重要な決定であるため、可能な限り遅らせたいと考えています。


編集:GoogleGuice2.0を使用したCORE-GROUP-CUSTOMERコンセプトの概念実証実装ができました。@ImplementedByタグはまさに必要なものです。他のみんなは何をしているのだろうか?いたるところにifを使用していますか?


編集:今、私はWebアプリケーションにもこの機能が必要です。JSR-330が設置されるまではGuiceでした。バージョニングの経験がある人はいますか?


編集:JSR-330 / 299は、JBoss Seamに基づくJEE6リファレンス実装Weldで配置され、Weldで概念実証を再実装し、Beanで...とともに@Alternativeを使用すると確認できます。 xml私たちは私たちが望む振る舞いを得ることができます。つまり、CORE jarのビットを少し変更することなく、COREの特定の機能に新しい実装を提供します。サーブレット3.0仕様を最初に読んだところ、 (コードではなく) Webアプリケーションリソースに対して同じ機能をサポートしている可能性があることがわかりました。次に、実際のアプリケーションで初期テストを行います。

4

2 に答える 2

1

ご質問に直接お答えできなかったことをあらかじめお詫び申し上げます。「特定の種類のリリースエンジニアリングを行わなくても済むように、ソフトウェアをどのように設計できますか?その質問に対する答えはわかりませんが、説明を読んだので心配です。ルート、私はあなたのコアソフトウェアエンジニアリングのニーズをあなたのリリースエンジニアリングテクノロジーに従属させることは負けゲームだと思います。

言い換えれば、顧客が本当に個別のリリースを必要としている場合は、それに対処する必要があります。私があなたが言っていることを読んだのは、あなたがあなたのバージョン管理ソフトウェアがあなたのためにすべき仕事をするためにEclipseを使いたいということです。それは実行可能な解決策として私を襲うことはありません。

私がこれでどこに行くのかわかると思います。問題が実際に「CVSでの分岐が非常に苦痛」である場合、技術的な解決策は「CVSから、より堅牢で簡単な分岐と統合を可能にするものに移行する」ことだと思います。

自由ソフトウェアの世界では、それは通常Subversionを意味します。優れた商用代替手段はPERFORCEです。私は、多くの顧客に複数のバージョンのソフトウェアをリリースし、ブランチ間で変更を相互統合することが多い会社で働いていたと言えます。PERFORCEを使用しましたが、分岐(および統合)は非常に簡単で、エンジニアは日常業務を中断することなく定期的に実行できました。

お役に立てば幸いです。

于 2009-08-17T14:42:49.590 に答える
1

@peterbに同意する必要があります。Eclipseはこれを管理する方法ではありません。ソース管理システムでの分岐はこの目的を果たすためのものなので、これをできるだけ簡単にするものを選択してください (Subversion は問題なく動作するはずです)。

また、Maven (または同様のもの) を使用して、さまざまな顧客シナリオの依存関係管理を定義することを検討することもできます。その後、maven から両方の eclipse プロジェクトを生成して、実際の開発とリリース ビルドを行うことができます。

于 2009-08-17T14:51:33.727 に答える