Googleコーディングガイドを読みつつ、いろいろな命名規約を比較してみる

Ruby on RailsのMVC命名規約ついて調べてたけど、最近よく書くc++とpythonに関してのガイドを見つけたので、その2つの言語に関して書きます。

ちょっと流行ったオライリーのリーダブルコードも読んだんですが、相変わらず糞コード量産してしまうので、勉強です・・・orz

あと全文紹介するだけだと、それなら本家を読んだほうがいいし、日本語訳も既に翻訳されたものがネットにいくつもあるので、今回は命名規約+αのみです。

更に詳しく読みたい方がいれば、本家Google Coding Guideと、それらの日本語訳を参照してください。

読んで感じたのは、Googleで利用されている命名規約を知るだけでなく、細かい言語仕様なんかも一緒に確認できたことです。サラサラっとでも一度全部読んでみることをおすすめします。(もちろん、これらの命名規約をどこでも厳守する必要はありません。あくまでGoogleのガイドラインです。)

Google Python Style Guide によるPython の命名規約

非推奨なもの

  1. カウンタ、イテレータ以外の1文字変数
  2. パッケージ、モジュール名のハイフン( – )
  3. 二重アンダーラインで囲まれた名前(Pythonで予約された__main__などと重なるため)

一般的な命名

  1. 最初にアンダーバーを一つ付加すると、変数と関数を保護するための機能が提供される(import * fromでインポートできない) (protected)
  2. 最初にアンダーバーを二つ付加すると、変数や関数をプライベートにすることができる(private)
  3. ちなみに、ファイル名(=モジュール名)はmodule_name.pyとする。多くのModuleName.pyという名前の既存モジュールが存在するが、これはモジュールがクラス名の後に命名されると混乱するので、現在は非推奨になっている。

命名規約

  • モジュール: module_name
  • パッケージ : package_name
  • クラス名 : ClassName
  • メソッド名: method_name
  • 例外 : ExceptionName
  • 関数名 : function_name
  • グローバル定数:GLOBAL_CONSTANT_NAME
  • グローバル変数:global_var_name
  • インスタンス変数 : instance_var_name
  • ローカル変数:local_var_name

メイン関数について

ファイルは基本的にインポート可能であるべきなので、インポートにより、メイン関数が実行されないようにする。pythonにおいては、pychecker, pydocと単体テストのモジュールがインポート可能でなければならないので、、インポート時にメイン関数が実行されないように、以下のようにチェックを行うこと。

以上がGoogle Python Style GuideのNamingの項目です。メイン関数のチェックに関しては定番ですね。テストもしやすいし、そのままインポートできます。何もなくても、これは大体書きますね。あれ、と思ったのは変数名の前のアンダーバー。ひとつ付けたときってprotectedになるんだっけ・・・?まぁなるんでしょうけど、あとで動作確認含めて、検証してみます。あとNamingの項目ではないですが、「インポートは必ず絶対パスで」と「継承のないクラスは必ずobjectを継承する」というポイントは、なるほど、と勉強になりました。

ちなみに、クラス名、例外で用いられている記法はパスカルケース。それ以外はスネークケースですね。あと今回登場していませんが有名どこだと、キャメルケース。全然知らないけど、ハンガリアン記法なんかがありますね。次はC++いってみます。こっちはpythonより細かくて全部読むのめんどくry….

Google C++ Style GuideによるC++の命名規約

一般的な命名規約

  1. 関数名、変数名、ファイル名はわかりやすいものにする。無理に省略することは避ける。型や変数は名詞で、関数は命令的な動詞にするべき。
  2. プロジェクト外でも極めてよく知られている略語で無い限り、使用してはいけない。

ファイル名(一部省略)

  1. ファイル名は全て小文字にするべきで、アンダーバー、ダッシュを含んでていても構わない。一貫性のあるパターンがなければアンダーバーを使うとより。
  2. c++ファイルはすべて.cc、ヘッダファイルは.hで終わるべき。
  3. db.hのように/usr/includeに存在するファイル名を使ってはいけない。
  4. ファイル名は具体的なものにする。(logs.hではなく、http_server_logs.hなど)
  5. インライン関数は.hファイルにいれなければならない。シンプルなインライン関数は直接.hファイルに書いたほうがよい。

型名(クラス名)

大文字で始めて、単語の頭文字を大文字にして、アンダーバーを使わないようにする。(パスカル記法ですね) ex: ClassName

変数名

  1. 全て小文字にして、単語と単語の間にはアンダーバーを入れる。クラスメンバ変数はアンダーバーで終わるようにする。構造体のデータメンバは、アンダーバーなしの通常の変数と同様に命名するべき(スネーク記法) ex: variable_name, class_member_variable_name_
  2. グローバル変数に特別な決まりはないが、グローバル変数自体、めったに使うべきではない。もし使う場合は g_ などのプレフィックスを付加し、ローカル変数と視覚的に区別しやすいように工夫すること。

定数名

kで始まり、単語の先頭を大文字にして続ける。ex : kConstNumber

関数名

  1. 通常の関数は大文字で始めて、単語の先頭を大文字にするべき。アンダーバーは使わない。関数がエラー時にクラッシュするなら、関数名にOrDieを付加するべき。ex : FunctionName(), CountNumbersOrDie()
  2. アクセサとミューテータ(get/set関数)は取得、または設定する変数名と一致させる。そのため、単語はそれぞれ小文字で、間にアンダーバーを入れる。ex : void set_user_id(int user_id)

名前空間名

名前空間は全て小文字で、プロジェクト名と、できればディレクトリ構造に基づいて名前をつける。

列挙子名

列挙子の名前は定数やマクロと同様にするべき。できるだけ定数と同様にするべきだが、マクロと同じにしても構わない。ex : kErrorOutOfMemory

マクロ名

一般的にはマクロを使うべきではないが、どうしても必要なら、大文字とアンダースコアだけを使った名前にする ex : define FOO_VAR …

以上がGoogle C++ Style Guideの命名規約になります。ちょっと詳細すぎたり、限定的すぎる箇所もあったので、それは割愛させていただきました。まぁ大体はpythonと同じくパスカル記法とスネーク記法ですね。あと、マクロ、グローバル変数は原則使用しない。定数、列挙子は小文字のkから始まってから、パスカル記法、というところが一部特殊です。

もちろん厳守する必要なないですが、個人でここまでコーディング規約決めてる人ってのもなかなかいないですね。俺も、書いてるプログラムや気分によって、いつのまにか変わってしまうこともしばしば・・・それぞれのルールには根拠もあって、Googleはこのようなコーディング規約を設けているので、特別拘りが見つかるまでは、ひとまず真似してみるのもいいと思います。

最後におさらいしておきます

パスカル記法 : ClassName  (それぞれ単語の頭文字が大文字)

スネーク記法 :   class_member_variable (それぞれ単語は全て小文字(または大文字)で、間にアンダーバー)

キャメル記法  :  variableName (今回出て来なかったやつ。最初の単語は小文字で、以降単語の頭文字が大文字)

この3つは非常によく出てくる記法です。ハンガリアン記法はあんまり見かけないので省略。一応wikipediaだけでも。[ハンガリアン記法] よっぽど変数の中身や宣言を明確に、かつ限定的にしたいときに、数えるほどですが、使ったことあります。プログラムは書くだけでなく、読むことも仕事や勉強ですから、お互いにいいコードを見せあいたいですね、頑張ります。

アルゴリズムの問題とかのプログラム書く時は、変数a,b,cとかやっちゃいますけどね・・・(笑)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です