質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

556閲覧

カプセル化の命名規則

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2018/02/25 15:24

前提・実現したいこと

カプセル化の命名規則について教えていただきたいです。
また、メンバー変数とはフィールドのことですか?
カプセル化する場合、メンバー変数をカプセル化するのが普通でしょうか?
それともメンバー変数をプロパティにしたほうがよいのでしょうか?

該当のソースコード

メンバー変数をmを使って表したいと思うのですが、
下記のような命名規則はおかしいですか?

C#

1public class Sample : MonoBehaviour { 2 3 int number; 4 public int mNumber{ 5 get{ 6 return number; 7 } 8 } 9 10 void Start () { 11 number = 2; 12 } 13}

上記よりも下記の書き方のほうが正しいですか?

C#

1public class Sample : MonoBehaviour { 2 3 int m_number; 4 public int Number{ 5 get{ 6 return m_number; 7 } 8 } 9 10 void Start () { 11 m_number = 2; 12 } 13}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

質問回答についてはZuishinさんが書かれていることでまかなえていますので、個人的見解と補足をば。
質問の主題は「カプセル化の命名規則」ですが、単純なフィールドであればカプセル化を行なうことは殆どありません。
メンバをそのままプロパティとして公開してしまうことの方が多いです。
すなわち質問者さんが言う**それともメンバー変数をプロパティにしたほうがよいのでしょうか?**のとおりですね。

C#

1//いわゆる普通のプロパティ。publicで読み書き可能 2public int Number { get; set; } 3//値のSETがクラス内でしか出来ないプロパティ。クラスメソッドで処理した結果を公開する場合など。 4public int PrivateSetNumber { get; private set; } 5//コンストラクタと初期化子でのみSET可能なプロパティ。不変属性なメンバに。 6public int ReadOnlyNumber { get; }

Javaから来た人は意識しないでgetHogesetFugaなんてメソッドを準備しますが、C#は言語仕様としてプロパティというものが用意されているため、それを使うのが一般的です。

さらに補足すると、自分でGetterSetter書くのは保持するデータの型とアクセスしたいデータの型が異なる時などですね。
WEB系でよくやるんですが、セッションに保持するためにシリアライズする必要があるけど、アクセスする時はListで扱いたい、とか。

C#

1public List<string> ItemList 2{ 3 get 4 { 5 return JsonConvert.DeserializeObject<List<string>>(Session[nameof(ItemList)]); 6 } 7 set 8 { 9 Session[nameof(ItemList)] = JsonConvert.SerializeObject(value); 10 } 11}

※イメージです。未検証、未ビルド。

投稿2018/02/26 01:43

ShikaTech

総合スコア468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/26 16:05

