Skip to content

Instantly share code, notes, and snippets.

@suma
Last active December 11, 2015 11:28
Show Gist options
  • Save suma/4593879 to your computer and use it in GitHub Desktop.
Save suma/4593879 to your computer and use it in GitHub Desktop.
Jubatus C++: コーディングスタイルを現在の実装にあわせようとする草案

Jubatus C++: コーディングスタイルを現在の実装にあわせようとする草案

Google C++ Style Guide

http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

これをベースにJubatus向けに直す。直す際には、書式の再フォーマット以外での変更はバグ回避のためなるべく最小限に抑えてコードを綺麗にしたい。

Classes

  • コンストラクタで初期化例外投げてもよいけど、コンストラクタで例外投げるとデストラクタ呼ばれないからメンバの初期化は例外安全に書けるといいね

Loops and Switch Statements

  • switch
  • caseで無理にBraces({, }) を使わなくていいんでは

Naming

  • Class: 小文字から始める。アンダースコア区切り
  • Function: 小文字から始める。アンダースコア区切り
  • privateメンバ関数をアンダースコアで終わる必要性はないのでは(一部でアンダースコア終わりの関数定義有り)

Formatting

  • ポインタやリファレンスは型名に加える。
int v = 10;
int& x = v;
int* p = &x;

Other C++ Features

デフォルト引数

  • 現在使っちゃっている件 → 使うか否か

例外(exception)

  • 利用する
  • STLが投げる例外や、依存ライブラリが投げるものはすべてcatchする以外では、基本的にjubatus::exception::jubatus_exceptionを投げるようにする。またJUBATUS_EXCEPTION()マクロを利用する
  • 例外に用いるメッセージはwhatではなく、error_message機能を活用する
  • 継承するのはexcepiton::jubaexceptionが基本

例外クラスを独自に定義するとき

namespace jubatus {

class my_exception : public jubaexception<my_exception> { // CRTP 
 public:
};

} // jubatus

例外を投げるとき

namespace jubatus {

void throw_exception_func() {
  int fd = open("path/to/file",0);
  if (fd == -1) {
    throw JUBATUS_EXCEPTION(my_exception() << exception::error_message("hello")
      << exception::error_errno(errno)
      << exception::error_api_func("open"));
  }
}

} // jubatus

例外をつかまえるとき、更に追加情報を加えてスローするとき

try {
  // code which throws
} catch (jubatus_exception& e) { // without const
  // push additional information
  e << JUBATUS_CURRENT_ERROR_INFO();
  // rethrow exception
  throw e;
}

例外をポインタで移動させて、再度投げるとき

exception_thrower_ptr thrower;
try {
  // code which throws
} catch (jubatus_exception& e) { // without const
  thrower = e.thrower();
}


// throw
if (thrower) {
  thrower->throw_exception();
}

実行時型情RTTI

  • 利用する

64-bit Portability

  • Jubatusは64ビット標準。32ビットの移植性も保ちましょう

boost

  • boostは使わない
  • boostの代わりにpficommonを用いる

Google-Specific Magic → Jubatus-Specific

スマートポインタ

  • pfi::lang::shared_ptr を用いる.

柏原 提案

  • 『Clean code』とかでよくある例
  • Google C++ Style Guideでも既に定義されてるかも

Formatting

  • 変数定義などでスペースを加えたインデントを揃えない。1行の追加、削除が他のコードの修正を強要してしまうこと、コミット時の変更も増えるからである。
int x         = 1234;
int long_name = 5678;
int x = 1234;
int long_name = 5678;
@unnonouno
Copy link

👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment