Geant4のコーディングガイド
Geant4には明確なコーディングガイドがありません。 Geant4は開発の歴史も長く、すでに広く利用されているツールキットであるため、 それぞれのアプリケーションのコーディングルールを尊重し、 Geant4側から強制はしないというスタンスのようです。
しかし、附属サンプルを使ってみたり、リファレンスガイドを参照したとき「慣習」のようなものを感じました (C++の慣習なのか、Geant4の慣習なのかは区別できていません)。 以下では、Geant4を使っていて感じる「慣習のようなもの」を整理してみました。
注釈
20年近くの開発の歴史があるせいなのか、命名規則が混在している印象です。 内部のソースコードや附属サンプルも一貫してないと感じる箇所もありました。 これはもう、いっぱいサンプルを読んで、雰囲気に慣れるしかなさそうです。
ファイル名
ファイル名はPascalCase
が使われています。
ヘッダーファイルはinclude/クラス名.hh
、
ソースファイルはsrc/クラス名.cc
にあります。
クラス名
クラス名はPascalCase
が使われています。
Geant4が提供するクラスの接頭辞はG4*
が使われています。
さらに抽象クラスはG4V*
、
ユーザー設定のためのフック用クラスはG4User*
もしくはG4VUser*
が使われています。
1class DetectorConstruction : public G4VUserDetectorConstruction
2{
3 // 自作クラスの実装
4}
のように継承したクラス名がわかるように、主要な部分を残して使うことが多いようです。
関数名
関数名はPascalCase
が使われています。
セッターはSet*
、ゲッターはGet*
が接頭辞に使われています。
関数の引数名は、G4Step *aStep
、G4Event *anEvent
のようにa
からはじまる変数名が多いです。
変数名
変数名はPascalCase
が使われています。
また、ゆるめのシステムハンガリアン記法が使われている気がします。
プライベートなメンバー変数の接頭辞にはf*
が使われています。
1G4int fNumberOfChambers = 5;
2G4LogicalVolume *fLogicalChamber = nullptr;
変数がポインターの場合はp*
やfp*
、
引数の場合はaValue
や&aValue
、&apValue
を使っていることが多いです。
1// G4Trackのメソッドを抜粋
2G4Track::SetTrackID(const G4int aValue)
3G4Track::SetPosition(const G4ThreeVector &aValue)
4G4Track::SetTouchableHandle(const G4TouchableHandle &apValue)
定数
定数(const
な変数)やenum
数はk*
を接頭辞にしたPascalCase
が使われています。
型の名前
1G4String name = "Geant4"; // String型
2G4int numberOfParticles = 1; // int型
3G4double energy = 1.0 * GeV; // double型
4// 他にもある
G4*型
を使うことが推奨されています。
プラットフォームによる型の実装の違いを吸収してくれます(たぶん)。
入出力ストリーム
1G4cout << "標準出力" << G4endl;
2G4err << "標準エラー出力" << G4endl;
3G4debug << "デバッグ用出力" << G4endl;
ターミナルへの出力は、C++標準のstd::cout
やstd::cerr
の代わりに
Geant4が用意しているG4cout
、G4cerr
、G4debug
を使うのがよいそうです。
G4debug
はQtで表示すると赤色でハイライトされるので、デバッグ時の確認がしやすいのでオススメです。
シングルトン
1auto rm = G4RunManagerFactory::CreateRunManager();
2auto em = G4EventManager::GetEventManager();
3auto sm = G4SDManager::GetSDMpointer();
4auto nm = G4NistManager::Instance();
5auto am = G4AnalysisManager::Instance();
RunManagerをはじめとするマネージャークラスは、シングルトンで設計されています。 コードのどこからでも、同じ方法で同じオブジェクトを参照できるようになっています。
注釈
マネージャークラスごとにシングルトンへのアクセス方法が異なるので注意してください。 関数名がブレているのは歴史的経緯なのではと推測しています。