C#でプログラミングを行う際、「変数名や関数名に悩んでしまう」事はありませんか?
クラスとかメソッドの名前てどうすればいいんだろう。。。
こういう経験がある方は命名規則について理解すれば、悩みを解決できるでしょう。
変数名や関数名に限った話ではなく、他にもクラス名やイベント名等様々な場面で命名する機会がありますので、命名規則は抑えておきたいポイントです。
この記事では、C#の命名規則について紹介していますので、ぜひ参考にしてみてください。
命名規則とは
命名規則とは変数やクラスなどに名前を付ける時の決まり事のです。
この決まり事があることで以下のメリットがあります。
命名規則のメリット
- ソースコードの見た目が統一されるので、読み手が読みやすい。
- ソースコードのメンテナンスがしやすくなる。
- 命名で悩まなくなるので、開発効率が向上する。
この3つのメリットの中でも個人的には「命名で悩まなくなるので、開発効率が向上する」が大きなメリットだと感じています。
プログラミングに集中したいのに、「変数名や関数名を命名する度に悩んでしまう」という経験がありました。この悩んだ時間て結構勿体ないですよね。
ですが、変数名や関数名の命名には「規則性がある」という事を知ってからは、名前を付ける度に悩んでた時間から解放されました。
この規則性については、マイクロソフトが C# 向けに出している『名前に関するガイドライン』に記載がありますが、ここでも詳しく紹介をしていきたいと思います。
これから C# を学習する方は命名規則についてぜひ理解しておきましょう。
命名規則の種類
命名規則にはいくつかの種類があります。ここでは代表的な形式を紹介します。
命名規則の種類
- パスカルケース(pascal case)
- キャメルケース(camel case)
- スネークケース(snake case)
- アッパースネークケース(upper snake case)
- ハンガリアン記法(hungarian notation)
C#では主に「パスカルケース」と「キャメルケース」を使用します。
ここで紹介する「スネークケース」と「アッパースネークケース」はC#で使用する事はありませんが、他の言語で使用する事があります。頭の片隅にでも覚えておくといいかもしれません。
パスカルケース(pascal case)
パスカルケースとは全ての単語を大文字から始めて、単語と単語はそのままつなげる記法です。
最初大文字 + 大文字区切り
パスカルケースの例は以下になります。
// パスカルケースの例
UserAccount
UserName
キャメルケース(camel case)
キャメルケースとは先頭が単語は小文字から始めて、単語と単語はそのままつなげる記法です。
最初小文字 + 大文字区切り
キャメルケースの例は以下になります。
// キャメルケースの例
userAccount
userName
スネークケース(snake case)
スネークケースとは全部の単語が小文字で単語と単語をアンダースコア(_)でつなげる記法です。
全小文字 + アンダースコア区切り
スネークケースの例は以下になります。
// アンダーケースの例
user_account
user_name
アッパースネークケース(upper snake case)
アッパースネークケースとは全部の単語が大文字で単語と単語をアンダースコア(_)でつなげる記法です。
全大文字 + アンダースコア区切り
アッパースネークケースの例は以下になります。
// アンダーケースの例
USER_ACCOUNT
USER_NAME
ハンガリアン記法(hungarian notation)
最初の3文字に接頭辞(プレフィックス)を付けて命名する記法です。
接頭辞 + 名前
型やコントロールを3文字に略して接頭辞として付ける事で、変数の型などを推測できるようにして分かりやすくする目的があります。
ハンガリアン記法の例は以下になります。
// ハンガリアン記法の例
strUserAccount
txtUserName
識別子の命名規則
これから「パスカルケース」と「キャメルケース」はどんな場面で適用するのかをこれから説明します。
クラス
クラスは「パスカルケース」を使用します。
通常、そのクラスがどんな役割を表すかが分かる名前を付けます。名前には名詞、名詞句、場合によっては形容詞句を使います。
ちなみに Visual C++ ではクラスである事を示すために、先頭に”C”は付けます。C#ではクラスの先頭に”C”を付けない事が推奨されています。
public class FileOperation
{
// TODO: 何らかの処理
// ...
}
派生クラスの場合は、継承元の基本クラスの名前を含めます。
public class ArgumentException : Exception
{
// TODO: 何らかの処理
// ...
}
インターフェイス
インターフェイスは「パスカルケース」を使用します。
名前には名詞、名詞句、場合によっては形容詞句を使います。
インターフェイスである事が明確になるように名前の先頭に”I”を付けます。
public interface IWorkerQueue
{
// TODO: 何らかの処理
// ...
}
フィールド(メンバ変数)
フィールドは private なら「キャメルケース」を使用し、それ以外は「パスカルケース」を使用します。
外部からフィールドへアクセスする時はプロパティを用意しますので、public や internal は基本的に使用する事はありません。
名前には名詞、名詞句を使います。
// private ならキャメルケース
private int privateField = 0;
// private 以外ならパスカルケース
public int PublicField = 1;
プロパティ
プロパティは private なら「キャメルケース」を使用し、それ以外は「パスカルケース」を使用します。
通常は public にして外部からアクセスできるようにするので、private はあまり使わないです。
プロパティの名前には、名詞、名詞句、または形容詞を使用します。
public int PointX { get; set; }
public int PointY { get; set; }
メソッド
メソッドは「パスカルケース」を使用します。
名前には動詞、動詞句を使います。
どんな処理をするメソッドなのか名前である程度の理解ができるように、名前には適切な情報量を与えます。
メソッドの処理内容を「動詞 + 目的語」の形で命名すると分かりやすくなります。
private void LoadAccount()
{
// TODO: 何らかの処理
// ...
}
インスタンスを生成するメソッドには、”Create”または”New“を使用します。
private void CreateInstance()
{
// TODO: 何らかの処理
// ...
}
論理値を戻り値として返すメソッドには、”Is“や”Can“、”Has“を使用します。
private bool IsChecked()
{
return true;
}
型を変換して戻り値として返すメソッドには、”To“を使用します。
private int ToInt32(string str)
{
return Int32.Parse(str);
}
非同期のメソッドには名前の末尾に”Async”を付けます。
private async Task LoadAccountAsync()
{
// TODO: 何らかの処理
// ...
}
コントロールのフィールド
コントロールのフィールドは 「キャメルケース」を使用します。
コントロール名に限っては、ハンガリアン記法で記述する事が許可されています。※規定ではありません。
lblUserName
txtUserPassword
btnRegister
イベント
メソッドは「パスカルケース」を使用します。
名前には動詞、動詞句を使います。
現在形と過去形を使って前後の概念を考えて命名をします。例えば、ウィンドウを閉じる前に発生させるクローズイベントには”Closing”という名前を付け、ウィンドウを閉じた後に発生させるイベントには”Closed”という名前を付けます。
クラス外のイベントメソッドは「コントロール名 + イベント名」とします。
// クラス外のイベントメソッド
private void BtnCancel_Click(object sender, EventArgs e)
{
// TODO: 何らかの処理
// ...
}
// C#3.0 以降で導入されたらラムダ式を使用した場合
this.Click += (s, e) =>
{
MessageBox.Show("クリックされました");
};
クラス内のイベントメソッドは「“On” + イベント名」とします。
//クラス内のイベントメソッド
public event EventHandler Click;
protected virtual void OnClick(EventArgs e)
{
// TODO: 何らかの処理
// ...
// 関連する外部メソッドに通知
this.Click?.Invoke(this, e);
}
名前の付け方のポイント
名前の付け方1つでソースコードが分かりやすくなったり、分かりづらくなったりします。
個人的には以下の事を意識してみると分かりやすくなるかと思います。
- 名前にある程度の情報量を持たせる。
- ただし、名前はできるだけ「シンプル」にする。
例えば、情報量が少ない変数名が次のような感じです。
private int Price = 100;
これだと「Price」が意味しているのは価格または値段である事は分かりますが、この「Price」が何に使われるのか正確に判断ができません。
商品の単価かもしれませんし、合計の価格かもしれません。
または税抜きの単価かもしれませんし、税込みの単価かもしれません。
こういう事にならないように名前にある程度の情報量を含めてあげると親切です。
// 商品の単価
private int UnitPrice = 100;
// 合計
private int TotalPrice = 100;
// 税抜きの単価の場合
private int TaxExcludedPrice = 100;
// 税込みの単価の場合
private int TaxIncludedPrice = 100;
ただし、あまりに長い変数名を命名してしまうと「長すぎて読みづらい」となってしまい、可読性を低下させる事になるので注意しましょう。
名前を付けてくれるツール「codic」
変数名や関数名の命名に慣れていないうちは、「codic」というツールを使ってみてもいいかもしれません。
このツールのテキストボックスに日本語を入力すると、その日本語から相応しい名前を自動で生成してくれます。
例えば、「税込み価格」と入力すると「TaxIncludedPrice」という名前を生成します。
このツールは複数の命名規則をサポートしており、左上の[Aa]ボタンから切り替える事ができます。
他にも便利な機能として「辞書機能」というものがあります。
自動生成された単語をクリックすると有効な候補の一覧が表示され、[(>)調べる]ボタンをクリックすると単語の意味の違いを表示してくれます。
変数名や関数名に頭を悩ませるプログラマにとっては嬉しいネーミング辞書です。
まとめ
この記事ではC#の命名規則について紹介しました。
C#では主に「パスカルケース」と「キャメルケース」を使用され、以下の用途で使い分けがされます。
- パスカルケースは private 以外の表記で使用されます。
※private 以外とは「public」「protected」「internal」「protected internal」「private protected(C#7.2から追加)」の4つを指します。 - キャメルケースは private の表記で使用されます。
今回紹介した命名規則を参考して、変数名や関数名の命名で悩んでた時間とおさらばしましょう。
以上、最後まで読んで頂きありがとうございました。