C++98 コーディング規約ガイドライン
本ガイドラインは、ft_irc プロジェクトにおける C++98 のコーディング規約を定めます。プロジェクトの堅牢性、可読性、保守性を確保するために、チームメンバー全員がこのルールを遵守してください。
1. リソース管理と安全性
C++98 では、メモリやソケットといったリソースの手動管理が求められます。以下の原則を厳守し、リソースリークや予期せぬエラーを防ぎましょう。
RAII (Resource Acquisition Is Initialization)
リソースの取得をオブジェクトの初期化と同時に行い、解放をデストラクタに任せることで、例外が発生しても確実にリソースを解放します。
- 原則: リソースを扱うすべてのクラスは、コンストラクタでリソースを取得し、デストラクタでリソースを解放するように設計します。
- 例: ソケットを扱うクラスでは、コンストラクタでソケットを作成し、デストラクタで
close()を呼び出します。
c++
class Socket {
public:
Socket(int domain, int type, int protocol) {
_fd = socket(domain, type, protocol);
if (_fd < 0) {
throw std::runtime_error("socket creation failed");
}
}
~Socket() {
if (_fd >= 0) {
close(_fd);
}
}
private:
int _fd;
};Copy & Swap Idiom
代入演算子(operator=)を実装する際は、強力な例外安全性を確保するために Copy & Swap イディオムを推奨します。
- 原則:コピーコンストラクタを使って、一時オブジェクトを作成します。
swapメンバー関数(またはフリー関数)を使って、thisの内容と一時オブジェクトの内容を交換します。- 関数から抜ける際に、一時オブジェクトのデストラクタが自動的に呼び出され、古いリソースが解放されます。
const の適切な使用
- 原則: メンバー関数は、オブジェクトの状態を変更しない場合は const を付けます。これにより、コンパイラが意図しない変更を検出できるようになります。
- 例:
constメンバー関数:Client::getNickname() const- 非-
constメンバー関数:Client::setNickname(const std::string& name)constポインタ: ポインタが指す先の値を変更できないことを示します。const char *const参照: 参照先の値を変更できないことを示します。const std::string &
2. オブジェクト指向プログラミングの原則
explicit キーワード
コンストラクタに explicit を付けることで、意図しない暗黙の型変換を防ぎます。特に、単一の引数を持つコンストラクタには常に explicit を付けることを推奨します。
c++
class MyString {
public:
explicit MyString(const char* s) { /* ... */ }
};
MyString s1 = "hello"; // コンパイルエラー:暗黙の変換
MyString s2("hello"); // OK:明示的な変換template (テンプレート)
テンプレートは汎用的なコードを書く際に非常に便利ですが、複雑になりがちです。
- 原則:
- テンプレートは、アルゴリズムが型に依存せず、かつそのアルゴリズムを再利用したい場合にのみ使用します。
- テンプレートコードはヘッダーファイルに記述します。
- テンプレートメタプログラミング(複雑なコンパイル時計算)は、可読性を損なうため避けます。
3. その他の規約
コーディングスタイルとフォーマット
- インデント: 4スペースのインデントを使用します。
- clang-format: コードの一貫性を保つため、
clang-formatを使用することを推奨します。プロジェクトには.clang-formatファイルが含まれており、これに従ってフォーマットしてください。sh$ clang-format --version clang-format version 20.1.1clang-formatの実行方法については、開発ガイドの「ビルド手順」を参照してください。
命名規則:
- クラス名: PascalCase (Server, Client)
- 関数名/変数名: snake_case (start_server, client_fd)
- メンバー変数: _ をプレフィックスとして使用 (_socket, _port)
コメント:
- Doxygen形式で、クラス、関数、複雑なロジックを説明します。
//を使用したインラインコメントも適切に使用します。
このガイドラインを参考に、安全で保守性の高いコードを共に書いていきましょう。不明な点があれば、このドキュメントを更新するか、チームメンバーに相談してください。