ご回答ありがとうございます。 少し本題とずれてしまうのですが、 下記2つの違いについてご教授いただけますか? public int PrivateSetNumber { get; private set; } public int ReadOnlyNumber { get; } 検証した所、どちらも、コンストラクタでのセットは可能。 class Test{ //public int PrivateSetNumber { get; private set; } //public int ReadOnlyNumber { get; } public Test(int i){ //PrivateSetNumber = i; //ReadOnlyNumber = i; } } 違いは、メソッドでセットしようとしたとき。 public void method(){ //PrivateSetNumber = 3; //コンパイル通る。 //ReadOnlyNumber = 3; //エラーになる。メソッド内ではセットできない。 } ReadOnlyNumberの方は、メソッド内で値をセットできなくて、 2つの主な違いは、このメソッド内で値をセットできるかどうかの違いという認識で大丈夫でしょうか? また、ReadOnlyNumberは、初期化子でもセット可能とのことなのですが、 初期化子とは、下記のような書き方のことですか? public int ReadOnlyNumber { get; } = 3;
ShikaTech

2018/02/27 01:21 編集

✕:ご教授 ◯:ご教示 tkmnusrさんのご認識のとおりです。 >このメソッド内で値をセットできるかどうかの違いという認識で大丈夫でしょうか? >public int ReadOnlyNumber { get; } = 3; 同じようなことやるにも書きっぷりが違うので、そのあたりはプロジェクト内で統一されていれば良いと思います。 (初期化子付きGetOnlyのプロパティを用意するか、単純にpublic constメンバとするか、など)
退会済みユーザー

退会済みユーザー

2018/02/27 15:58

ご回答ありがとうございます。 日本語のご教示もありがとうございます。勉強になりました。 プロパティについて理解することができました。ありがとうございます。
guest

0

ベストアンサー

メンバー変数はフィールドのことです。
パブリックメンバーはパスカル式での命名が推奨されています。最初の例はキャメル式なので不適当です。

Capitalization Conventions

Do use Pascal casing for all public member, type, and namespace names consisting of multiple words.

インスタンスフィールドについてはプライベートであることが推奨されています。
その場合この命名規則は適用されません。

Note that this rule does not apply to instance fields. For reasons that are detailed in the Member Design Guidelines, you should not use public instance fields.

パブリックメンバーについては他者も読む必要があるので命名規範が定められていますが、プライベートメンバーについての命名規範は私の知る限りありません。
それぞれのベンダーの定める規約に従うか独自に規約を作ればいいと思います。

投稿2018/02/25 23:59

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/26 15:34

ご回答ありがとうございます。 プライベートメンバーは特に決まりがないのですね。 以前にどこかで、メンバ変数を意味するmの文字を使ったフィールド(もしくはプロパティ)のコードを見かけたのですが、下記のように、パブリックメンバ(プロパティ)にMを付けるのって変ですか? int number; public int MNumber{ get{ return number; } } mを付けるとしたら、下記のようにプライベートフィールドに付けたほうがよいですか? (と言っても、プライベートフィールドは自由とのことなので意味ないかもしれませんが。) int m_number; public int Number{ get{ return m_number; } } 上記両方とも、パスカル式を満たしているはずなので、そもそもそんなに気にすることではないですか? メンバ変数のmを使った書き方が気になったので、何か慣習などがあれば教えていただきたいと思い、質問させていただきました。
Zuishin

2018/02/26 15:55

単純に M をつける意味はないと思います。そういう慣習もどこかであるのかもしれませんが私は聞いたことがありません。
退会済みユーザー

退会済みユーザー

2018/02/26 16:10

ご回答ありがとうございます。 なるほど、では大文字、小文字の違いだけにはなってしまいますが、 int number; public int Number{ get{ return number; } } このような書き方をしてもおかしくないという認識で大丈夫でしょうか?(コンパイルは通りました。)
Zuishin

2018/02/26 22:34

おかしくありません。これはよく見ます。m をつけても大丈夫ですが、そういう慣習を「私は」知らないというだけです。 あとメンバーと言うとメソッドもプロパティもフィールドも全てメンバーなので、フィールドのみ特別にメンバーと命名する意味がよくわからないというのもあります。
退会済みユーザー

退会済みユーザー

2018/02/27 14:55

ご回答ありがとうございます。 なるほど、プロパティもメンバなので、そもそもmを付けることによって区別しようとすること自体変でしたね。全然一般的な慣習ではなさそうなことがわかりました、ありがとうございます。 すみません、あと1点だけ質問させていただけますか? UnityのC#は、純粋なC#と少し異なるみたいで、下記のような命名規則らしいのですが、 プロパティは「変数の命名規則」に従うべきか、「関数の命名規則」に従うべきか、どちらでしょうか? (プロパティは外から見ると変数のようで、中から見ると関数のようなので。) http://unitygeek.hatenablog.com/entry/2012/08/15/135612
Zuishin

2018/02/27 15:06

Unity のクラスは「C# のクラス」ではなく「C# でも使えるクラス」です。 複数の言語で使える中の一つとして C# があるだけなので命名規則は独自のものとなります。 同様に用語も C# の用語ではなく Unity の用語で読まなければなりません。 Unity はプロパティを変数と呼んでいるようです。 リファレンスをご覧ください。 https://docs.unity3d.com/jp/540/ScriptReference/ 標準ライブラリのクラスのプロパティはキャメルで書かれていますので、それに従うのが良いのではないでしょうか。
退会済みユーザー

退会済みユーザー

2018/02/27 15:56

ご回答ありがとうございます。 わからなかった所が全てわかりました。ありがとうございます。 Unityのプロパティはキャメルとのことなので、下記のような書き方にしようと思いました。 int _number; public int number{ get{ return _number; } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問