再利用可能なライブラリをどのように構築しますか?
-
12-09-2019 - |
質問
不必要に肥大化することなく、ビジネス プロジェクト間で簡単に移植できるようにコードを整理するにはどうすればよいでしょうか?
たとえば (.Net の場合)、次の名前空間があるとします。
namespace Computers
- Hardware
- Motherboard
- GPU
namespace Monitors
- Display
- Mirrors
namespace Peripherals
- USB
- PS/2
- 親名前空間ごとにプロジェクトを作成し、そのプロジェクト DLL を他のプロジェクトで参照しますか?
- 大きなクラス ライブラリを 1 つ作成して、それを移植しますか (ライブラリの 5% しか必要ない場合でも)。
- それとも、ファイルを 1 つ作成し、必要なコードをそのファイルにコピーするだけですか。「プラグ アンド プレイ」アーキテクチャ (これは悪いことのように見えますが) を実現するために必要なすべてのプロジェクトにそのファイルを持ち込む必要がありますか?
編集:特に .Net の答えを探しているわけではありませんが、これは私が使用している具体的な例です (抽象的な例だと、この例の質問を理解するのが難しくなるためです)。
解決
あなたは親ごとにプロジェクトを作成してください。 その後、名前空間と参照その 他のプロジェクトで、プロジェクトのDLL?
必ずしもそうではありません。私のライブラリは、典型的には非常に大きなものではなく、あなたは、Microsoftは確かにそれをしないわかりますので、これは通常、そのように終わります。 System.Webのは、あなたがSystem.Webの参照が含まれていない場合でも存在します。あなたが行う場合は、ちょうどより多くのクラスを取得します。 System.Web名前空間は、いくつかの異なるのDLLで使用されていることを示す。
あなたは一つの大きなクラスライブラリを作成してください。 ポートの周りにその事(たとえ あなただけの)ライブラリーの5%が必要?
はい。ハードドライブの空き容量は、冗長なコードを維持するよりも安い、安いです。
それとも、あなただけのファイルを作成しないと、 あなたがそのファイルに必要なコードをコピー。 すべてに周りにそのファイルを持ち歩きます あなたが達成するために必要なプロジェクト 「プラグアンドプレイ」アーキテクチャを(悪いです これは)思わとして?
これは、関数に依存します。私は通常のスニペットでこのような何かを置くと思います。例えば、私のWebプロジェクトに現れる典型的な機能は次のようにあります:
void ShowErrorMessage(HtmlTableRow row, string message)
{
row.Cells.Clear();
row.Cells.Add(new HtmlTableCell());
row.Cells[0].InnerHtml = message;
row.Cells.Attributes.Add("class", "error");
row.Visible = true;
}
その後、私は、私が使用し、時折セルのCOLSPAN値たかったCSSクラスに合格する必要があると思いますので、これは、ライブラリ関数のための良い候補のように思えたことはありませんです。しかし、あなたは私のWebプロジェクトでいくつかの場所でこのような座っ実装のいくつかの並べ替えが表示されます。
他のヒント
私は、DNAから私の合図を取るし、プロジェクトにプロジェクトから私の一つの巨大なクラスライブラリの全部または一部をコピーします。必要に応じて私は自由にメソッドやクラスを書き換えます。
このアプローチはややカウンター従来のプログラミングの知恵にですが、私はそれをノックしません:それは最後の35億年間の生き物のために非常に成功してきました。人生のように、別の(プロジェクトでコンパイルされたアセンブリを共有することによって、インタフェースと実装を接合)が変化を抑制し、実質的に最終的な消滅を保証します。
私は私が唯一のように、最後に作成された実際のアセンブリの数が減少すれば、ダウンプロジェクトの数を維持しようという最近発見しました。私はそれが難しいけれども、真にモジュラーと、互いに独立したプロジェクトを作成するために見つけるので、これは可能性がある。
私は、一般的なルールがあるかもしれないと思います。プロジェクトは実際にそれ自身のプロジェクトを作り、その後、独立して他のすべての開発およびその他の依存関係なしに他のプロジェクトにプラグインすることができます。あなたはそれが動作するために参照する必要がある他のプロジェクトが常に存在していることが判明した場合(たとえば、おそらくあなたのモニターに投影し、あなたはまた、GPUクラスを持つコンピュータの名前空間が含まれていない限り、まったく何も動作しないことを見つけます。)、その後、私は1つのプロジェクトでそれらを一緒に置くところます。
とは別に、私はルールがあまりにもハードと高速とは思いません。本当にアセンブリに何の多くに依存し、それが任意のルールを作るのは難しい...
ちょうど私の2セント、ではない価値がたくさん...
私は、単一のDLLから始め、それが大きくなると、かなり独立したコンポーネントが含まれているし始めると、私は別のDLLのようにそれらを考慮することもできます。私にとって、それは主に美学の問題だ - 私は独立した直交とよく組織物事を維持したいです。一つの大きなDLLと何も間違って、メモリの量を考えると、今日で利用できるディスクスペースがありません。
複数のプロジェクトで共有されているもののために私は、一般的に一つの大きなDLLのアプローチで行きます。ここでは摩擦は、あなたがこの男を使用して多くのプロジェクトを持っている場合、私は非常にそれを命名し、GACにそれを投げ強いお勧めします、しかしです。あなたがより多くのプロジェクトを追加すると、あなたが最終的に実行されますと、共有コンポーネントの互換性に影響する変更を行うための願望です。あなたは強い命名/ GACを使用していない場合は、あなたが変更を行うときに行くと、すべてのアプリを更新する必要があり、必然的に、あなたは1を忘れてしまうと、生産の中で何かが爆発する。
強いという名前を付け、ソース管理で集中管理フォルダ内のリリースバージョンを維持し、常にそれを参照します。そして、展開上のGACにそれを投げます。