web-dev-qa-db-ja.com

パッケージ(宝石、卵など)を使用して分離されたアーキテクチャを作成する

主な問題

最新のプログラミングプラットフォームのほとんどがパッケージ管理(gemnpmpipなど)に対して優れたサポートを提供していることを考えると、アプリケーションやシステムを設計することは理にかなっていますか?疎結合アーキテクチャを促進および作成するために、内部で開発されたパッケージの

この例としては、データベースアクセス用のパッケージの作成や、システムの認証やその他のコンポーネント用のパッケージの作成があります。もちろん、これらは外部パッケージも使用します。次に、システムはこれらのパッケージをインポートして使用します。コードを独自のコードベースに含めるのではありません。

考慮事項

私には、これはコードの分離を促進し、ほぼWebベースとデスクトップアプリケーションのような方法で保守性を向上させるように思われます(更新はほぼ自動的に適用され、単一の機能に対して単一のコードベースなど)。

これは合理的で正気なデザインコンセプトのように見えますか?これは実際に、今日のアプリケーションを構造化する標準的な方法として使用されていますか?

10

私は今、このようなプロジェクトに2回関わっています(どちらも.NETでnugetを使用しています)。バランスでそれは良い考えだと思います。ただし、マイレージは異なる場合があります。

それが万能薬だと少しの間考えないでください、それは新しい問題を引き起こすことなくあなたのすべての問題を解決するだろうと思います。リリース管理はまったく新しい複雑さの層を獲得し、存在することを知らなかったバージョン依存の問題に対処する必要があり、には時間がありますすぐに修正してリリースする必要のある小さなバグのために4つの異なるパッケージをアップグレードする必要があるため、決定を呪うとき。

一方で、あなたはそれが物事をうまく切り離しているということは正しいです。やりすぎない限り、「かなりの労力を費やした」よりも「ああ、うまくいった」と思う機会が増えるでしょう。複数のアプリケーション間でコードを共有している場合は、アプリを個別に簡単にアップグレードできるため、特に効果的です。

そして、あなたが私のような人なら、パッケージを使用するテストアプリの作成をすぐに開始し、バグ発見プロセスからアプリケーションのレイヤー全体を削除します。そしてそれ自体、コストに見合うだけの価値はありません。

12
pdr

全体として、これは良い考えです。内部パッケージリポジトリ(通常、Javaの世界では「アーティファクトリポジトリ」、またはPython)では「pypiサーバー」と呼ばれます)の設定について考える必要があります。世界)、あなたがそこにあなたが望まないか、オープンソースとしてリリースすることができないそれらのパッケージをそこに保つように。

@pdrが指摘しているように、独自の dependency hell を用意してください。ここで、あるパッケージを変更するには、最初に別のパッケージを変更する必要があります。これは、コード行を変更するだけでなく、テストすることを意味します。 、場合によっては変更を受け入れ、リリースを作成し、前述のパッケージリポジトリにリリースをアップロードします。そして、変更する対象の意図を変更します。

これを試して最小化するために私の経験からあなたに与えることができる唯一のレシピ:パッケージから「共通」または「フレームワーク」パッケージへの共通概念の抽象化だけに依存しないでください。これは非常に客観的なことのように思えるかもしれませんが、頻繁に、おそらく矛盾する変更とリリースを必要とするモンスターパッケージにつながります。質問で概説したように、システムの機能について考え、それぞれのヘルパーパッケージを作成することをお勧めします。

それとは別に、得られる主な利点は、アプリが(多くの)依存関係から隔離されているため、簡単に交換できることです。

3
logc