Programing/Language/C++/CodingStyle/Naming のバックアップソース(No.8)

#contents
----
*変数名 [#q89e65d7]
**ハンガリアン記法 [#pa143303]
-背景
ハンガリー出身のプログラマ「チャールズ・シモニー」が、マイクロソフト社でExcel,Wordなどの開発に従事している際に発案した命名法。
マイクロソフト社のWindowsの各種APIおよびMFCなどフレームワークでハンガリアン記法が採用されている。
-概要
区別しにくい変数の意味を明白にして混同を避けるために、変数名に接頭辞として変数の型/種類に関する情報を付与する手法。
間違えたコードを間違えて見えるようにすることが目的。
大別して、システムハンガリアンと、アプリケーションハンガリアンの2種類が存在する。
当初シモニーが想定していた使用方法はアプリケーションハンガリアンを意図したものであるが、マイクロソフト社で使用されるうちにシステムハンガリアンとして多用されるようになった。
現在ではシステムハンガリアンに関して否定的な意見が多くある。
--システムハンガリアン
変数の型の略称を接頭辞として付与する。
#geshi(cpp,number=on){{
/// Win32 APIの一例
HWND CreateWindow(
  LPCTSTR lpClassName , LPCTSTR lpWindowName, // lp=long pointer の接頭辞
  DWORD dwStyle , // dw=double word の接頭辞
  int x , int y ,
  int nWidth , int nHeight , // n=integer の接頭辞
  HWND hWndParent , // h=handle の接頭辞
  HMENU hMenu ,
  HANDLE hInstance ,
  LPVOID lpParam
);

DWORD dwStyle = WS_DLGFRAME;
int nWidth = 300;
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を付与している。
--アプリケーションハンガリアン
型で表現できない種類の略称を接頭辞として付与する。
#geshi(cpp,number=on){{
int dollIncome; // doll=ドルの接頭辞
int yenDeposit; // yen=円の接頭辞
int yenAsset = dollIncome + yenDeposit;
}}
同じint形の変数でも異なる通貨単位が混在するに接頭辞としてdollやyenなどの単位を付与しておくことで、3行目など間違った式で間違いに気づくことができる。
-肯定的意見
--型が変更された場合でも、最新の統合環境であればリファクタリング機能で簡単に変数名を変更可能
--間違ったコードが間違って見えるため有効である
--同じ型で複数の意味を取る場合がありハンガリアン記法が推奨されていた
--グローバル変数やメンバー変数に接頭辞、接尾辞を付与するスタイルは今でも有効である
--基本型をtypedefして別々の型として使用する場合、間違った代入や計算に気づくにはシステムハンガリアンが有効である
-否定的意見
--データ型を変更した際に、変数名も併せて変更する必要があるため保守性が下がる
--慣れているプログラマ以外には可読性の低い記法である
--最新の統合環境では変数の型はマウスオーバーなど簡単な方法で確認できる
--マイクロソフト社自体が.NET Frameworkではハンガリアン記法を廃止している
--混同してはいけない場合は異なる型を定義するべき
--アプリケーションハンガリアンにしても、略称ではなく適切な変数名を付けるべき
-参考
--[[ハンガリアン記法>https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95]]
**ループ変数ijk [#aca9aa3d]
-背景
数学分野では古くから添え字としてi,j,kが頻繁に採用されていた
#mathjax( \sum_{i=1}^{n}(n^2)) 
最初の高級言語であるFORTRANではI-Nの一文字変数が整数型として定義されていた
iはindex,iteratorの頭文字のためループ変数名として自然であった
-概要
forループで使用するカウンタ変数には慣例としてi,j,kが使用される
#geshi(cpp,number=on){{
for(int i=0;i<10;i++){
  for(int j=0;j<10;j++){
    for(int k=0;k<10;k++){
      printf("%d,%d,%d\n",i,j,k);
    }
  }
}
}}
-肯定的意見
--慣習的にループ変数に使用されておりループ変数だと分かりやすい
--スコープが短い場合は、宣言部分と使用部分が一度に見渡せるため、具体的な変数名でなくても理解できる
--ループ変数はループ内で多用されるため変数名が短い方が可読性が向上する場合が多い
--ループ内の一時的な変数に対して変数名を考えるのが面倒
-否定的意見
--iとjを誤認しやすい
--スコープが長い場合は、宣言部分と使用部分が見渡せないため、具体的な変数名にするべきである
--座標系を扱う場合など、x,yを使用する方が分かりやすい
-参考
--[[なぜループカウンタ変数のほとんどに “i”が使用されるのか?>https://qiita.com/yaju/items/38f63900491d4ac51af7]]
*関数名 [#g2aa126e]