C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない


(過去ログ 63 を表示中)

[トピック内 26 記事 (1 - 20 表示)]  << 0 | 1 >>

■36554 / inTopicNo.1)  [C#] プロパティの中にメンバ変数を置けたっていいじゃない
  
□投稿者/ biac (115回)-(2009/06/01(Mon) 14:43:54)
biac さんの Web サイト

分類:[雑談] 

public string Foo
{
  private string _foo;
  get { return _foo; }
  set {
    if (value == null)
        return;

    _foo = value;
  }
}

こんな風に書けてもいいんじゃね、 と思ったんだけど、 VS2008 には怒られた f(^^;

なんでか、 っていうと。
プロパティの setter に安全弁を用意してあるのに、 コードをいじったやつが、 クラス内で
直接 _foo に値を叩き込むようにしてくれちゃって、 お約束通りにバグってくれたので。 (w
# いや、 笑えない f(^^;

プロパティの値を保持している変数には、 同じクラス内からであってもアクセスしてほしくない
ってことがあると思うんだけど。
みなさま、 そんなときどうされてますか?

引用返信 編集キー/
■36564 / inTopicNo.2)  Re[1]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ Jitta on the way (325回)-(2009/06/01(Mon) 19:06:15)
No36554 (biac さん) に返信
///<summary>直接イジルな!</summary>
> private string _foo;
> public string Foo
> {
> get { return _foo; }
> set {
> if (value == null)
> return;
>
> _foo = value;
> }
> }

引用返信 編集キー/
■36568 / inTopicNo.3)  Re[2]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ biac (116回)-(2009/06/01(Mon) 20:07:13)
biac さんの Web サイト
> ///<summary>直接イジルな!</summary>

ゎはは〜w
うん。 そんなことを書いたりするよねぇ f(^^;

ほんとは <remarks> に書くべきなのかな?
でも、 <remarks> はインテリセンスに出ないし。
引用返信 編集キー/
■36570 / inTopicNo.4)  Re[1]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ aetos (148回)-(2009/06/01(Mon) 23:24:28)
aetos さんの Web サイト
No36554 (biac さん) に返信
> public string Foo
> {
> private string _foo;
> get { return _foo; }
> set {
> if (value == null)
> return;
>
> _foo = value;
> }
> }

個人的にこれは、もし可能ならプロパティ内ローカル変数なので、get または set アクセッサを抜けたら値を保持しないものに見えます。

> プロパティの setter に安全弁を用意してあるのに、 コードをいじったやつが、 クラス内で
> 直接 _foo に値を叩き込むようにしてくれちゃって、 お約束通りにバグってくれたので。 (w

クラスの中からは当然のように _foo に直接叩き込むものだと思ってます。
引用返信 編集キー/
■36572 / inTopicNo.5)  Re[2]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ 倉田 有大 (618回)-(2009/06/02(Tue) 08:14:34)
>プロパティの setter に安全弁を用意してあるのに、 コードをいじったやつが、 クラス内で
>直接 _foo に値を叩き込むようにしてくれちゃって、 お約束通りにバグってくれたので。 (w

まあ、クラスのコードを直接たたかれたら、どうしようもないですね^^;
もうDLLを渡すしかないw

>クラスの中からは当然のように _foo に直接叩き込むものだと思ってます。

これどうなんでしょうね。
僕はプロパティーを叩くか_fooを叩くか悩むときがあります。
プロパティーに、値を放り込むだけじゃなく他の必要な処理をしていれば、もちろんプロパティーを叩きます。

プロパティーが何を実装しているかに寄るのかな? 速度考えると_foo直接叩く方がそらはやいでしょうね。
引用返信 編集キー/
■36577 / inTopicNo.6)  Re[1]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ たくボン (168回)-(2009/06/02(Tue) 10:19:53)
No36554 (biac さん) に返信
> みなさま、 そんなときどうされてますか?

躾する。それでも直らないならそいつを外す。

って、昔はできたんだけどねぇ。今の状況じゃ猫の手も借りたいくらいだから使えないPGでも使っていくしかないんだよね。
だから、なるべく基礎のうちから厳しく言う。


引用返信 編集キー/
■36579 / inTopicNo.7)  Re[1]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ επιστημη (1948回)-(2009/06/02(Tue) 10:30:59)
επιστημη さんの Web サイト
> そんなときどうされてますか?

可能な限り interface のみを公開。

引用返信 編集キー/
■36585 / inTopicNo.8)  Re[2]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ みきぬ (451回)-(2009/06/02(Tue) 10:57:29)
>>そんなときどうされてますか?
> 
> 可能な限り interface のみを公開。
> 

