• 追加された行はこの色です。
  • 削除された行はこの色です。
#title(.NETプログラミング研究 第3号)

#navi(.NETプログラミング研究)

#contents

*.NETプログラミング研究 第3号 [#xc1a81fb]

**ピンポイントリンク [#h211da62]

***.NETの命名規則 [#a192b656]

#column(注意){{
この記事の最新版は「[[.NETの命名規則>http://dobon.net/vb/dotnet/beginner/namingrules.html]]」で公開しています。
この記事の最新版は「[[.NETの命名規則>https://dobon.net/vb/dotnet/beginner/namingrules.html]]」で公開しています。
}}

「変数などの識別子にどのような名前をつけるか」という問題は、入門書等にあまり載ってないにもかかわらず、コーディングでは避けては通ることのできない問題です。どのような名前をつけるべきかという「命名規則」を会社から指定されているなどといった場合以外は、それは最低限のルールさえ守れば個人の自由のはずであり、どのような名前をつけようが作成するアプリケーションの動作に直接影響を与えるものではないのでどうでもいいという考え方もあるでしょう。しかし一般的な命名規則があるのならそれを覚えておけば、他の人が見たときに分かりやすいコードを書くことができますし、また見やすいコードは自分自身のためにもなります。

.NETの命名規則に関してヘルプでは「クラスライブラリ開発者向けのデザインガイドライン」内の「[[名前付けのガイドライン>http://www.microsoft.com/japan/msdn/library/ja/cpgenref/html/cpconnamingguidelines.asp]]」の項目に詳しく書かれています。

さらに、「[[コーディング技法>http://www.microsoft.com/japan/msdn/library/ja/vsent7/html/vxconcodingtechniques.asp]]」や「[[Visual Basic の名前付け規則>http://www.microsoft.com/japan/msdn/library/ja/vbcn7/html/vaconVBNamingRules.asp]]」のページも参考になります。

またオフィシャルではありませんが、中西庸文さんが「[[VB.NET コーディング標準>http://objectclub.esm.co.jp/eXtremeProgramming/CodingStdVB.pdf]]」を、河端善博さんが「[[C#コーディング標準>http://www.kawabata.com/dotnet/CodingStdCS.pdf]]」を公開されています。両者は平鍋健児さんの「Javaコーディング標準(オブジェクト倶楽部バージョン)」を参考にして作られたものとのことですが、前に紹介したヘルプの内容をまとめ且つ補充されたような内容になっており、かなり参考になります。「[[eXtreme Programming FAQ>http://objectclub.esm.co.jp/eXtremeProgramming/]]」から入手できます。

これらをすべて読んでいただければ.NETの命名規則について分かっていただけると思いますが、それはかなり苦痛かもしれません(個人的には命令口調のところに抵抗があります)。そこで結局のところこれらが何を言っているのか、私なりにこれ以上はないという程簡単にまとめさせていただきます。

まず大雑把に言って、クラス、メソッド、プロパティ、フィールド等の要素には、「単語で構成された、誰でも分かるような名前をつける」ということが基本となります。

さらに、Public以外の変数(パラメータを含む)にはCamel形式(識別子の最初の文字は小文字にし、後に続いて連結されている各単語の最初の文字を大文字にした形式。例:backColor)、それ以外はすべてPascal形式(識別子の最初の文字と、後に続いて連結されている各単語の最初の文字を大文字にした形式。例:BackColor)と覚えておけばとりあえずは大丈夫でしょう。

さて、ここまで読んで.NETの命名規則に釈然としないものを感じている方も多いのではないかと思います。Windowsプログラミングではおなじみの、プリフィックス(接頭語、プレフィックス)を使った命名規則はどこへ行ったのでしょうか?

例えばVisual Basicでは今まで変数名にプリフィックスを付ける方法が推奨されていました。Integer型には"int"、String型には"str"、テキストボックスコントロールには"txt"、フォームには"frm"を名前の頭につける、さらにはモジュールレベル変数には"m"も付ける、という具合です。

-[[Visual Basic Coding Conventions>http://msdn.microsoft.com/library/en-us/vbcon98/html/vbconcodingconventionsoverview.asp]]

このように識別子にプリフィックスを付ける方法は「ハンガリアン記法」(または「ハンガリアン命名規約」、「ハンガリアン表記法」、「ハンガリー型表記法」など)と呼ばれています。(これはMicrosoftの技術者Charles Simonyi氏が考えた方法であり、この命名法で付けられた変数名が英語らしくなく、彼がハンガリー人だったことからこのように呼ばれています)。この方法はVBだけでなく、Microsoftがさまざまな場面で長年使ってきた方法であり、特にWindowsプログラマーには広く広まっています。(ここでは拡張されたハンガリアン記法も含めてハンガリアン記法とさせていただきます。)

-[[Hungarian Notation>http://msdn.microsoft.com/library/en-us/dnvsgen/html/HungaNotat.asp]]

ところが.NETでは一転してこのハンガリアン記法は使うべきではないとされています(ヘルプでは唯一「静的フィールド名には、ハンガリー表記法を使用したプリフィックスを付けます。」と書いてありますが)。この突然の方針転換は多くの反響を呼び、方々でハンガリアン記法肯定派と否定派が活発に(時には感情的とも思えるほど)議論を戦わせているようです。例えばMicrosoftのC#のニュースグループにはこのことに関する実に多くの意見が書き込まれています。

-[[Google Search: Hungarian Notation group:microsoft.public.dotnet.languages.csharp>http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&q=Hungarian+Notation&btnG=Google+Search&meta=group%3Dmicrosoft.public.dotnet.languages.csharp]]

いろいろな意見があるようですが、始めに述べたように、最終的にどんな命名規則でコーディングをするか、その決定権は私たち一人一人にあります。Microsoftが嫌いという感情的な理由だけでハンガリアン記法を否定しても、またはその逆でも、結局はMicrosoftに振り回されているという事実には変わりありません。これらの命名規則の特徴を的確に捉え、気に入ったものを選択して使用するというのが賢いやりかたではないでしょうか。

最後に余談となりますが、ヘルプの「クラスライブラリ開発者向けのデザインガイドライン」は読めば読むほど疑問が増えていきます。

前に「ヘルプでは唯一「静的フィールド名には、ハンガリー表記法を使用したプリフィックスを付けます。」と書いてあります」と書きましたが、ヘルプの「クラスメンバの使用方法のガイドライン」内の「[[フィールドの使用方法のガイドライン>http://www.microsoft.com/japan/msdn/library/ja/cpgenref/html/cpconfieldusageguidelines.asp]]」では「フィールド名または静的フィールド名にプリフィックスは適用しません。」と明記されており、両者は矛盾しています。もしプリフィックスを付けるということであればどのようなプリフィックスを付けるのか当然明記すべきですので、前者の「静的フィールド名には、ハンガリー表記法を使用したプリフィックスを付けます。」という記述は間違いなのではないかと推測できます。

さらに、「プライベートなフィールドにアクセスするためのプロパティにはどのような名前をつけるべきなのか?」と思って調べてみたところ、いくつかの不可解なサンプルコードを見つけました。まず「[[フィールドの使用方法のガイドライン>http://www.microsoft.com/japan/msdn/library/ja/cpgenref/html/cpconfieldusageguidelines.asp]]」には次のようなコードがあります。

#pre{{
[Visual Basic]
Public Class Control
      Inherits Component
      Private handle As Integer
      
      Protected ReadOnly Property Handle() As Integer
         Get
            Return handle
         End Get
      End Property
   End Class 
}}

また「[[プロパティの使用方法のガイドライン>http://www.microsoft.com/japan/msdn/library/ja/cpgenref/html/cpconpropertyusageguidelines.asp]]」には次のようなコードがあります(一部省略しています)。

#pre{{
[Visual Basic]
Public Class TextBox
   Private dataSource As String
   Private dataField As String
   Private active As Boolean

   Public Property DataSource() As String
      Get
         Return dataSource
      End Get
      Set
         '(省略)
      End Set
   End Property
   Public Property DataField() As String
      Get
         Return dataField
      End Get
      Set
         '(省略)
      End Set
   End Property
   '(省略)
End Class
}}

上記の例には先頭の文字が小文字か大文字かという違いだけのフィールド名とプロパティ名が宣言されています。これでは大文字と小文字を区別しないVBではエラーが発生すると思うのですが、どうなのでしょうか?C#ではエラーは発生しないでしょうが、ヘルプの「[[大文字と小文字の区別>http://www.microsoft.com/japan/msdn/library/ja/cpgenref/html/cpconcasesensitivity.asp]]」には「大文字と小文字を区別する必要がある名前を使用することは避けてください。」とあります。果たしてこれらのコードは適切な例となりえているのでしょうか?

結局のところ「プライベートなフィールドにアクセスするためのプロパティにはどのような名前をつけるべきか?」という疑問にははっきりとした答えがまだないようです。ヘルプの「フィールドの使用方法のガイドライン」にはプロパティ名を小文字にして後ろに"Value"を付けてフィールド名にする例がありますが、一般的は方法ではないようです。むしろ"m_"といったプリフィックスを付けてフィールド名にするといった人のほうが圧倒的に多いようです。この問題が解決されない限り、ハンガリアン記法は不滅かもしれません。

**コメント [#d12553cd]
#comment

//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2003-03-17 (月) 06:00:00,DOBON!,2010-03-20 (土) 02:19:18,DOBON!)


[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]