Programing/Language/C++/CodingStyle/Naming

Last-modified: Wed, 14 Apr 2021 10:57:31 JST (1161d)

変数名

ハンガリアン記法

  • 背景
    ハンガリー出身のプログラマ「チャールズ・シモニー」が、マイクロソフト社でExcel,Wordなどの開発に従事している際に発案した命名法。
    マイクロソフト社のWindowsの各種APIおよびMFCなどフレームワークでハンガリアン記法が採用されている。
  • 概要
    間違えたコードを間違えて見えるようにすることが目的。
    区別しにくい変数の意味を明白にして混同を避けるため、変数名に接頭辞や接尾辞として変数の型/種類に関する情報を付与する手法。
    大別して、システムハンガリアンと、アプリケーションハンガリアンの2種類が存在する。
    当初シモニーが想定していた使用方法はアプリケーションハンガリアンを意図したものであったが、マイクロソフト社で使用されるうちにシステムハンガリアンが多用されるようになった。
    現在ではシステムハンガリアンに関して否定的な意見が多くある。
    • システムハンガリアン
      変数の型の略称を接頭辞として付与する。
      1. /// Win32 APIの一例
      2. HWND CreateWindow(
      3.   LPCTSTR lpClassName , LPCTSTR lpWindowName, // lp=long pointer の接頭辞
      4.   DWORD dwStyle , // dw=double word の接頭辞
      5.   int x , int y ,
      6.   int nWidth , int nHeight , // n=integer の接頭辞
      7.   HWND hWndParent , // h=handle の接頭辞
      8.   HMENU hMenu ,
      9.   HANDLE hInstance ,
      10.   LPVOID lpParam
      11. );
      12.  
      13. DWORD dwStyle = WS_DLGFRAME;
      14. int nWidth = 300;
      15. CreateWindow("MainWindow","window",0,0,nWidth,nHeight,dwStyle,hWnd,hMenu,hInstance,NULL); // dwStyle引数指定順が間違っている
      DWORD型やint型は両方共実態はlong intであるが、Win32API関連で使用しているDWORD型変数にdw、通常の用途のint形にnと接頭辞を付与する事で混同に気付きやすくなる。
      また、HANDLE型は実態がvoid*であり、他のポインタにも代入できてしまうためHANDLE型であることを明記するためにhを付与している。
    • アプリケーションハンガリアン
      型で表現できない種類の略称を接頭辞として付与する。
      1. int dollIncome; // doll=ドルの接頭辞
      2. int yenDeposit; // yen=円の接頭辞
      3. int yenAsset = dollIncome + yenDeposit;
      同じint形の変数でも異なる通貨単位が混在するに接頭辞としてdollyenなどの通貨単位の略称を接頭辞として付与する事で、3行目など間違った式で間違いに気付きやすくなる。
  • 肯定的意見
    • 型が変更された場合でも、最新の統合環境であればリファクタリング機能で簡単に変数名を変更可能
    • 間違ったコードが間違って見えるため有効である
    • 同じ型で複数の意味を取る場合があり、ハンガリアン記法が推奨されていた
    • 基本型をtypedefして別々の型として使用する場合、間違った代入や計算に気づくにはシステムハンガリアンが有効である
    • グローバル変数に接頭辞g_を付与したり、メンバー変数に接尾辞_を付与するスタイルは、今でも様々なコーディング規約に採用されており有効である
  • 否定的意見
    • データ型を変更した際に、変数名も併せて変更する必要があるため保守性が下がる
    • 慣れているプログラマ以外には可読性の低い記法である
    • 最新の統合環境では変数の型はマウスオーバーなど簡単な方法で確認できる
    • マイクロソフト社自体が.NET Frameworkではハンガリアン記法を廃止している
    • 混同してはいけない場合は異なる型を定義するべき
    • アプリケーションハンガリアンにしても、略称ではなく適切な変数名を付けるべき
  • 参考

ループ変数ijk

  • 背景
    数学分野では古くから添え字としてi,j,kを頻繁に採用していた
    \[ \sum_{i=1}^{n}(n^2) \]
    最初の高級言語であるFORTRANではI-Nの一文字変数を整数型として定義していた
    iはindex,iteratorの頭文字のためループ変数名として自然であった
  • 概要
    forループで使用するカウンタ変数には慣例としてi,j,kを使用する
    1. for(int i=0;i<10;i++){
    2.   for(int j=0;j<10;j++){
    3.     for(int k=0;k<10;k++){
    4.       printf("%d,%d,%d\n",i,j,k);
    5.     }
    6.   }
    7. }
  • 肯定的意見
    • 慣習的にループ変数に使用されておりループ変数だと分かりやすい
    • スコープが短い場合は、宣言部分と使用部分が一度に見渡せるため、具体的な変数名でなくても理解できる
    • ループ変数はループ内で多用されるため変数名が短い方が可読性が向上する
    • ループ内の一時的な変数に対して、ループ外の変数名と重複しない様な変数名を逐一考えるのは面倒
  • 否定的意見
    • iとjを誤認しやすい
    • スコープが長い場合は、宣言部分と使用部分が見渡せないため、具体的な変数名にしないと処理内容を理解できなくなる
    • 座標系を扱う場合など、x,yを使用する方が分かりやすい
  • 参考

関数名