概要
- Boost Library Requirements and Guidelines の抄訳
- 抄訳なので大幅に内容がカットされてます
- 詳細には原文を読んで下さい
- 意訳を多分に含む
- 誤訳があったら教えて下さい
訳文
デザインとプログラミング
なんと基本的な命名規則はこれだけ。シンプル。
名前の一貫性
今までの開発経験から、でかいライブラリの設計では以下のアプローチが有用そうだ。
ライブラリ名には、自身の内容について説明する名前をつける。意味不明な略語は使うな。
C++標準ライブラリでの経験に基づき、基本的に名前は複数形ではなく単数形を使う。
例えば、ファイルシステムを扱うライブラリならfilesystems
でもfs
でもなくfilesystem
。
- (略)
- Boost内の各ライブラリには、ライブラリ名と同じ名前を使う。ただし、ライブラリ名と、ライブラリ内の主要なコンポーネントが同じ名前を持つ場合は、複数形の名前空間名を使う。4
命名規則の根拠
C++標準化委員会のライブラリ作業グループは、この問題について詳細に、そして長期間にわたって議論を行った。
この議論は初期のBoostの投稿で幾度と無く蒸し返された。要約すると、
- 命名規則はぶっちゃけ戦争の火種でしかない。いくつかは広く使われてるけど、どれかが一つ優れてるなんてことは無い。
- 次期標準への提案という目的があるから、Boostは標準ライブラリの規則に従う。
- 一度落ち着いたら一貫して使おうぜ。
結局、こういう感じ。すごい一般論楽しく命名。
考察と私的運用
Boostの命名規則はとにかくルールを減らし、命名規則のシンプルさを重視しているように思う。
ルールが多いとプログラマが覚えるべきことが増えるのが大きなデメリットになる。
逆に、覚える事が増えてもいいから、各種名前を明確に区別するなら、適していないだろう。
snake_caseとPascalCase
テンプレート引数名と、その他の名前を分けているのはおそらく明確な理由がある。
C++では以下のように、テンプレート引数名をクラス内でネストした名前としてusing宣言する事が多い。
template< typename ValueType >
struct s
{
using value_type = ValueType;
value_type value;
};
この方法は型を取り回す時にとても便利。テンプレート引数名とその他の名前とで、明確に命名規則を分けないと、名前が衝突して大変不便である。
変数
変数名には名詞を使用する。これによって関数名との衝突を防ぐ。
ローカル変数
ローカル変数名は、型名やメンバ変数との衝突を防ぐため、型名以上の意味が無い場合はガンガン省略を行う。
関数は短く記述するのが基本なので、寿命が極めて短いから意味が不明瞭になったりはしない。
グローバル変数
使わない。静的なメンバ変数で代用する。
メンバ変数
静的な公開メンバ変数
標準ライブラリには以下のような、公開メンバ定数を持つクラスが多数ある。
scoped enumも同じ扱い。できればenumも。
bool b = std::numeric_limits< int >::is_exact;
コンパイル時定数を扱う時、今なら constexpr
関数があるが、昔は無かったので、テンプレートクラスと定数を組み合わせるならどうしてもこうせざるを得なかった。
std::numeric_limits::max
と std::numeric_limits::min
を関数にしたのは設計ミスだという話は有名だ。
標準ライブラリの命名規則に従うのであれば、静的メンバ定数は snake_case になる。
公開メンバ変数
危険なので使用しない。
非公開メンバ変数
接頭辞 m_
を使用する。これによって、型名やローカル変数との衝突を防止する。
長い寿命を持ちうるので省略は行わない。名前衝突を防ぐのが目的なので、別の命名規則を適用しても問題無いだろう。
静的な非公開メンバ変数
静的公開メンバ変数に準拠。
関数
動詞を用いる。これによって変数名との衝突を防ぐ。
公開、非公開、静的、非静的に関わらず同じ命名規則を用いる。
変数と異なり、名前衝突があまり起きないのでこの運用でも問題ない。