Page Menu
Home
Phabricator (Chris)
Search
Configure Global Search
Log In
Files
F630054
codingstyle.html
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Authored By
Unknown
Size
12 KB
Referenced Files
None
Subscribers
None
codingstyle.html
View Options
<!DOCTYPE html>
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
xml:lang
=
"ja"
lang
=
"ja"
>
<!-- InstanceBegin template="/Templates/soramimi.dwt" codeOutsideHTMLIsLocked="true" -->
<
head
>
<
meta
http-equiv
=
"Content-Type"
content
=
"text/html; charset=utf-8"
/>
<
link
rel
=
"stylesheet"
href
=
"style/style.css"
type
=
"text/css"
/>
<!-- #BeginEditable "doctitle" -->
<
title
>
コーディングスタイル
</
title
>
<
style
>
<!
--
pre
.
good
{
border
:
1
px
solid
#00c000
;
}
pre
.
bad
{
border
:
1
px
solid
#c00000
;
}
--
>
</
style
>
<!-- #EndEditable -->
</
head
>
<
body
bgcolor
=
"#f0f0f0"
background
=
"style/bg.gif"
>
<
div
id
=
"body"
>
<
div
id
=
"header"
>
<
div
style
=
"float: left"
><
a
href
=
"https://soramimi.github.io/Guitar/"
><
img
src
=
"banner.png"
width
=
"443"
height
=
"48"
alt
=
"Guitar - the graphical git client"
></
a
></
div
>
<
div
style
=
"text-align: right;"
>
under development
</
div
>
<
div
style
=
"clear: both;"
></
div
>
</
div
>
<!-- #BeginEditable "content" -->
<
h1
>
コーディングスタイル
</
h1
>
<
h2
>
命名規則
</
h2
>
<
ul
>
<
li
>
ファイル名
<
ul
>
<
li
>
UpperCamelCase.cpp (原則)
</
li
>
<
li
>
lowercase.cpp (一部例外)
</
li
>
</
ul
>
</
li
>
<
li
>
typedef型名
<
ul
>
<
li
>
snake_case_t (そのときの気分で適当に決める)
</
li
>
<
li
>
UpperCamelCase(クラスや構造体の場合)
</
li
>
</
ul
>
</
li
>
<
li
>
クラス/構造体名
<
ul
>
<
li
>
UpperCamelCase
</
li
>
</
ul
>
</
li
>
<
li
>
関数名
<
ul
>
<
li
>
lowerCamelCase (原則)
</
li
>
<
li
>
snake_case (時々)
</
li
>
<
li
>
UpperCamelCase (Windows用)
</
li
>
</
ul
>
</
li
>
<
li
>
メンバ変数名
<
ul
>
<
li
>
snake_case
</
li
>
</
ul
>
</
li
>
<
li
>
ローカル変数名
<
ul
>
<
li
>
snake_case
</
li
>
<
li
>
lowercase (そのときの気分で適当に決める)
</
li
>
<
li
>
ローカル変数名には原則として大文字を使わない
</
li
>
</
ul
>
</
li
>
<
li
>
ラムダ式名
<
ul
>
<
li
>
auto UpperCamelCase = [](){}; (原則)
</
li
>
<
li
>
auto lowerCamelCase = [](){}; (時々)
</
li
>
</
ul
>
</
li
>
<
li
>
enum型名
<
ul
>
<
li
>
UpperCamelCase
</
li
>
</
ul
>
</
li
>
<
li
>
enumメンバ
<
ul
>
<
li
>
UpperCamelCase(原則)
</
li
>
<
li
>
UPPER_SNAKE_CASE(時々)
</
li
>
</
ul
>
</
li
>
<
li
>
プリプロセッサシンボル
<
ul
>
<
li
>
UPPER_SNAKE_CASE (原則)
</
li
>
<
li
>
UpperCamelCase (時々)
</
li
>
</
ul
>
</
li
>
</
ul
>
<
h3
>
接頭辞・接尾辞・ハンガリアン記法
</
h3
>
<
p
>
接頭辞やハンガリアン記法は採用しない。
</
p
>
<
h4
>
クラス名
</
h4
>
<
ul
>
<
li
>
先頭に特定の文字を付ける様なクラス名にはしない。
</
li
>
</
ul
>
<
pre
class
=
"bad"
>
class CHoge {
};
</
pre
>
<
h4
>
変数名
</
h4
>
<
ul
>
<
li
>
m_ や g_ の様なものは付けない。
</
li
>
</
ul
>
<
pre
class
=
"bad"
>
class Hoge {
private:
int m_value;
};
Hoge g_hoge;
</
pre
>
<
ul
>
<
li
>
アンダースコアで終わる。(とりあえず不問。将来のリファクタリング対象)
</
li
>
</
ul
>
<
pre
>
class Hoge {
private:
int value_;
};
</
pre
>
<
h4
>
接頭辞
</
h4
>
<
ul
>
<
li
>
禁止はしないが積極的には使わない。
</
li
>
<
li
>
状況次第、あった方がいいと判断すれば使う。
</
li
>
</
ul
>
<
pre
>
bool fCondition;
char *pSomething;
</
pre
>
<
h4
>
接尾辞
</
h4
>
<
ul
>
<
li
>
状況次第、あった方がいいと判断すれば使う。
</
li
>
</
ul
>
<
pre
>
char *dataptr;
std::shared_ptr
<
Hoge
>
hoge_ptr;
</
pre
>
<
h4
>
絶対厳禁
</
h4
>
<
ul
>
<
li
>
Windows由来のシステムハンガリアン記法は厳禁
</
li
>
</
ul
>
<
pre
class
=
"bad"
>
char *lpszText;
</
pre
>
<
h2
>
インデントと空白と改行
</
h2
>
<
ul
>
<
li
>
ハードタブ
</
li
>
<
li
>
4文字幅を推奨
</
li
>
</
ul
>
<
h3
>
桁揃え
</
h3
>
<
ul
>
<
li
>
行先頭のインデントだけハードタブ、それ以外の桁揃えは空白文字を使う。
</
li
>
</
ul
>
<
pre
class
=
"good"
>
switch (n) {
case 1: return
"
a
"
; // comment
case 12: return
"
ab
"
; // comment
case 123: return
"
abc
"
; // comment
}
</
pre
>
<
h3
>
if
</
h3
>
<
pre
class
=
"good"
>
if (cond1) {
// do something
} else if (cond2) {
// do something
} else {
// do something
}
</
pre
>
<
ul
>
<
li
>
開き括弧の前に1個の空白を入れる。
</
li
>
<
li
>
閉じ括弧と波括弧の間に1個の空白を入れる。波括弧の前で改行はしない。
</
li
>
<
li
>
elseの前後で改行しない。
</
li
>
<
li
>
条件式が読みにくいとき、わざと if ブロックで何も行わず else ブロックを利用することがある。
</
li
>
</
ul
>
<
h4
>
読みにくい
</
h4
>
<
pre
class
=
"bad"
>
if (c != 'a'
&&
c != 'b'
&&
c != 'c') {
// do something
}
</
pre
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
if (c == 'a' || c == 'b' || c == 'c') {
// nop
} else {
// do something
}
</
pre
>
<
h3
>
while
</
h3
>
<
pre
class
=
"good"
>
while (cond) {
// do something
}
</
pre
>
<
ul
>
<
li
>
開き括弧の前に1個の空白を入れる。
</
li
>
<
li
>
閉じ括弧と波括弧の間に1個の空白を入れる。波括弧の前で改行はしない。
</
li
>
</
ul
>
<
h3
>
do while
</
h3
>
<
pre
class
=
"good"
>
do {
// do something
} while (cond);
</
pre
>
<
ul
>
<
li
>
波括弧の前に1個の空白を入れる。改行はしない。
</
li
>
<
li
>
閉じ波括弧の後に1個の空白を入れる。
</
li
>
<
li
>
開き括弧の前に1個の空白を入れる。
</
li
>
<
li
>
セミコロンの前に空白は入れない。
</
li
>
</
ul
>
<
h3
>
for
</
h3
>
<
pre
class
=
"good"
>
for (int i = 0; i
<
10; i++) {
// do something
}
</
pre
>
<
ul
>
<
li
>
開き括弧の前に1個の空白を入れる。
</
li
>
<
li
>
セミコロンの前に空白は入れない。後に1個の空白を入れる。
</
li
>
<
li
>
閉じ括弧と波括弧の間に1個の空白を入れる。波括弧の前で改行はしない。
</
li
>
</
ul
>
<
h3
>
switch
</
h3
>
<
ul
>
<
li
>
<
p
>
switchとcaseのインデントは同じ深さとする。
</
p
>
</
li
>
</
ul
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
switch (n) {
<
br
>
case 1:
// do something
break;
}
</
pre
>
<
h4
>
良くない
</
h4
>
<
pre
class
=
"bad"
>
switch (n) {
<
br
>
case 1:
// do something
break;
}
</
pre
>
<
h4
>
通り抜け
</
h4
>
<
ul
>
<
li
>
意図的に break しないときは、fallthruなどのコメントを書く。
</
li
>
</
ul
>
<
pre
class
=
"good"
>
switch (n) {
<
br
>
case 1:
// do something
break;
case 2: // fallthru
case 3:
// do something
break;
}
</
pre
>
<
h3
>
式
</
h3
>
<
ul
>
<
li
>
セミコロンの前に空白を入れない。
</
li
>
<
li
>
開き括弧の後と閉じ括弧の前に空白を入れない。
</
li
>
<
li
>
二項演算子の前後に1個の空白を入れる。
</
li
>
<
li
>
単項演算子の後に空白を入れない。
</
li
>
</
ul
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
hoge();
</
pre
>
<
h4
>
良くない
</
h4
>
<
pre
class
=
"bad"
>
hoge() ;
</
pre
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
int n = (12 + 34);
</
pre
>
<
h4
>
良くない
</
h4
>
<
pre
class
=
"bad"
>
int n = ( 12+34 );
</
pre
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
bool g = !f;
</
pre
>
<
h4
>
良くない
</
h4
>
<
pre
class
=
"bad"
>
bool g = ! f;
</
pre
>
<
h3
>
カンマ
</
h3
>
<
ul
>
<
li
>
カンマの前に空白は入れない。後に1個の空白を入れる。
</
li
>
</
ul
>
<
pre
class
=
"good"
>
hoge(a, b, c);
</
pre
>
<
h2
>
式
</
h2
>
<
h3
>
代入
</
h3
>
<
ul
>
<
li
>
条件式内で変数への代入は行わない。
</
li
>
</
ul
>
<
h4
>
良くない
</
h4
>
<
pre
class
=
"bad"
>
while ((c = get()) != 0) {
}
</
pre
>
<
h4
>
例外
</
h4
>
<
pre
class
=
"good"
>
if (Hoge *hogeptr = dynamic_cast
<
Hoge *
>
(baseptr)) {
}
</
pre
>
<
h3
>
変数宣言
</
h3
>
<
ul
>
<
li
>
ポインタや参照の記号(* や
&
)は変数名の側に寄せる。
</
li
>
</
ul
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
char *p;
</
pre
>
<
h4
>
良くない
</
h4
>
<
pre
class
=
"bad"
>
char* p;
</
pre
>
<
h3
>
長い文
</
h3
>
<
ul
>
<
li
>
途中で改行しない。
</
li
>
<
li
>
論理的に一行のものは物理的にも一行で記述する原則。
</
li
>
<
li
>
一行の長さに制限は設けないので、長くなっても構わない。
</
li
>
<
li
>
どうしても改行しないと読みにくい場合は、慎重に検討する。
</
li
>
</
ul
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
if (!CreateProcessW(0,
&
tmp[0], 0, 0, TRUE, CREATE_NO_WINDOW, 0, 0,
&
si,
&
pi)) {
}
<
br
>
</
pre
>
<
h4
>
良くない
</
h4
>
<
pre
class
=
"bad"
>
if (!CreateProcessW(0,
&
tmp[0], 0, 0, TRUE,
CREATE_NO_WINDOW, 0, 0,
&
si,
&
pi)) {
}
</
pre
>
<
h3
>
条件式
</
h3
>
<
ul
>
<
li
>
true、false、nullptrなどの定数シンボルとの比較は行わない。
</
li
>
<
li
>
定数と比較する場合は、比較する主体の変数を左辺に書き、値を右辺に書く。
</
li
>
</
ul
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
bool f;
if (f) {
}
if (!f) {
}
</
pre
>
<
h4
>
良くない
</
h4
>
<
pre
class
=
"bad"
>
bool f;
if (f == true) {
}
if (f == false) {
}
</
pre
>
<
h4
>
厳禁
</
h4
>
<
pre
class
=
"bad"
>
bool f;
if (true == f) {
}
if (false == f) {
}
</
pre
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
char *p;
if (p) {
}
if (!p) {
}
</
pre
>
<
h4
>
良くない
</
h4
>
<
pre
class
=
"bad"
>
char *p;
if (p != nullptr) {
}
if (p == nullptr) {
}
</
pre
>
<
h4
>
厳禁
</
h4
>
<
pre
class
=
"bad"
>
char *p;
if (nullptr != p) {
}
if (nullptr == p) {
}
</
pre
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
int n;
if (n == 42) {
}
</
pre
>
<
h4
>
厳禁
</
h4
>
<
pre
class
=
"bad"
>
int n;
if (42 == n) {
}
</
pre
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
if (c
>
= '0'
&&
c
<
= '9') {
}
</
pre
>
<
h4
>
原則避ける
</
h4
>
<
pre
class
=
"bad"
>
if ('0'
<
= c
&&
c
<
= '9') {
}
</
pre
>
<
h2
>
関数
</
h2
>
<
ul
>
<
li
>
宣言は原則として一行で書く。
</
li
>
<
li
>
関数定義の開き波括弧の前に改行する。
</
li
>
<
li
>
どうしても引数が長くなりすぎるときは、引数を構造体にまとめて、そのポインタを渡すような方法を検討する。
</
li
>
</
ul
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
void hoge(int arg1, int arg2, int arg3)
{
}
</
pre
>
<
h4
>
できるだけ避ける
</
h4
>
<
pre
class
=
"bad"
>
void hoge(int arg1,
int arg2,
int arg3)
{
}
</
pre
>
<
h4
>
厳禁
</
h4
>
<
pre
class
=
"bad"
>
void
hoge(int arg1, int arg2, int arg3) {
}
</
pre
>
<
h4
>
要検討
</
h4
>
<
pre
class
=
"good"
>
struct HogeArgs {
int arg1;
int arg2;
int arg3;
};
void hoge(HogeArgs *args)
{
}
</
pre
>
<
h3
>
ポインタ引数
</
h3
>
<
ul
>
<
li
>
参照型の引数に代入しない。引数経由で値を返す場合はポインタを使用する。参照を使うときは必ずconstにする。
</
li
>
<
li
>
引数に構造体を渡す場合、ポインタにするかconst参照にするかは問わない。
</
li
>
</
ul
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
void func(int *v)
{
*v = 123;
}
</
pre
>
<
h4
>
厳禁
</
h4
>
<
pre
class
=
"bad"
>
void func(int
&
v)
{
v = 123;
}
</
pre
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
void func(Hoge *hoge)
{
}
</
pre
>
<
h4
>
厳禁
</
h4
>
<
pre
class
=
"bad"
>
void func(Hoge
&
hoge)
{
}
</
pre
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
void func(Hoge const *hoge)
{
}
</
pre
>
<
h4
>
良い
</
h4
>
<
pre
class
=
"good"
>
void func(Hoge const
&
hoge)
{
}
</
pre
>
<
h2
>
const
</
h2
>
<
ul
>
<
li
>
とにかく積極的にconstを使う。
</
li
>
<
li
>
ポインタはconstが原則。
</
li
>
<
li
>
どうしてもconstにできないものだけconstを外す。
</
li
>
<
li
>
参照型は全てconstにする。 非const参照を使うくらいならポインタにする。
</
li
>
<
li
>
クラスメンバ関数はできるだけconst関数。
</
li
>
</
ul
>
<
blockquote
>
<
pre
>
class Hoge {
int getValue() const
{
return value;
}
};
</
pre
>
</
blockquote
>
<
ul
>
<
li
>
range-based-for 等で非const参照を受け取る場合はやむを得ない。
<
pre
>
std::vector
<
Hoge
>
hogevec;
for (Hoge
&
hoge : hogevec) {
// do something
}
</
pre
>
</
li
>
<
li
>
constの位置、
<
span
class
=
"code"
>
char const *
</
span
>
と書くか、
<
span
class
=
"code"
>
const char *
</
span
>
と書くかは不問。
</
li
>
</
ul
>
<
h2
>
名前空間
</
h2
>
<
ul
>
<
li
>
ヘッダファイルに using namespace を書かない。
</
li
>
<
li
>
すべてのヘッダファイルをインクルードし終わった後 using namespace を書いて良い。
</
li
>
<
li
>
using namespace std; は禁止。
</
li
>
<
li
>
namespaceの波括弧内はインデントしない。
</
li
>
<
li
>
namespaceの終了波括弧の後に、コメントで名前空間名を書く。
</
li
>
</
ul
>
<
pre
>
namespace ns1 {
namespace ns2 {
class Hoge {
};
}} // namespace ns1::ns2
</
pre
>
<
h2
>
pimplイディオム
</
h2
>
<
p
>
クラスが大きくなってきたら、pimplイディオムの採用を検討する。ポインタは m を推奨。
</
p
>
<
h4
>
Hoge.h
</
h4
>
<
pre
>
class Hoge {
private:
struct Private;
Private *m;
public:
Hoge();
~Hoge();
];
</
pre
>
<
h4
>
Hoge.cpp
</
h4
>
<
pre
>
struct Hoge::Private {
};
Hoge::Hoge()
: m(new Private)
{
}
Hoge::~Hoge()
{
delete m;
}
</
pre
>
<
p
>
クラスメンバ関数内で、pimplイディオム以外の用途で m という変数を使用することを避ける。
</
p
>
<
h2
>
ライブラリ
</
h2
>
<
ul
>
<
li
>
cin、cout、cerr、および、
<
iostream
>
系のクラスは使用禁止。
</
li
>
</
ul
>
<!-- #EndEditable -->
<
div
id
=
"footer"
>
<
span
id
=
"copyright"
></
span
>
</
div
>
</
body
>
<
script
type
=
"text/javascript"
src
=
"common.js"
></
script
>
<!-- InstanceEnd -->
</
html
>
File Metadata
Details
Attached
Mime Type
text/html
Expires
Sun, Nov 15, 8:32 AM (1 d, 22 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
121435
Default Alt Text
codingstyle.html (12 KB)
Attached To
Mode
R77 Guitar
Attached
Detach File
Event Timeline