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


10

主な問題

最も近代的なプログラミングプラットフォームはパッケージ管理のために持っている良いサポートを見て(と思うgemnpmpipなど、)、それが促進し、疎結合アーキテクチャを作成するように、内部で開発されたパッケージで構成されたアプリケーションやシステムを設計する意味がありませんか?

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

考慮事項

私には、これはコードのデカップリングを促進し、保守性を支援するように思われます。ほとんどWebベースのデスクトップアプリケーションのようなものです(更新はほとんど自動的に適用され、単一のコードベースは単一の機能などに適用されます)。

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

回答:


12

私は(両方の.NETとのnugetを使用)を2回になりました。このようなプロジェクトに関わってきた、と私はと言うでしょうバランスの上に、それは良いアイデアです。しかし、走行距離は異なる場合があります。

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

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

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


素晴らしい入力。一般的に、すべてのものはバランスが取れている必要があり、あなたのコメントがそれらの行に留まる方法が好きです。それは多くの場合よりうまくいく傾向があると思うと聞いてうれしいです...そして、問題の出現はとにかく一定です。アプリのテストに関するヒントが大好きです:)。+1。
ファンカルロスコト2014年

1
* nixの世界でもこれを行うプロジェクトはたくさんあります。あなたは、多くの場合、ライブラリは開発リソースなどからGUIのからフロントエンドから分離してい
デヴィッド・コーデン

面白い。複雑なシステムを整理するのにいい方法のように聞こえますが、私はそれが過剰設計の場合であることを恐れていました。注意して適用すると、適用されないはずです。ありがとう!
ファンカルロスコト2014年

3

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

@pdrが指摘したように、独自の依存関係hellを用意してください。あるパッケージへの変更では、最初に別のパッケージで別の変更を行う必要があります。これは、コード行を変更するだけでなく、テストして、変更が受け入れられる可能性があることを意味します。リリースを構築し、前述のパッケージリポジトリにリリースをアップロードします。そして、あなたが変更しようとしていたものを変更します。

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

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


素晴らしいヒント。私はcommonパッケージをオプションとは考えていませんでしたが、あなたが言うように、将来的には「合理的な」決定となることがわかりました。私の意図は、コードではなくコンポーネントのラインに沿っていました。つまり、異なるパッケージで同じことをするコードが多すぎて、それらが異なることをするのが理想的です。パッケージ間で共通点がある場合、プロジェクトは定義上別個であるため、そのような繰り返しはプログラミングの優れた原則に違反しないと思います。
ファンカルロスコト2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.