Programing/Language/C++/CodingStyle/Naming の変更点


#contents
----
*変数名 [#q89e65d7]
**ハンガリアン記法 [#pa143303]
-背景
ハンガリー出身のプログラマ「チャールズ・シモニー」が、マイクロソフト社でExcel,Wordなどの開発に従事している際に発案した命名法。
マイクロソフト社のWindowsの各種APIおよびMFCなどフレームワークでハンガリアン記法が採用されている。
-概要
区別しにくい変数の意味を明白にして混同を避けるために、変数名に接頭辞として変数の型/種類に関する情報を付与する手法。
間違えたコードを間違えて見えるようにすることが目的。
大別して、システムハンガリアンと、アプリケーションハンガリアンの2種類が存在する。
当初シモニーが想定していた使用方法はアプリケーションハンガリアンを意図したものであるが、マイクロソフト社で使用されるうちにシステムハンガリアンとして多用されるようになった。
現在ではシステムハンガリアンに関して否定的な意見が多くある。
--システムハンガリアン
区別しにくい変数の意味を明白にして混同を避けるため、変数名に接頭辞や接尾辞として変数の型/種類に関する情報を付与する手法。
大別して、''システムハンガリアン''と、''アプリケーションハンガリアン''の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を付与している。
--アプリケーションハンガリアン
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行目など間違った式で間違いに気づくことができる。
同じint形の変数でも異なる通貨単位が混在するに接頭辞として''doll''や''yen''などの通貨単位の略称を接頭辞として付与する事で、3行目など間違った式で間違いに気付きやすくなる。
-肯定的意見
--型が変更された場合でも、最新の統合環境であればリファクタリング機能で簡単に変数名を変更可能
--間違ったコードが間違って見えるため有効である
--同じ型で複数の意味を取る場合がありハンガリアン記法が推奨されていた
--同じ型で複数の意味を取る場合があり、ハンガリアン記法が推奨されていた
--基本型をtypedefして別々の型として使用する場合、間違った代入や計算に気づくには''システムハンガリアン''が有効である
--グローバル変数に接頭辞g_を付与したり、メンバー変数に接尾辞_を付与するスタイルは、今でも様々なコーディング規約に採用されており有効である
--基本型を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が頻繁に採用されていた
数学分野では古くから添え字としてi,j,kを頻繁に採用していた
#mathjax( \sum_{i=1}^{n}(n^2)) 
最初の高級言語であるFORTRANではI-Nの一文字変数が整数型として定義されていた
最初の高級言語であるFORTRANではI-Nの一文字変数を整数型として定義していた
iはindex,iteratorの頭文字のためループ変数名として自然であった
-概要
forループで使用するカウンタ変数には慣例としてi,j,kが使用される
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]