拡張/再利用のためのプロジェクトの再編成
-
22-08-2019 - |
質問
私が取り組んでいるプロジェクトの範囲は拡大しています。このアプリケーションは非常にシンプルですが、現時点では非常に特殊なニッチをターゲットとしています。当面は、新しい市場をターゲットにするためにプロジェクトをフォークし、2 つのプロジェクトを並行して開発し続けるように頼まれました。
両方のプロジェクトは機能的に類似しているため、多くの機能を一般化する非常に強い動機があります。 根性 オリジナルプロジェクトの。また、近い将来、さらに多くの市場をターゲットにすることになると確信しています (市場は地理的です)。
問題は、プロジェクトの以前の管理者が、プロジェクトを元の市場に結び付ける多くの仮定を行っていたことです。汎用コードを市場固有のコードから分離するには、かなりのリファクタリングが必要になります。
事態をさらに複雑にするために、増え続ける市場に向けてプロジェクトを組織する方法について、いくつかの提案が投げかけられています。
- 各マーケットは個別のプロジェクトであり、プロジェクト間の共通点は共有ライブラリに移動され、プロジェクトは独立して展開されます。
- 既存のプロジェクトを拡張して複数の市場をターゲットにし、購入したライセンスに基づいて機能を制限します。
- 親アプリケーションを作成し、別途購入したプラグインとしてプロジェクトを再設計します
3 つの提案にはすべてメリットがあり、理想的には、これらのいずれもわずかな調整で可能になるように十分に柔軟なコードを構築したいと考えています。提案 3 は、プラグイン アーキテクチャを構築する必要があるため、最も困難なようです。最初の 2 つの提案はもう少しもっともらしいです。
これらのさまざまなアーキテクチャの長所と短所について利用できる優れたリソースはありますか?
コピーやフォークと比較して、プロジェクト間でコードを共有することの長所と短所は何ですか?
解決
通常、フォークすると最初はより早い結果が得られますが、ほとんどの場合、メンテナンスが発生します。あるフォークのバグ修正や機能強化が他のフォークで失われ、最終的にはフォーク全体を廃棄することになります。そして、その機能を「最良の」フォークに再追加する必要があります。できれば避けてください。
次に進みます:3 つのオプションはすべて機能しますが、ビルドの複雑さ、メンテナンス、展開のコスト、通信のオーバーヘッド、必要なリファクタリングの量の点でトレードオフがあります。
1.各市場は個別のプロジェクトです
複数の市場向けに同時に開発する場合に適したソリューションです。
長所:
- これにより、マーケット A の開発者は、B での進行中の作業を妨げることなく、A ビルドを破ることができます。
- これにより、マーケット A に加えられた変更がマーケット B にバグを引き起こす可能性が大幅に低くなります。
短所:
- 時間をかけて共有コードを分離する必要がある
- 並行ビルドをセットアップするには時間がかかる必要があります
- 共有コードの変更は両方のチームに影響するため、オーバーヘッドが増加します。
2.既存のプロジェクトを拡張して複数の市場をターゲットにする
かなり長い間問題なく動作させることができます。少人数のチームで一度に 1 つの市場向けのリリースに取り組む場合は、それが最善の策かもしれません。
長所:
- (1) または (3) に進む場合でも、ライセンス作業はおそらく価値があります。
- 単一のコード ベースにより、すべての市場にわたるリファクタリングが可能になります。
短所:
- 市場 A 向けに何かに取り組んでいるだけだとしても、市場 B、C、D 向けのコードも構築して出荷する必要があります。コード ベースが小さい場合は問題ありませんが、コード ベースが数千になると、ますます面倒になります。クラス
- ある市場に変更を加えると、他の市場のコードが壊れてしまうリスクがあります
- ある市場を変更すると、他の市場も再テストする必要がある
3.親アプリケーションを作成し、プロジェクトをプラグインとして再設計する
技術的には優れていると感じられ、より多くのコードを共有できる可能性があります。
長所:
- (1) の長所すべてに加えて、次の可能性があります。
- 共有コードと市場固有のコードの明確な分離
- パブリック API への移行が可能になる可能性があり、これにより、作業の一部を顧客にオフロードしたり、収益性の高いサービス プロジェクトを販売したりできるようになります。
短所:
- (1) のすべての短所に加えて、さらに多くのリファクタリングが必要になります。
ライセンスは別として、(2) が今の状況だと思います。しばらくそこに留まっても大丈夫だと思いますが、(1) に向けて少し努力してください。共有コードはすべて一緒にビルドされている場合でも、別のプロジェクトに移動します。たとえば、マーケットからの依存関係を確認するなどです。コードから共有コードへの接続はすべて一方向です。
最終的に (1) になるか (3) になるかは、状況によります。ほとんどの場合、誰が「責任者」なのか、共有コードなのか、それとも市場固有のコードなのか、ということになります。プラグインと、共有コンポーネントを構成するコントローラー クラスの間の境界線は非常に曖昧になることがあります。私のアドバイスは、コードに何が必要かを伝えるようにすることです。
他のヒント
1)NO!あなたは同じコードベースの異なるブランチを管理したくない...コードと同じくらい一般的になる可能性があるので、あなたは抜本的な変更を加えることになるでしょう、そして一つのプロジェクトは、「現時点では」他の人と同じくらい重要ではありません、その後、あなたは1つの分岐が速く、他よりも成長しているでしょう....雪玉を挿入します。
2)これは、多かれ少なかれ、業界標準です。ビッグ設定ファイルは、ライセンス/コンフィギュレーションに基づいて物事を制限します。それはアプリが少し面倒にすることができますが、限り、コードはおよそ相互に排他的なものを不平を言うと、すべての開発者が新しい機能とそれらがどのようにアプリケーション全体を通じて波及について一定の通信であるとして、あなたは問題ないはずです。それが懸念される場合、これはまた、ハックするのが最も簡単です。
3)これも「できの仕事。あなたがC#を使用している場合は、プラグインが比較的簡単で、あなただけの依存関係の地獄を心配する必要があります。プラグインは円interdependantになっての任意のチャンスを持っている場合(つまり、Aは、BがCを必要とする必要が必要ですa)の場合、これはすぐに爆発するとあなたは(非常に簡単)戻りますバックに#2。
あなたが持っている最高のリソースは、さまざまなプロジェクトで同僚の過去の経験、そしてここにまたはスラッシュドットまたはどこにそれについてyammering人々の経験は、おそらくです。確かに安います。
共有コードの長所: 1つの変更は、すべてを変えます。 統合データモデル。 唯一の真実があります。 (同じページ上にあるすべての人のためにはるかに簡単)
共有コードの短所: 1つの変更は、すべてを変える...注意してください。 1つのバグがそれであるならば、それはすべてのものに影響します。
コピー/フォークの長所: 特定の顧客のための特定の機能を実装するために通常より速いです。 あなたはAが市場BとC、Dではないにのみ適用され、その仮定を実現する際ハックする方が速います。
コピー/フォークの短所: コピーされたプロジェクトの1つ以上は、最終的に、あなたのコード内の結束が不足しているため失敗します。 上記のように言った:掃く変更が多く時間がかかります。
。幸運ます。
あなたは私をリード「のコピーとフォークは」おそらくあなたはSVNのようなバージョン管理システムのブランチとして、この「フォーク」を管理すると考えられていないことを考えるように言いました。あなたが別の業界に対応するためにブランチをリファクタリングするとき、それをこのようにすることで、あなたはリビジョン管理システムの助けを借りて、メイントランクに戻ってそれらの変更をマージすることができます。
あなたはすべてのバリエーションは、設定ファイル(またはSQLiteのconfigデータベース)によって制御されている単一のアプリケーションに移動するの長期的な戦略を以下している場合、このアプローチがお手伝いします。あなたは、あなたが両方の産業のためにそれを一般化していることを確信しているまで、あなたはまだ限り、あなたがする必要があるとして、2つの独自のシステムを構築することができますので、何をマージする必要はありません。それはすべて1つのソースコードツリー、従来の産業用トランク、およびそれぞれの新しい産業のための1つのブランチですので、しかし、あなたがコーナーに自分自身を支持していません。
あなたの会社が実際に複数の業界をatackしたい場合は、、その後、私は構成データベースソリューションは、すべてのニーズを満たすことはないと思います。あなたはまだいくつかの種類の特殊なコードモジュールを持っている必要があります。プラグインアーキテクチャは、あなたのアプリにPythonのようなスクリプトエンジンを組み込む場合は特に、それが助けになるので、入れるのは良いことです。しかし、私は、プラグインは、あなたが「何千人ものクラスの」スケールに入るとき、すべてのコードのバリエーションの要件を満たすことができるとは思わない。
あなたは新しい産業のために、今日、別のアプリケーションを構築することができます、しかし、あなたが一緒に行くように、既存のアプリに改善をマージすることが比較的容易で実用的なアプローチを取る必要があります。あなたは、クラスといくつかの産業の何千もの単一トランクの涅槃に到達しないことがありますが、少なくとも複雑さを飼いしているだろう、と業界のニーズの本当の相違がある場合にのみ、本当に重要なの変動に対処する必要があります。
私はあなたの靴にあった場合は、、私はまた、任意のを見ていることになると考えられるかもしれないアプリのすべての機能は、「報告」と多分棚レポートツールをオフに、それらを考慮しようとしています。