というわけで試しに考えてみたけど、かっちょよくないぃ。

    static class Program
    {
        static void Main()
        {
            NullDenyString bar = new NullDenyString();
            bar.Value = "bar";
            bar.Value = null;

            Console.WriteLine(bar);
        }
    }

    // NullでないString
    public class NullDenyString
    {
        private string _foo = string.Empty;

        public string Value
        {
            get
            {
                return _foo;
            }
            set
            {
                if (value == null)
                    return;

                _foo = value;
            }
        }

        public override string ToString()
        {
            return _foo;
        }
    }

引用返信 編集キー/
■36588 / inTopicNo.9)  Re[3]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ たくボン (169回)-(2009/06/02(Tue) 11:20:04)
No36585 (みきぬ さん) に返信
> >>そんなときどうされてますか?
>>
>>可能な限り interface のみを公開。
>>
>
> というわけで試しに考えてみたけど、かっちょよくないぃ。

うん、こういうクラスは俺も一回考えたけど、あまり実務レベルではなかったなぁ。
それよりチーム全体のスキルを上げた方が良いかも。

ArgumentNullExceptionなんかの例外は、try〜catchを適切に使って単体テストすれば発見できると思うし、こんな場合のNUnitだと思う。

引用返信 編集キー/
■36589 / inTopicNo.10)  Re[3]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ よねKEN (338回)-(2009/06/02(Tue) 11:21:04)
#冗談ですw

private string _fooに直接代入するな_プロパティ経由でセットしてね;
public string Foo
{
get { return _fooに直接代入するな_プロパティ経由でセットしてね; }
set {
if (value == null)
return;

_fooに直接代入するな_プロパティ経由でセットしてね = value;
}
}

引用返信 編集キー/
■36592 / inTopicNo.11)  Re[4]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ 774RR (360回)-(2009/06/02(Tue) 11:49:02)
変数名にそういうのをつけるのは却下だけど
javadoc コメントにそういうの入れるのはありだと思う

/// @warning 常にセッター経由でセットしろ
/// @warning 直接代入したらいてまうぞ、われー

引用返信 編集キー/
■36595 / inTopicNo.12)  Re[1]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ GSB (1回)-(2009/06/02(Tue) 12:05:29)
No36554 (biac さん) に返信
> プロパティの値を保持している変数には、 同じクラス内からであってもアクセスしてほしくない
> ってことがあると思うんだけど。
> みなさま、 そんなときどうされてますか?
対象のメンバ変数を親クラスのPrivateメンバに移動させて、子クラスからはプロパティ経由でしかアクセスできないようにしてしまう。とかはどうでしょう?
共通認識として展開して、各自に遵守してもらうっていうのが手間はかからないですけど、絶対にされたくないのであれば、
できなくしてしまうのが一番確実かなあと思います。
親クラスを後付けするようなことになる場合は、色々影響が出る場合があるので、可能であればという前提になりますけど。
引用返信 編集キー/
■36598 / inTopicNo.13)  Re[2]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ たくボン (170回)-(2009/06/02(Tue) 12:32:50)
No36595 (GSB さん) に返信
> ■No36554 (biac さん) に返信
> 対象のメンバ変数を親クラスのPrivateメンバに移動させて、子クラスからはプロパティ経由でしかアクセスできないようにしてしまう。とかはどうでしょう?
> 共通認識として展開して、各自に遵守してもらうっていうのが手間はかからないですけど、絶対にされたくないのであれば、
> できなくしてしまうのが一番確実かなあと思います。

確かに規模が大きくて、開発者のスキルもバラバラなら上記のような事も検討しないとダメかもしれないけど、俺的にはあまり意味のないクラスを基底クラスにするのはどうかなと思ったりしてしまう。

仕様にあまり関らない部分で、開発者レベルで対応できる部分は逆にテストで潰してしまうのが無難かも。俺はプロパティのメンバ変数にはプレフィックスとか付ける派だから、それでgrepかけるとか、面倒だったらソース解析するツール作っておいてソース変更時にチェックかける。

後々、「このクラスって何のためにあるの???」とか同業者に言われないためにも(笑)
引用返信 編集キー/
■36602 / inTopicNo.14)  Re[2]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ biac (117回)-(2009/06/02(Tue) 14:12:39)
biac さんの Web サイト
> 個人的にこれは、もし可能ならプロパティ内ローカル変数なので、get または set アクセッサを抜けたら値を保持しないものに見えます。

