- PR -

パッケージでのアクセス制限

1
投稿者投稿内容
ビジネスモール開発者
常連さん
会議室デビュー日: 2005/03/17
投稿数: 25
投稿日時: 2006-03-30 11:02
現在、ASP.NET(VB.NET)で開発しています。

基本的な質問で恐縮です。

UMLでいうパッケージでアクセス制限をかけたいのですが
方法はないのでしょうか?
あるクラスについては、同じパッケージからしか利用できないようにしたいのです。

VB.NETでは、名前空間がパッケージに相当すると思うのですが、
「あるクラスについて、同じ名前空間からしかアクセスできなくする」
という制限はできないと理解しています。
(取り違えているのかもしれませんが)

もしそうなら、同じことを多少強引でもいいので実現するには
どんな方法があるでしょうか?

パッケージ毎にプロジェクトをわけるというのも考えましたが、プロジェクトの管理が大変になってしまうので、よろしくないと判断しました。

パッケージに役割をするクラスをつくり、そのクラスの中にクラスをつくる、
というのも考えましたが、クラスの中にクラスを作るというのが
よく理解できていないため、混乱してしまいました。

みなさんはどうされているのでしょうか?
良い案がありましたら教えてください。
よろしくお願いします。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-30 11:37
引用:

ビジネスモール開発者さんの書き込み (2006-03-30 11:02) より:

パッケージ毎にプロジェクトをわけるというのも考えましたが、
プロジェクトの管理が大変になってしまうので、よろしくないと判断しました。


・・・それはよろしいのですが、

引用:

パッケージに役割をするクラスをつくり、そのクラスの中にクラスをつくる、
というのも考えましたが、クラスの中にクラスを作るというのが
よく理解できていないため、混乱してしまいました。


こちらの方が遥かに大変です。(そんなクラスなんて管理したくないです)

素直に「アセンブリ」を分けて Friend (internal) にしましょう。
そもそも、ひとつのアセンブリにしてしまった以上、
その中でこういったアクセス制御をする必要性が感じられません。

名前空間の目的は衝突を防ぐことであって、同一アセンブリ内の都合は考えていないハズです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-03-30 11:42
引用:

VB.NETでは、名前空間がパッケージに相当すると思うのですが、



いいえ。違います。

.NET では、名前空間はクラス名の一部でしかありません。
この辺は、Java と少し扱いが違います。

引用:

UMLでいうパッケージでアクセス制限をかけたいのですが
方法はないのでしょうか?
あるクラスについては、同じパッケージからしか利用できないようにしたいのです。



ということなら、管理単位は名前空間ではなく「アセンブリ」が適切です。
C# では internal キーワードを使用して、クラスの利用範囲を同一アセンブリ内にのみ限定します。
ビジネスモール開発者
常連さん
会議室デビュー日: 2005/03/17
投稿数: 25
投稿日時: 2006-03-30 11:56
引用:

渋木宏明(ひどり)さんの書き込み (2006-03-30 11:42) より:
引用:

VB.NETでは、名前空間がパッケージに相当すると思うのですが、



いいえ。違います。



ありがとうございます。やはり勘違いしていたようです。

では、例えば
社員ロジッククラスと、社員DBクラス(DBとやりとりするクラス)
があって、
社員DBクラスは、社員ロジッククラスからしかアクセスできない
ということを実現するのは無理なのでしょうか?

パッケージなり、名前空間なり、クラスをいれる箱があって、
社員という箱の中に、社員ロジッククラスと社員DBクラスをいれて、
社員DBクラスは、その箱の中からしかアクセスできない
のようなことができるとうれしいのですが。
細かい単位でそれをやりたいと思っているので、
アセンブリをわけるのはやりたくないと思っています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-30 12:12
引用:

ビジネスモール開発者さんの書き込み (2006-03-30 11:56) より:

社員DBクラスは、社員ロジッククラスからしかアクセスできない
ということを実現するのは無理なのでしょうか?


無理というのは御幣がありますが...

ところで、アクセスレベルに拘るのは良いことですが、それでも完全には防げません。
リフレクションを使えば、プライベート メンバであっても呼び出せますから。

引用:

細かい単位でそれをやりたいと思っているので、
アセンブリをわけるのはやりたくないと思っています。


それだけ単純であれば、インナークラスにしてみてはいかがでしょう?
でも、イメージ的に「利用する側・される側」だけでは内包関係としては正しくないんですよね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ビジネスモール開発者
常連さん
会議室デビュー日: 2005/03/17
投稿数: 25
投稿日時: 2006-03-30 13:29
引用:

ところで、アクセスレベルに拘るのは良いことですが、それでも完全には防げません。
リフレクションを使えば、プライベート メンバであっても呼び出せますから。



そうですね。アクセスレベルにこだわりすぎたのかもしれません。
(できるだけ隠せるものは隠したかったので・・・)


ありがとうございました。
1

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