Skip to content

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.1
    clang-format の実行方法については、開発ガイドの「ビルド手順」を参照してください。

命名規則:

  • クラス名: PascalCase (Server, Client)
  • 関数名/変数名: snake_case (start_server, client_fd)
  • メンバー変数: _ をプレフィックスとして使用 (_socket, _port)

コメント:

  • Doxygen形式で、クラス、関数、複雑なロジックを説明します。
  • // を使用したインラインコメントも適切に使用します。

このガイドラインを参考に、安全で保守性の高いコードを共に書いていきましょう。不明な点があれば、このドキュメントを更新するか、チームメンバーに相談してください。