Javaのメソッドにおけるアクセス修飾子は、

同一クラス内である(private)か否か
パッケージプライベートである(なし,protected)か否か
サブクラスである(protected)か否かという単位でしか制限できませんよね

ということは、サブシステム間でクラスを共有する場合、相手のサブシステムに公開したくないクラスは必然的に同一パッケージに入れる必要があり、管理が難しくなると思いますが、実際現場ではどのようにされているのでしょうか。
また、私はサブパッケージであるか否かという、アクセス制御があれば、問題が解決できると考えますが、如何なのでしょうか。そして、他の言語にそのような概念があるものは存在するのでしょうか。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/04/25 18:35:46
  • 終了:2006/05/02 18:40:03

回答(3件)

id:ma-kanoh No.1

ma-kanoh回答回数155ベストアンサー獲得回数42006/04/25 21:44:14

ポイント27pt

>実際現場ではどのようにされているのでしょうか。

は、そもそもそんな難しいことは考えない。

相手のサブシステムに公開したくないクラスだろうがなんだろうが

関係なし。「みないことにしといて」という合意をとっただけでした。私のところは。

逆にFacedeパターンで完全隠蔽、というのもありましたが。

http://www.kmonos.net/alang/d/attribute.html

D言語には、まんま「パッケージ」(package)という概念があります。

「モジュールは違っても同じパッケージに属するコードからの アクセスは許可する」とのことなので合ってるのでは。

C#は、誰か解説してくれるに違いない。。。

id:houndyz

>「みないことにしといて」という合意をとっただけでした。

なるほど。。。やはり割り切ってるんですね。

> D言語には、まんま「パッケージ」(package)という概念があります。

本当ですね。これがあるとカプセル化ができそうですね。ありがとうございます。

2006/04/26 12:59:33
id:ikg No.2

ikg回答回数4ベストアンサー獲得回数02006/04/27 02:24:06

ポイント27pt

http://www.hatena.ne.jp/

URLはダミーです。

私のいる現場での現状だけですが。


私のところではざっくりとした基準で制御する事が多いです。

#publicにしたところで、予想外のクラスから呼び出されるのはミスっている時だけなのが現状なので‥


>サブシステム間でクラスを共有する場合

publicにしてしまいます。


>相手のサブシステムに公開したくないクラス

同じパッケージにできない場合は『public』にしてしまいます。

ある程度防ぎたい場合には『なし』として、

同一パッケージのクラスのprotectedメソッドから呼び出させ、

そのクラスを継承させる、といった形をとったりもします。

(元々のメソッドのアクセス制御のためだけに、このような面倒な

やり方を取ることはありませんが‥)

id:houndyz

> ある程度防ぎたい場合には『なし』として、

> 同一パッケージのクラスのprotectedメソッドから呼び出させ、

> そのクラスを継承させる、といった形をとったりもします。

なるほど、facadeと同じようなことを継承で行うのですね。

やはり、Javaではパッケージ間のアクセス制御を考慮して、

パッケージ構造を決めるより、クラスの意味的な整理として

割り切っているんですね。

貴重な情報ありがとうございます。

2006/04/27 13:00:12
id:aiaru No.3

あーる回答回数29ベストアンサー獲得回数12006/04/27 15:19:57

ポイント26pt

http://www.atmarkit.co.jp/fjava/rensai3/devedge06/devedge06_...

URLはダミーです。

私のところも、基準無しに作成されてますね。

外から呼ばれるときは public で 呼ばれないときは private みたいな。^^;

あとは、「基本はリードオンリーオブジェクト」で、このオブジェクトにセットできる人は限られている場合に、 getterだけpublicにしたりしてますね。

(例えば Userクラス があって、使う人には読み込み専用で使わせて ファクトリー経由でしかこのUserクラスは作成させないとか。)


でも、ぶっちゃけ

public と private が90%ぐらい締めています。はい。


最近、

「Javaで作ってるけどオブジェクト指向じゃないなぁ」

って言葉をよく聞きますが、

まさにその通りだと思います。

id:houndyz

> 使う人には読み込み専用で使わせて ファクトリー経由でしか作成させないとか。

なるほど、オブジェクトの生成を局所化させたい時は有効ですね。

> 「Javaで作ってるけどオブジェクト指向じゃないなぁ」

厳密なカプセル化ができない≠オブジェクト指向ではない

だと思うので、ちょっと行き過ぎだと思いますが、気持ちはわかります。

Javaはプログラムが複雑になってしまうキーワードを、排除するポリシーで作られているそうなので、アクセス修飾子を増やさない事を優先したのかもしれませんね。

皆さんのお話をまとめると、クラス内部のプロパティ、メソッドを外部に公開するか否かという点では、管理している。その上で、どうしても気になる所だけをある程度、カプセル化するということですね。

ただし、パッケージは、クラスを整理するための入れ物の役割もあり、この構造に悪影響を与えない範囲でされているといった所でしょうか。

愚問に対して有益なご意見ありがとうございます。

2006/04/28 12:51:55

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません