それでは名前付けの実演をしていきたいと思います。
プロジェクトの作成
VisualStudioを起動しましょう。私はVisualStudio2019を使用します。「VisualStudio2017」や「VisualStudio2015」でも問題なく動作します。それ以前のバージョンは,本書の後半に出てくるスタイルコップアナライザーが動作しない可能性があるのでお勧めできません。Webで無料取得できるのでできるだけVisualStudio2019を取得してください。(2019年8月現在)※ちなみに2019より新しいバージョンが出ている場合はそれでも問題なく動作すると思います。
まずは「新しいプロジェクトの作成」を選択します。
次に「Windowsフォームアプリケーション」を選択して「次へ」進みます。
「ソリューション名」と「プロジェクト名」を付ける画面になります。
「ソリューション名」と「プロジェクト名」は「名前空間」に関わってくるので,「パスカル」で命名する必要があります。つまり頭文字を大文字で命名します。
ソリューション名
ソリューション名は通常「アプリケーション名」を付けます。アプリケーションそのものを示す名前です。何かの製品に組み込むアプリケーションならその製品名が「ソリューション名」となります。アプリケーションが「テトリス」というソフトならそのまま「TETRIS」という名前にします。ちなみにアプリケーション名は固有名詞なので,製品名称上,すべて大文字の場合は特例として「TETRIS」という命名でもOKです。例えば会社名とかでも「docomo」や「NTT」のように,標記上大文字や小文字に意味がある場合はそのままそれに従ってOKという事です。ですので,アプリケーション名や製品名そのままの名前で付けましょう。製品名が「吉野家」のように日本語の場合は「Yoshinoya」としても「YOSHINOYA」としてもどちらでもよいでしょう。チームや会社でしっくりくるほうを選べばOKです。
今回は「MX99」という製品があると仮定して,「MX99」というソリューション名を付けておきます。
プロジェクト名
「プロジェクト名」は「ソリューション名」の後に「.」ドットを付けて,プロジェクトの用途を示す名前を付けます。例えばユーザーインタフェース層のプロジェクトを作成するのであれば「MX99.WinForm」などとします。プロジェクト名はチームで話し合って決定すればOKですが,プロジェクトを複数に分ける場合は,どういった意図でプロジェクトが分かれているのかがわからないと,他のメンバーが混乱してしまうので,必ず用途を示す名前を付けましょう。「MX99.WinForm」,「MX99.WPF」「MX99.Domain」などと命名します。
「場所」には任意の保存先を指定してください。
ここまで入力したら「作成」ボタンを押下します。
Form1.csのコードを表示
プロジェクトが作成されるとデフォルトで「Form1.cs」というフォーム画面が作成されます。今回はこのフォーム画面のコードを見ながら解説していきます。「Form1.cs」を選択して「F7」キーを押下するか,右クリックでコードの表示を選択して,「Form1.cs」のコードを表示してください。
こんな感じで表示されると思います。
解説する項目
これから次の項目に関して具体的に解説していきます。
- 名前空間
- 型
- Interface
- メソッド
- プロパティ
- イベント
- フィールド
- 列挙値
- パラメータ
名前空間
名前空間は「パスカル」で記述します。
ソースコードの「namespace」の後に記述されている部分がそれにあたります。
ソリューション名とプロジェクト名を命名するときに,ここはパスカルで命名するように気を付けているため,自動的にパスカルで表示されています。
ここはデフォルトでプロジェクト名が出ているのですが,プロジェクト名の前に会社名等を付けたものを名前空間にする場合は,「Properties」の「アプリケーション」の中にある「既定の名前空間」を変更しておくと,次回より新規作成するファイルの名前空間はすべて,変更した名前空間で作成されます。
すでに作成されている「Form1.cs」や「Program.cs」ファイルの名前空間まで自動で変更されるわけではないので,すでに存在しているファイルは手動で変更する必要があることに注意してください。
型
「型」というのは「クラス」等の事です。
クラスは「プロジェクト」を右クリックして「追加」の中にある「クラス」を選択して追加します。
「クラス」はパスカルで記述するため「商品エンティティ」等のクラスを作る場合は「ProductEntity」といった感じの命名になります。
namespace MX99.WinForm { class ProductEntity { } }
Interface
インタフェースを命名する場合は前述した通り,頭にインタフェースを示す「I」を付けて,その後にパスカルで名前を付けるという方法になります。「メンバー」という名前のインタフェースを付ける場合は「IMember」という書き方になります。
namespace MX99.WinForm { public interface IMember { } }
メソッド
メソッドもパスカルで命名します。データを取得するメソッドであれば「GetData」などと命名します。この場合「get data」という2つの単語に分かれるため,それぞれの単語の頭文字は大文字になります。
private int GetData() { return 0; }
プロパティ
プロパティもパスカルになるため「商品ID」の場合は「ProductId」となります。
public int ProductId { get; set; }
イベント
イベントもパスカルです。一文字目を大文字して命名します。「商品ID変更イベント」という名前ならこんな感じで命名します。「ProductIdChanged」。
public event Action ProductIdChanged;
フィールド
フィールドの命名はprivateな物とpublicな物で命名の方法が変わります。といってもフィールドは基本的にはprivateな物になると思います。Publicで公開する場合は基本的にはプロパティで公開するのがセオリーですから。
privateなフィールドを記述する場合は「キャメル」で命名してください。この解説始まって以来のキャメルです。ようやく出てきました。クラスを作成して,privateな変数というものを結構な確率で作成すると思いますが,そのprivateな変数はキャメルで命名してください。マイクロソフトの中でもこのprivateフィールドにはアンダーバーを付けるチームがあります。そのほうがメソッド内の変数とクラス内の変数とが一目瞭然になるからです。私もこのアンダーバーを付けるルールを気に入って使っています。チームで話し合って検討してください。私はお勧めです。
private string _userName;
Privateな物でも「const」の場合はパスカルになります。Constとは固定値の事ですね。その場合は次のようにパスカルで付けましょう。昔は全部大文字にしてアンダーバーで区切るというやり方がありました。マイクロソフトのガイドラインを確認するとそういった記載はなくパスカルとなっています。チームで話し合って「USERID_NUMBER」としたい場合はそうしてもさほど問題ではない気がしますが,マイクロソフトのガイドラインに従うという事で統一しておいたほうが,今後新人や新メンバーが外部から参入したときの教育の手間を考えたら,パスカルで統一の方がいいように思います。
private const int UserIDNumber = 1;
最後に,publicな変数はパスカルになります。
public int UserId:
これは前述した通り,publicな変数はプロパティで公開するのがセオリーな為,あまりこういったケースはないと思います。という事で,privateな変数は「キャメル」,コンスト値は「パスカル」と覚えておきましょう。
列挙値
列挙体は「パスカル」になります。「商品モード」という名前の場合は「ProductMode」といった感じになります。列挙体のなかで宣言する「Normal」「Level1」のような各区分に当たるものもすべて「パスカル」で命名します。
private enum ProductMode { Normal, Level1, }
パラメータ
パラメータは「キャメル」になります。パラメータとはメソッドの引数の事ですね。
public void SetData(int userId, string userName) { }
このような感じで引数は「userId」「userName」といった感じでキャメルにします。
まとめ
まとめると,キャメルの物は,privateなフィールド(変数)と変数の引数のみという事になります。あとの物はすべてパスカルです。判断基準は内部で使うものはキャメル,外部に公開されているものはパスカルという感じになります。とは言え内部でしか使わない列挙体やコンストもパスカルなので,一概には言えませんが,だいたいそのようなイメージでよいと思います。というわけで名前空間からパラメータまでの解説でした。
using System; using System.Windows.Forms; namespace MX99.WinForm { public partial class Form1 : Form { //フィールド private string _userName; //コンストはパスカル private const int UserIDNumber = 1; public Form1() { InitializeComponent(); } //列挙値 private enum ProductMode { Normal, Level1, } //プロパティ public int ProductId { get; set; } //イベント public event Action ProductIdChanged; //メソッド private int GetData() { return 0; } //パラメータ public void SetData(int userId, string userName) { } } }
#02_名前の付け方
#03_名前付けのガイドライン
#04_パスカルケースとキャメルケース
#05_パスカルとキャメルの内訳
#06_パスカルとキャメルの実演
#07_2文字の略語は大文字にする
#08_名前空間のガイドライン
#09_ローカルルールについて
#10_private変数にアンダーバーを付ける
#11_コントロールの名付け
#12_クラス名とファイル名の名づけ
#13_StyleCopAnalyzersについて
#14_StyleCopAnalyzersのインストール
#15_ネームスペースの調整
#16_SA0001_プロパティのビルドのXMLでファイルを指定しておくと消える
#17_CS1591_XMLコメントなし
#18_SA1101_thisが付いていない
#19_不要なルールを非表示にする方法
#20_SA1200_usingの場所
#21_SA1400_アクセス修飾子が明示的に定義されていない
#22_その他不要なルールを非表示
#23_コンストラクタとデストラクタを作成
#24_Private変数とパラメータ変数の命名
#25_中括弧の省略禁止と改行
#26_コメントはスラッシュ4つ
#27_プロパティのXMLコメント
#28_コンストラクタやプロパティの書く順番
#29_アクセスレベルを加味した書く順番
#30_インタフェースのIとファイル名の不一致
#31_最後に