命名規則 (プログラミング)
命名規則(めいめいきそく、英: naming conventions)とは、プログラミングを行う際にソースコード上の識別子(英: identifier)の名称となる文字列を決定するためのルールを定めたもの。ネーミング規則、ネーミング規約、あるいは命名規約とも呼ぶ。
通常は、ソースコードの可読性や視認性の向上、プログラミング効率およびメンテナンス性の改善などを目的としている。
命名規則は、プログラミング言語の仕様、メモリサイズ等のハードウェア的な制約、エディタや統合開発環境 (IDE) の機能などに影響を受けていることがある。
初期の命名規則として、IBMが1980年代にIMS(Information Management System)のマニュアルで採用した "OF Language" がある。
これは、PRIME-MODIFIER-CLASS(主要部-修飾部-クラス)の形式で、例えば "CUST-ACT-NO" という名前で "customer-account-number"(顧客-口座-番号)を表す。
PRIMEの単語は、システムが対象とする主な実体を指す。MODIFIERの単語は、補助的な具体化をしたり、可読性を向上させる役目を持つ。CLASSの単語は理想的にはデータ型を表す短いリストである。典型的なCLASS単語として、NO(number)、ID(identifier)、TXT(text)、AMT(amount)、QTY(quantity)、FL(flag)、CD(code)、W(work)などがある。実際、CLASS単語としては2ダースほどの単語がリストアップされている。
CLASS単語は一般に右端(接尾辞)に置かれ、ハンガリアン記法(システムハンガリアン)の接頭辞と同じ役目を果たしている。
CLASS単語の目的は、一貫性を保つだけでなく、プログラマにデータフィールドのデータ型を指示する意味がある。BOOLEAN(two values only)が登場するまでは、FL(flag)が二値だけをとるフィールドを示していた。
C言語とC++はともに大文字/小文字を区別する言語だが、キーワードや標準ライブラリ(標準Cライブラリ、標準C++ライブラリ)の識別子の多くは小文字である。C++の設計者Bjarne Stroustrupは、言語組み込みの型および標準ライブラリの型と、ユーザー定義の型を区別できるように、ユーザー定義の型の名前は大文字で始めることを推奨している。また、すべての文字を大文字にした名前は、慣例的にプリプロセッサマクロでの使用に予約されているので、マクロシンボルではない識別子の名前には絶対に使用してはいけないと助言している。
C言語の場合、次の名前が実装系(コンパイラおよび標準ライブラリ)のために予約されている。
グローバルスコープを持ち、_で始まる名前
_で始まり、その次が大文字の名前
__で始まる名前
C++の場合、次の名前が実装系のために予約されている。
グローバルスコープを持ち、_で始まる名前
_で始まり、その次が大文字の名前
__を含む名前
予約された名前をユーザー定義の識別子に利用した場合は未定義動作となるため、ユーザー定義の識別子に使ってはならない(例えば、__reservedや_Reserved、ファイルスコープの_reservedなど)。
命名規則の最も基本的な規則のうちのひとつは、識別子の長さに関するものである(長さの限度および識別子に使える文字の種類)。数値を挙げて上限を設定する場合もあれば、もっと緩やかなガイドラインを設定する場合もある。
識別子長の規則は議論の的になりやすく、学術的な議論にもなっている。適切な長さはケースバイケースであり、一概には決まらない。
考慮すべき点:
タイピングしやすいため、短い識別子が好まれる傾向がある。ただしIDEの入力支援機能(コード補完)が使える場面では、あまり問題とならない。
あまりにも短い識別子(a や i など)は、識別が困難である。
短い識別子では暗号的な名前になるなど意味情報が十分に込められないとして、長い識別子を好む場合もある。
長い識別子はスクリーン上に占める面積が増え、コード全体を素早く読めなくなることから、敬遠される場合がある。
たとえ長い識別子を使っても、そのうち1文字しか差異がない2つの識別子などは一見して区別が困難なこともある。
略語は混乱を招くため控えたほうがよいが、長すぎる正式名称を使うと可読性を損なう。
変数や関数のスコープに応じて長さを変えることもある。
スコープが広い場合は(グローバル検索しやすく衝突しにくい)長い名前が好ましいが、スコープが狭い場合は短い名前でもかまわない、など。
初期のリンケージエディタには、メモリ使用量を抑えるために変数名などを6文字以内に制限していたものがあり、そのために古いプログラムで識別子が短く制限されていたという事実もある。後発のプログラミング言語および処理系でも、識別子の長さに制限が設けられている場合があるが、実用的な範囲では通例問題にならない上限である。
Javaでは、言語仕様および標準ライブラリの設計時点から、クラスやメソッド、定数や変数などの命名における大文字/小文字の使い分けといった規則が決められている。例えば、クラス名は大文字で始める (upper camel)、メソッド名や変数名は小文字で始める (lower camel)、また定数名はすべて大文字でアンダースコア区切りとする、などである。
JavaBeansからの影響を発端として、特定の接頭辞を付けたアクセッサメソッド (getter/setter) が定義され、カプセル化に利用されることも多い。
なお、Java 9ではアンダースコア1文字の識別子_は予約済みのキーワード(予約語)となったため、ユーザーコードで識別子として使用することはできなくなった。