@IT情報マネジメント会議室は、2009年4月15日に新システムに移行しました。
新たに書き込みを行う場合には、新しい会議室をご利用ください。
- PR -

プロパティについて

投稿者投稿内容
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2005-08-09 00:49
msoです。

夜に書き込む時間がでてきたので、ちょっと以前から感じていた疑問を書き込みたいと
思います。
個人的には至極簡単な内容なので、誰でも答えていただけると感じています。
#つまりそれができない私はかなりのこまったちゃんです。

<前置き>
えー、ここ数年誰かにプログラムを教えてもらうことはなく、すでにできあがっている
プログラムをみて勉強をするか、10でできる○○という本で勉強をしている現状です。
んで、OOPを勉強していたときにはnewってなんだよ?!とか叫びつつ、
よくわからないまま放置しつつ、わかった気になったまま現在に至っています。
</前置き>

VB.NET、C#、Javaで仕事をやってきたのですが、プロパティとか、アクセサの意味がよくわかりません。
プロパティを使って、複数の値をを一個ずつオブジェクトに渡す必要性が理解できないでいます。

たとえば、C#だとすると
コード:
hoge objHoge = new hoge();
objHoge.aaa = "test" ;
objHoge.bbb = "test2";
objHoge.Exec();



とやるのであれば、

コード:
hoge objHoge = new hoge();
objHoge.Exec("test","test2");


とやった方が、コードしてすっきりするのではないでしょうか?

ちなみにカプセル化という言葉は知っていますが、
しっかりと理解はしていないかもしれません。

本当に初歩的な質問ではありますが、私を理解させていただける方がいたら
助言よろしくお願いします。
ほげた
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 67
お住まい・勤務地: なごやん
投稿日時: 2005-08-09 02:21
私はこんな説明をよくします。
 プロパティ:オブジェクトの状態を教えてもらう、変更してもらう
 メソッド:オブジェクトに仕事をしてもらう

言語で使用できるライブラリから簡単なクラスを選んで
プロパティとメソッドをじっくり眺めてみるとわかりやすいかもしれません。

例えば、.NET の string はプロパティとして Length を提供します。
メソッドとしては、Split() や Substring()、Replace() などがありますね。
保持している状態(データ)の情報を取得したり設定する場合はプロパティ、
状態に応じた振る舞いを提供する場合はメソッドとなります。

したがって、msoさんの例にある
コード:
hoge objHoge = new hoge();
objHoge.aaa = "test" ;
objHoge.bbb = "test2";
objHoge.Exec();


の aaa, bbb がオブジェクトの状態(保持すべきデータ)ではなく、
単にメソッドで必要となるデータでしかないのであれば、基本的には
コード:
hoge objHoge = new hoge();
objHoge.Exec("test","test2");


と書くべきです。

メソッドに必要となるデータをいろんなオブジェクトから集める必要がある場合は
プロパティにしておいて、hogeのインスタンスを飛ばしてしまうのもありですが。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-08-09 09:58
こんにちは、じゃんぬ です。

引用:

メソッドに必要となるデータをいろんなオブジェクトから集める必要がある場合は
プロパティにしておいて、hogeのインスタンスを飛ばしてしまうのもありですが。


情報が多くてかつ、必須な情報があるのであれば、
そのクラスに対して、インラインなクラスを定義して、
そこにデータクラスを定義して渡したりしています。
(保証されますから)



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
餅宮餅吉
ベテラン
会議室デビュー日: 2005/03/04
投稿数: 57
お住まい・勤務地: 月餅のうまい店の隣
投稿日時: 2005-08-09 11:30
こんにちわ、餅宮です。

プロパティやアクセサは、オブジェクトの属性を取得するものであると思っています。
ですので、基本的には値を設定するのはおかしいと思っています。
値を設定するのは、インスタンス生成時に渡す情報量が多くなり、
認識しにくい場合のみ使用する。というのが私の考えです。
 
プロパティ:オブジェクトの属性を取得する。
メソッド:オブジェクトの振る舞い。
 
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-08-09 11:53
どもです、がるです。
んっと。かなり個人的見解込みの意見で恐縮なのですが。

とりあえずまず
コード:
hoge objHoge = new hoge();
objHoge.aaa = "test" ;
objHoge.bbb = "test2";
objHoge.Exec();


ですが、実は自分はあまりこういうふうな実装を
しないです。
自分の場合、ちぃと手間ではあるのですが
コード:
hoge objHoge = new hoge();
objHoge.set_aaa("test") ;
objHoge.set_bbb("test2");
objHoge.Exec();