が〜ん……
や、 たしかにそうかも f(^^;

じゃ、 クラス直下に中カッコ↓とかは? f(^^;;;

{
 private string _foo;
 public string Foo
 {
  get { return _foo; }
  set {
   if (value == null)
    return;

   _foo = value;
  }
 }
}

※ ここでは、 public なプロパティのすぐ上とかに private メンバーを書いてるけど。 「メンバ変数はクラスの最初にまとめて書くこと」 ( 同類に、 「ローカル変数は関数の最初に…」 とかアリ ) なんてコーディングルールがあったりすると、 _foo と Foo が生き別れてしまい、 _foo への直接アクセスが増々助長される …な〜んて思ったりするのは、 被害妄想かしら? f(^^;
引用返信 編集キー/
■36603 / inTopicNo.15)  Re[3]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ aetos (149回)-(2009/06/02(Tue) 14:24:08)
No36602 (biac さん) に返信
> じゃ、 クラス直下に中カッコ↓とかは? f(^^;;;

別の言語になっちゃうのを覚悟すれば、もうちょっとリッチでもいい気がする。
アクセス修飾子を汎用化させて、「このメソッド/プロパティからのみアクセス可能な変数」って明記できるとか。C++ の friend みたいな。
_foo に直接アクセスするかどうかとは別の問題として、1つのクラス内にあるからって、すべてのメソッド/プロパティが全てのメンバ変数にアクセスするわけじゃないんだし。
まぁ、あんまりにも孤立変数が多いのはよくない設計でしょうけど。

> 被害妄想かしら? f(^^;

そうでもないorz
引用返信 編集キー/
■36606 / inTopicNo.16)  Re[5]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ biac (118回)-(2009/06/02(Tue) 15:33:55)
biac さんの Web サイト
> private string _fooに直接代入するな_プロパティ経由でセットしてね;

> 変数名にそういうのをつけるのは却下だけど
> javadoc コメントにそういうの入れるのはありだと思う
>
> /// @warning 常にセッター経由でセットしろ

日本語でキツイことが書いてあって、しかも長〜い変数名なら、やたら目立つので 「抑止力」 としてはかなりのものがあるんじゃないかと。
コードを見たエライ人が文句を言わないようなプロジェクトなら、 一考の価値はあるかも f(^^;

javadoc コメントのほう、 @warning ってのはインテリセンスみたいな形で表示されるのかしら?
Visual Studio だと、 コード中で "this." まで打ったところで ( あるいは、 何も無いところで Ctrl + Space で ) メンバーの一覧がペロっと出てきて、 そこからクラスメンバーを選択できます。 ( そのとき、 コメントの <summary> は表示されるんですけどね。 )

で、 インテリセンスが出したリストを上から見ていって、 「…_foo、 あ、 コレだコレだ」 とか言って使われちゃう ( …のかな? )
とするならば、 property Foo の値を格納するメンバ変数は、 '_' で始めるんじゃなくて、 FooValue みたいにすれば、 Foo よりもリストの下に来るから、 ひょっとすると使われてしまう確率は下がるかな。
引用返信 編集キー/
■36614 / inTopicNo.17)  Re[3]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ ぱぱいやん (34回)-(2009/06/02(Tue) 16:33:28)
ぱぱいやん さんの Web サイト
僕としては、セッター経由必須の場合で、直接アクセスして欲しくないフィールド変数には、属性を付けてコンパイラ側でチェックしてくれれば良い気がします。

引用返信 編集キー/
■36616 / inTopicNo.18)  Re[4]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ みきぬ (453回)-(2009/06/02(Tue) 16:41:15)
> 僕としては、セッター経由必須の場合で、直接アクセスして欲しくないフィールド変数には、属性を付けてコンパイラ側でチェックしてくれれば良い気がします。
>
そういえば、ObsoleteAttribute みたいなものを自分で作りたいと思って挫折した記憶がほのかに。
引用返信 編集キー/
■36620 / inTopicNo.19)  Re[4]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
□投稿者/ 倉田 有大 (620回)-(2009/06/02(Tue) 17:06:20)
> private string _fooに直接代入するな_プロパティ経由でセットしてね;

これはネタとして評価されるべき。

しかし!プログラマーを甘く見てはいけない。
疲れてる俺なんて、読まずにコピペするかもしれない!
さらにもっと疲れている場合は「えー?大丈夫だろーためしに・・おーうごいたうごいたOKOK」
ひ、ひどい!

引用返信 編集キー/
■36621 / inTopicNo.20)  Re[4]: [C#] プロパティの中にメンバ変数を置けたっていいじゃない
 
□投稿者/ biac (119回)-(2009/06/02(Tue) 17:15:29)
biac さんの Web サイト
> 僕としては、セッター経由必須の場合で、直接アクセスして欲しくないフィールド変数には、属性を付けてコンパイラ側でチェックしてくれれば良い気がします。

ぉお! その手があったか。
コンパイラをいぢるのは大変過ぎとしても。 コード分析の追加ルールとして作るんだったら、 可能なんじゃないかという気が f(^^;
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -