お世話になります。
C#のコードの書き方について質問です。
以下のような、privateフィールドと、単純なアクセサが設定されたコードがあり、
C#
1private bool flag = false; 2public bool GetFlag(){ return flag; } 3public void SetFlag(bool value){ flag = value; }
同クラス内では flag = true のような直接代入、
他クラスでは SetFlag(true) のようなアクセサで代入となっていました。
個人的にはアクセサに統一したほうが、メンテナンスしやすいと考えるのですが、このように分けて書く理由を教えたいただければ幸いです。
私としては、処理が早くなるくらいしか思いつかず。。。
どうぞよろしくお願いいたします。
【補足】
C++からの移植コードのため、プロパティとして定義されていません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
ベストアンサー
こんにちは。
個人的にはアクセサに統一したほうが、メンテナンスしやすいと考えるのですが、このように分けて書く理由を教えたいただければ幸いです。
元々アクセサは、直接フィールドを設定する前や参照後に何か処理を割り込ませるために用意された仕組みです。
その処理を割り込ませたくない時には直接アクセスすることになります。
割り込ませる処理がない時でも、将来的な拡張に備えて外部I/Fについてはアクセサ経由することは多いです。
しかし、具体的にどんな処理を入れるのか見えていない時、内部アクセスをどうするべきか悩ましいです。
内部アクセスは後から変更することは容易ですし、アクセサにブレークを張ってデバッグする手法もありますから、内部からのアクセスでもアクセサ経由しておくのもありと感じます。
逆に速度を取るとか、ムダに複雑な動作をさせない等の理由で内部からはアクセサ経由しないのもありと思います。
正解はないので、あまり深く考えてても仕方がない部分かも知れません。
投稿2016/09/28 01:54
編集2016/09/28 01:56総合スコア23272
0
移植した際にはプロパティがC#に実装されていなかったとか、Get~やSet~を使っているところの修正が大変だったとかそういった推測ができます
そこそこ新しいVisualStudioなら関数名を右クリックですべての参照を検索(だったかな?)を使うと呼び出している箇所が一気に表示されますのでちまちま置き換えるというのも可能かと思います
(その機能がなかったころの移植だと置換でやれば違うクラスの同じメンバ関数まで書き換えちゃうかもしれないので怖いという可能性があったのかと思います)
ちなみにC#のプロパティですが、内部的にはGet_プロパティ名(value)という感じで関数を作っているだけらしいので、プロパティ化しても何ら問題ないとは思われます
ちなみに強引な手段としては、Get~関数をコメントアウトして赤い波線(ビルド/コンパイルエラー)を出してIDEのエラー一覧からプロパティへ買い換えるという手もあります
投稿2016/10/01 05:56
総合スコア1337
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/03 11:06
0
引用テキストC++からの移植コードのため、プロパティとして定義されていません。
C++ の頃の名残りではないでしょうか。
もともと当該クラスでのみ使用するつもりだったんじゃないでしょうか?
なので、private で宣言。
後々、他からもアクセス可能なように public のアクセサを追加した。
投稿2016/09/28 08:04
総合スコア12
0
他の方が書かれているように、現在の C# では、自動プロパティが使えるので、単純なケースではメンバ変数はそもそも存在せずクラス内からでもプロパティを使いますね。
質問のコードのようなケースの「クラス内からは変数を直接使用する」ことに、強い意味はないと思います。
理由は上記のように、そもそもそれは自動プロパティに置き換えられる(けどしてない)ので。
弱い意味なら、心情的な「クラス内なのにプロパティを経由するのはなんかムダな気がする」程度のことかと思います。
自動プロパティが使えずメンバ変数が存在しているという事は、そのプロパティの setter/getter に何らかの副作用がある(あまりよい例ではないですが、例えばプロパティ経由でset/getするとログファイルに履歴が残る、とか)ので、副作用を起こさないようにメンバ変数を直接使う、ということはあると思います。
投稿2016/09/28 04:12
総合スコア1075
0
外のクラスに生のメンバ変数(フィールド)を公開しないというのは、一般に浸透しているイディオムですが、中で直接触るかどうかは企業の文化というか、それぞれのやりかたがあると思いますよ。
個人的な意見としては、
逆に中でも絶対にアクセサを使わないといけない規則だといろいろ面倒かなとは思います。
(メンバをそのままget;set;するだけのアクセサなら別に問題ないですが)
かと言って、特別な意味もなくメンバとアクセサを混同して使っているコードもちょっと嫌ですが。
投稿2016/09/28 01:42
編集2016/09/28 01:48総合スコア1294
0
単純に C# コンパイラが、古い時のコードじゃないですかね。
C#6以降だと、 public bool Flag { get; set; } = false; みたいに初期化もできますしね。
前は、アクセサもそのように書いてました。懐かしいです。
投稿2016/09/27 15:28
総合スコア1046
0
私は、プロパティを使います。
C#
1public class Something(){ 2 public bool Flag{ 3 get; 4 private set; 5 } 6}
Flagはクラス内からしかセットできません。
統一感もあり、メンテしやすいです。アクセサ経由でないと触れない点も良いと思います。
プロパティの内部で例外を投げて、スタックとレースとるとわかりますが実行時はgetter,setterとして動作するようです。
投稿2016/09/27 12:35
総合スコア2883
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/28 13:09