とやるです。
ちなみにデータ取得はget_XXですね。
微妙な差異ではあるのですが、データは常に
「メソッドを経由して」ってのが一つ目のポイント
でし。

よく「アクセサなんていらない」って話も
出るのですが。
アクセサを経由したほうが、色々な意味で「変更に
強い」ものが出来上がります。
限りなく手前味噌で恐縮なのですが、よかったら
http://jibun.atmarkit.co.jp/scenter/bbs/viewtopic.php?topic=8881&forum=21
あたりをご覧頂くと、そのあたりがダラダラと(笑)書いて
あります。

んで。
引数にするかアクセサにするかについては、個人的には
ほげたさんとほぼ同意見で、
引用:

aaa, bbb がオブジェクトの状態(保持すべきデータ)ではなく、
単にメソッドで必要となるデータでしかないのであれば


引数でよいと思うです。
ただ、引数が複数あると順番を間違えることがあるので、
数が多いときはアクセサ作っちゃうこともありますが(笑

で、たとえ「1つのメソッドでしか使わない」と
しても「とりあえずクラス自体に紐付いている情報」
なら、アクセッサ経由で扱うようにしています。

こんなところでしょうか?
どうでしょう?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-08-09 12:01
引用:

がるがるさんの書き込み (2005-08-09 11:53) より:
どもです、がるです。
んっと。かなり個人的見解込みの意見で恐縮なのですが。

とりあえずまず
コード:
hoge objHoge = new hoge();
objHoge.aaa = "test" ;
objHoge.bbb = "test2";
objHoge.Exec();


ですが、実は自分はあまりこういうふうな実装を
しないです。
自分の場合、ちぃと手間ではあるのですが
コード:
hoge objHoge = new hoge();
objHoge.set_aaa("test") ;
objHoge.set_bbb("test2");
objHoge.Exec();


とやるです。
ちなみにデータ取得はget_XXですね。
微妙な差異ではあるのですが、データは常に
「メソッドを経由して」ってのが一つ目のポイント
でし。



リンク先を見て解りましたが、C#の上の構文を直接アクセスしているような感じに受け取ってしまったのでは無いですか?

スレ主はプロパティについて話されているので、多分、

コード:
public class hoge
{
    private string _aaa;
    private string _bbb;
    public string aaa
    {
        get
        {
             return _aaa;
        }
        set
        {
            _aaa = value;
        }
    }
    //_bbbも同様に
}



という実装を想定されているのだと思います。
というわけで、プロパティが構文に無い言語でいうgetter/setterと一緒です。

以下の文章については同意見です。

引用:

引数にするかアクセサにするかについては、個人的には
ほげたさんとほぼ同意見で、
引用:


aaa, bbb がオブジェクトの状態(保持すべきデータ)ではなく、
単にメソッドで必要となるデータでしかないのであれば




引数でよいと思うです。
ただ、引数が複数あると順番を間違えることがあるので、
数が多いときはアクセサ作っちゃうこともありますが(笑

で、たとえ「1つのメソッドでしか使わない」と
しても「とりあえずクラス自体に紐付いている情報」
なら、アクセッサ経由で扱うようにしています。

こんなところでしょうか?
どうでしょう?

餅宮餅吉
ベテラン
会議室デビュー日: 2005/03/04
投稿数: 57
お住まい・勤務地: 月餅のうまい店の隣
投稿日時: 2005-08-09 12:06
こんにちわ、餅宮です。


また、先ほど書き忘れたのですが、以下に関しては私も同意。
引用:

がるがるさんの書き込み (2005-08-09 11:53) より:

引数にするかアクセサにするかについては、個人的には
ほげたさんとほぼ同意見で、
引用:

aaa, bbb がオブジェクトの状態(保持すべきデータ)ではなく、
単にメソッドで必要となるデータでしかないのであれば


引数でよいと思うです。




#NAL-6295さんと被った部分を削除

[ メッセージ編集済み 編集者: 餅宮餅喜 編集日時 2005-08-09 12:14 ]
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-08-09 12:22
がるです。
引用:

NAL-6295さんの書き込み (2005-08-09 12:01) より:
リンク先を見て解りましたが、C#の上の構文を直接アクセスしているような感じに受け取ってしまったのでは無いですか?


ををすっかり失念(苦笑
そういえば、C#だとそういう実装が出来るですねぇ。
'.'を見た瞬間、ついC++として想定してしまいました(苦笑
ご指摘ありがとうございます。

以上、訂正発言でした m(_ _)m

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