- - PR -
クラスライブラリ、アセンブリ、名前空間の使い分け
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-03-15 13:48
クラスライブラリの仕様変更が発生しても、品質を維持したいと考えています。そのためには、クラスを適切に配置し、必要なクラスのみ見えるようにする必要があると考えています。
このような目的のために、C#では、下記の3つの手段が用意されていると私は見ています(このような見方は正しいでしょうか?)。 それでは、これらの手段をどう使い分ければ良いでしょうか?各々の役割の違いと使い分けの基準を明確にしたいと思っています。よろしくお願いします。 [クラスを管理する3つの手段] 1.クラスライブラリの分割 クラスライブラリを分割し、プロジェクトに参照を追加するか否かで見え方を制御する。 2.アセンブリの分割 アセンブリを分割し、アクセサ(publicあるいはinternalのどちらにするか)で見え方を制御する。 3.名前空間の分割 名前空間を分割し、using句で見え方を制御する。 | ||||||||||||
|
投稿日時: 2008-03-15 14:55
議論を呼びそうなスレッドですね。
2点だけ書きます。 ・EditorBrowsable等を使用して消してください。 ・言われている3つの手段としてはありますが。目的ではないので違います。 あとは誰かのフォローを期待します。 [ メッセージ編集済み 編集者: indigo-x 編集日時 2008-03-15 15:10 ] | ||||||||||||
|
投稿日時: 2008-03-15 15:04
.NETでクラスライブラリといえばアセンブリそのもののことだと思いますが・・・。
で十分でしょう。 依存性を低くするためにクラスの可視性について重視しているようですが その役割を担うのはパッケージという単位です。 というのはパッケージ内のクラスはすべて一緒に利用するように配置されているべきだからです。 .NETではアセンブリがパッケージにあたるものです。 パッケージの他の基準については下記を参照してください。 http://www.atmarkit.co.jp/fdotnet/designptn/designptn07/designptn07_02.html 名前空間については下記を参照してください。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpgenref/html/cpconnamespacenamingguidelines.asp 小規模な開発であればすべて同じ名前空間に入れてしまってもいいかもしれません。 | ||||||||||||
|
投稿日時: 2008-03-15 22:42
なかなかおもしろいですね。 まず、最終目標は「品質維持」でよろしいですね?で、状況が、「仕様変更」と。目標を達成するためにですが。。。 私は変更した仕様と、そのために実施したテスト項目が結びついていること、だと思います。また、ある仕様と関連する仕様が明確になっていること、トレースできる必要があると考えます。そして、なぜ変更をしたのかが、記録されていること。仕様、テスト、理由の3つが、それぞれ関連付いて管理されていることが重要だと考えています。 | ||||||||||||
|
投稿日時: 2008-03-16 01:00
ご回答ありがとうございます。
パッケージについては勉強になりました。 パッケージの分割には名前空間、アセンブリのどちらを使うべきなのか興味があります。 それから、名前空間を使うか、アセンブリの分割を使うかについての議論とは別に、アセンブリの分割を使う場合の手段に着目しています。「アセンブリの分割 」に加えて「クラスライブラリの分割」を区別したのには、クラスライブラリ形式のプロジェクトに着目していたからです。それは、以下のいきさつがあったからなのです。 クラスライブラリ内の他のクラスの部品となっていて、汎用的で無いクラスを、クラスライブラリの外から隠蔽したいと思いました。そこで、元々privateだったのをinternalに変更しました。 ここで疑問が生じました。元々がprotectedであったクラスはどうすれば良いのでしょうか?protected AND internalが表現できないからです。また、protectedなクラスが親クラスから継承されていた場合、親クラスはinternalにできないのでpublicに。なってしまいます。そして、プロジェクトの参照でしか可視性を制御できないような気がするのです。変な感じがするのですが...。考え違いをしているような気がします。 まず、「汎用的でない部品クラスはクラスライブラリ外から隠蔽するべき」という考えは正しいでしょうか?また、protectedなクラスはどう扱えば良いのでしょうか? 「クラスライブラリの分割」という表題は不適切でした。「プロジェクトの分割」とでもするべきでした。 | ||||||||||||
|
投稿日時: 2008-03-16 02:09
一度書いてますけど、アセンブリです。
インナークラスでもない限りクラスにprivate,protectedは設定できないはずですが・・・。 >「汎用的でない部品クラスはクラスライブラリ外から隠蔽するべき」という考え クラスをカプセル化するという意味では正しいと思います。
1プロジェクトは1アセンブリに対応するし、 プロジェクトの参照といえばアセンブリを参照することです。 依然として区別する意味がわかりません。 | ||||||||||||
|
投稿日時: 2008-03-16 10:23
2点だけ
・品質維持と(名前空間とかアセンブリ)は何の関係もないです (0とは言わないが) ・設計が逆です。 @名前空間(論理構成) Aアセンブリ(物理配置) Bクラス設計 の順番した方がよいです。 ひろしさんのはボトムアップになってます。 | ||||||||||||
|
投稿日時: 2008-03-16 12:25
気になったのですが、こんなことがしたい?
公開したいものによっては、インターフェースとして(だけ)公開した方がいいんじゃないだろうか、とおもったり。 ボトムアップでの設計というより、リファクタリングの最中に思い立ったという感じがしたとかしないとか。 ↑ どこまで手を入れられるかで、「それくらいでいいんじゃない?」のラインが変わる。 |