- PR -

クラスライブラリ、アセンブリ、名前空間の使い分け

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2008-03-15 13:48
 クラスライブラリの仕様変更が発生しても、品質を維持したいと考えています。そのためには、クラスを適切に配置し、必要なクラスのみ見えるようにする必要があると考えています。
 このような目的のために、C#では、下記の3つの手段が用意されていると私は見ています(このような見方は正しいでしょうか?)。
 それでは、これらの手段をどう使い分ければ良いでしょうか?各々の役割の違いと使い分けの基準を明確にしたいと思っています。よろしくお願いします。

[クラスを管理する3つの手段]
1.クラスライブラリの分割
クラスライブラリを分割し、プロジェクトに参照を追加するか否かで見え方を制御する。
2.アセンブリの分割
アセンブリを分割し、アクセサ(publicあるいはinternalのどちらにするか)で見え方を制御する。
3.名前空間の分割
名前空間を分割し、using句で見え方を制御する。
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-03-15 14:55
議論を呼びそうなスレッドですね。

2点だけ書きます。
・EditorBrowsable等を使用して消してください。
 ・言われている3つの手段としてはありますが。目的ではないので違います。

あとは誰かのフォローを期待します。

[ メッセージ編集済み 編集者: indigo-x 編集日時 2008-03-15 15:10 ]
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 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
小規模な開発であればすべて同じ名前空間に入れてしまってもいいかもしれません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-03-15 22:42
引用:

ひろしさんの書き込み (2008-03-15 13:48) より:
 クラスライブラリの仕様変更が発生しても、品質を維持したいと考えています。そのためには、クラスを適切に配置し、必要なクラスのみ見えるようにする必要があると考えています。
 このような目的のために、C#では、下記の3つの手段が用意されていると私は見ています(このような見方は正しいでしょうか?)。
 それでは、これらの手段をどう使い分ければ良いでしょうか?各々の役割の違いと使い分けの基準を明確にしたいと思っています。よろしくお願いします。

[クラスを管理する3つの手段]
1.クラスライブラリの分割
クラスライブラリを分割し、プロジェクトに参照を追加するか否かで見え方を制御する。
2.アセンブリの分割
アセンブリを分割し、アクセサ(publicあるいはinternalのどちらにするか)で見え方を制御する。
3.名前空間の分割
名前空間を分割し、using句で見え方を制御する。


 なかなかおもしろいですね。

 まず、最終目標は「品質維持」でよろしいですね?で、状況が、「仕様変更」と。目標を達成するためにですが。。。

 私は変更した仕様と、そのために実施したテスト項目が結びついていること、だと思います。また、ある仕様と関連する仕様が明確になっていること、トレースできる必要があると考えます。そして、なぜ変更をしたのかが、記録されていること。仕様、テスト、理由の3つが、それぞれ関連付いて管理されていることが重要だと考えています。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2008-03-16 01:00
ご回答ありがとうございます。
パッケージについては勉強になりました。
パッケージの分割には名前空間、アセンブリのどちらを使うべきなのか興味があります。

それから、名前空間を使うか、アセンブリの分割を使うかについての議論とは別に、アセンブリの分割を使う場合の手段に着目しています。「アセンブリの分割 」に加えて「クラスライブラリの分割」を区別したのには、クラスライブラリ形式のプロジェクトに着目していたからです。それは、以下のいきさつがあったからなのです。

 クラスライブラリ内の他のクラスの部品となっていて、汎用的で無いクラスを、クラスライブラリの外から隠蔽したいと思いました。そこで、元々privateだったのをinternalに変更しました。
 ここで疑問が生じました。元々がprotectedであったクラスはどうすれば良いのでしょうか?protected AND internalが表現できないからです。また、protectedなクラスが親クラスから継承されていた場合、親クラスはinternalにできないのでpublicに。なってしまいます。そして、プロジェクトの参照でしか可視性を制御できないような気がするのです。変な感じがするのですが...。考え違いをしているような気がします。
 まず、「汎用的でない部品クラスはクラスライブラリ外から隠蔽するべき」という考えは正しいでしょうか?また、protectedなクラスはどう扱えば良いのでしょうか?

「クラスライブラリの分割」という表題は不適切でした。「プロジェクトの分割」とでもするべきでした。
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-03-16 02:09
引用:

ひろしさんの書き込み (2008-03-16 01:00) より:
パッケージの分割には名前空間、アセンブリのどちらを使うべきなのか興味があります。


一度書いてますけど、アセンブリです。

引用:

ひろしさんの書き込み (2008-03-16 01:00) より:
 クラスライブラリ内の他のクラスの部品となっていて、汎用的で無いクラスを、クラスライブラリの外から隠蔽したいと思いました。そこで、元々privateだったのをinternalに変更しました。
 ここで疑問が生じました。元々がprotectedであったクラスはどうすれば良いのでしょうか?protected AND internalが表現できないからです。また、protectedなクラスが親クラスから継承されていた場合、親クラスはinternalにできないのでpublicに。なってしまいます。そして、プロジェクトの参照でしか可視性を制御できないような気がするのです。変な感じがするのですが...。考え違いをしているような気がします。
 まず、「汎用的でない部品クラスはクラスライブラリ外から隠蔽するべき」という考えは正しいでしょうか?また、protectedなクラスはどう扱えば良いのでしょうか?


インナークラスでもない限りクラスにprivate,protectedは設定できないはずですが・・・。

>「汎用的でない部品クラスはクラスライブラリ外から隠蔽するべき」という考え
クラスをカプセル化するという意味では正しいと思います。

引用:

ひろしさんの書き込み (2008-03-16 01:00) より:
「クラスライブラリの分割」という表題は不適切でした。「プロジェクトの分割」とでもするべきでした。


1プロジェクトは1アセンブリに対応するし、
プロジェクトの参照といえばアセンブリを参照することです。
依然として区別する意味がわかりません。
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-03-16 10:23
2点だけ
 ・品質維持と(名前空間とかアセンブリ)は何の関係もないです
  (0とは言わないが)
 ・設計が逆です。
   @名前空間(論理構成)
Aアセンブリ(物理配置)
Bクラス設計
の順番した方がよいです。

ひろしさんのはボトムアップになってます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-03-16 12:25
引用:

ひろしさんの書き込み (2008-03-16 01:00) より:
protectedなクラスが親クラスから継承されていた場合、親クラスはinternalにできないのでpublicに。なってしまいます。


気になったのですが、こんなことがしたい?
コード:
protected class A {
}

public class Adash : A {
}



公開したいものによっては、インターフェースとして(だけ)公開した方がいいんじゃないだろうか、とおもったり。



ボトムアップでの設計というより、リファクタリングの最中に思い立ったという感じがしたとかしないとか。

どこまで手を入れられるかで、「それくらいでいいんじゃない?」のラインが変わる。

スキルアップ/キャリアアップ(JOB@IT)