- PR -

C# VS2003でVOを簡単に作りたい場合

1
投稿者投稿内容
フォルテッシモ
会議室デビュー日: 2003/12/04
投稿数: 12
投稿日時: 2004-05-12 03:52
いつもお世話になっております。実はC#を使って
ValueObject(プロパティが沢山定義されているオブジェクト)を作ろうと
思ったのですが皆さんどのように作られていますか?
VS2003ではEclipseのGet/Setメソッド作成みたいなものはないのでしょうか?
Eclipseであればprivate変数のget/setメソッドを自動で作成してくれるのが
あるんですが。あれに近いプロパティ版はないかなぁっと^^;

大変素人的な質問ですがなかなか見つからず
皆さんマクロ組んで自動化してるのかUMLからVO自動作成してるのかなぁっと
ぼんやり思い質問させていただきました。

以上 お答えしていただければ幸いです。
きよの
常連さん
会議室デビュー日: 2004/02/07
投稿数: 34
投稿日時: 2004-05-12 07:16
きよの と申します。

引用:

フォルテッシモさんの書き込み (2004-05-12 03:52) より:
ValueObject(プロパティが沢山定義されているオブジェクト)を作ろうと
思ったのですが皆さんどのように作られていますか?



C# で Value Object を簡単に作る場合は、フィールドを public にしてしまっています。C# では、public フィールドを public プロパティに変更しても、利用側のコードを変更する必要がないからです。

Value Object を作る時には、すべてのフィールドを public とし、プロパティなどはなにも作成しません。何か問題(例えばいくつかのフィールドは読みだし専用にしたいなど)がある場合にのみ、フィールドを private に変更し、変わりに public なプロパティを生成しています。

ここで、ポイントは、public なフィールドをプロパティと同じ命名規則にすることです。これにより、利用側は、それがフィールドなのかプロパティなのかを意識しなくてもよくなります。
フォルテッシモ
会議室デビュー日: 2003/12/04
投稿数: 12
投稿日時: 2004-05-13 09:37
きよの さん ご返答ありがとうございます。お返事遅くなり申し訳ありませんでした。
なるほど^^;public フィールドに直に格納させるですか。確かに命名でプロパティと
見分けはつかないですね。面白いです。

プロパティってそういう使い方も出来るんですか・・
私は 接頭語 の変数名をつけることが出来る利点があるぐらいなのかなぁって
思ってました。接頭語っていつの時代やって突っ込みが入りそうですが
型が分かりやすいので^^;Javaを組む時はメソッド名からみでもうやめてしまいましたが。

// 曲タイトルのプロパティ(日本語)
private string strTitleJa;
public string TitleJa
{
get { return strTitleJa;}
set { strTitleJa = value;}
}

      ....↑もしかしてプロパティのそもそもの考え方が私が違うんでしょうか^^;

ちと不安なのですがオブジェクト指向にカプセル化をJava言語を行った時に最初に
習ったのですが それを認めてしまうと自分だけで行っているプログラムはいいですが
それが大規模プロジェクトになるにつれ崩れてしまうのではないのかなぁっとよぎったの
ですがいかがでしょうか?他のみなさんはどう組まれてるんでしょうね^^;;;

考えて探したリンク
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcn7/html/vbconclassmodulesputtingdatatypesprocedurestogether.asp

[ メッセージ編集済み 編集者: フォルテッシモ 編集日時 2004-05-13 09:45 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-13 11:03
 インテリセンスは効かなくなりますが、NameObjectCollectionBaseクラスを継承したクラスにしてもいいかも。

ValueCollection[PropertyName] = value

の様なアクセスができます。


利点:
 “プロパティ”を増やしても、コードの変更がほとんどない

難点:
 値はすべてObject型でアクセスするので、適切にキャストする必要がある
 インテリセンスが効かない → アクセス用の列挙型を定義する
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-05-13 14:05
引用:

ちと不安なのですがオブジェクト指向にカプセル化をJava言語を行った時に最初に
習ったのですが それを認めてしまうと自分だけで行っているプログラムはいいですが
それが大規模プロジェクトになるにつれ崩れてしまうのではないのかなぁっとよぎったの
ですがいかがでしょうか?他のみなさんはどう組まれてるんでしょうね^^;;;


カプセル化とは単純に言うと、外部に公開するインターフェイスを明確に規定し、それ以外の不要な操作、内部実装に依存する部分等を公開しない、ということです。
外部インターフェイスを明確にし、それ以外の操作ができなくなっていれば、カプセル化の目的は果たせているはずです。

「フィールドをprivateにして、アクセサメソッド(.NET では通常プロパティ)をつければ、カプセル化したことになる」などと勘違いしてはいけません。

後々フィールドの直接公開をプロパティに変更すると、外部に全く影響がないとはいえませんが、通常のソースレベルではおおよそ互換性を維持できますし、「必ずプロパティにしなければならない」とは思いません。
フォルテッシモ
会議室デビュー日: 2003/12/04
投稿数: 12
投稿日時: 2004-05-14 01:37
なちゃさん Jitaさん お返事どうもありがとうございます。ぬしと書かれてる
方にお返事を貰うと恐縮します(笑)

なるほど。カプセル化は目的納得するお答えありがとうございます。
何だかget/setで全てアクセスしなければいけないと思ってました(笑)

そうするとC#のプロパティはソースを単純化する事が出来る利点があるんですね。
最初 別にget/setメソッドでいいよなぁっと思ってたのですが納得いたしました。
前別サイトでプロパティの利点はと聞いた時は部品として.NETのほか言語がアクセスし
やすくする為と聞いてそうなんだっと思っていたのですが今回の方が納得できました。
どうもありがとうございます。

NameObjectCollectionBaseは初めて知りました^^;動的に増えるかもみたいなときは
いいですね。でも呼び出すキーとか固定値できらないといけなそうですね^^;;

私の中の結論では VOはpublicフィールドで作るので 自動生成みたいなツールは
なくてもいい(または用意する必要がないのでない)に落ち着きそうです。
本当にありがとうございました。

また何かありましたら未熟者ですが宜しくお願いいたします。

[ メッセージ編集済み 編集者: フォルテッシモ 編集日時 2004-05-14 01:40 ]
1

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