Aritalab:Lecture/Programming/Style
(New page: ==Elements of Programming Style== ===プログラム設計の作法=== ; 目的別にディレクトリにまとめる : JavaでもCでも、関連する内容毎にディレクトリを...) |
m (→邪悪なコードを書きたい人へ) |
||
(13 intermediate revisions by one user not shown) | |||
Line 1: | Line 1: | ||
− | + | {{Lecture/Header}} | |
− | === | + | ==プログラム設計== |
− | + | ===プログラムソースは目的別にディレクトリにまとめる=== | |
− | + | ||
− | + | JavaでもCでも、関連する内容(たとえば課題)毎にディレクトリを作成する | |
− | + | ||
− | + | ===オブジェクト指向で書く=== | |
− | + | ||
+ | Javaは半ば強制ですが、C++で書く場合も、処理をクラスにまとめましょう | ||
− | |||
− | |||
− | |||
− | + | ==変数宣言== | |
− | + | ||
− | + | ===変数には内容を説明する名前をつける=== | |
− | + | 変数は小文字で書き出し、単語をつなげるときは先頭だけを大文字にします。 | |
+ | 基本的に、名前の区切りにアンダースコア(_)は使いません。 | ||
− | + | {| style="text-align:center" class="wikitable" | |
− | : | + | ! 名前 |
+ | !width="40%"| Good | ||
+ | !width="40%"| Bad | ||
+ | |- | ||
+ | | 行のカウンター || lineCount || lc, line, l, x | ||
+ | |- | ||
+ | | 日付 || currentDate || cd, date, d, x | ||
+ | |} | ||
− | ; | + | アンダースコアは、グローバル変数のようにスコープが異なる場合にのみ使いましょう。 |
+ | <pre> | ||
+ | const double GLOBAL_PI = 3.141592; | ||
+ | </pre> | ||
+ | |||
+ | ; tmpやflagといった変数名を使用しない | ||
+ | : もっと具体的な名前を使いましょう。 | ||
+ | |||
+ | ; 単純ループの変数にはi, j, kを用いてよい | ||
+ | <pre> | ||
+ | for(int i=0; i < Size; i++) { data[i] = 0; } | ||
+ | </pre> | ||
+ | |||
+ | ;1,2文字の変数名は以下の場合にしか使わない | ||
+ | * c, ch ... 文字 | ||
+ | * i, j, k ... 整数値 | ||
+ | * n ... 汎用。何でもよい | ||
+ | * p ... ポインタ | ||
+ | * s ... 文字列 | ||
+ | |||
+ | ;マクロで定義する値やconst定数値は大文字にする | ||
+ | : マクロについては[[Aritalab:Lecture/Programming/Cpp/Macro|「マクロの書き方」]]を参照してください。 | ||
+ | |||
+ | ;目的に応じて接頭辞をつける | ||
+ | : 使用目的に沿って以下のような接頭辞をつけると、意味がよりわかりやすくなります。 | ||
+ | * head, min ... 配列やリスト自体の最初の要素 | ||
+ | * first ... 配列やリストを処理する際の、最初の要素 | ||
+ | * tail, max ... 配列やリスト自体の最後の要素 | ||
+ | * last ... 配列やリストを処理する際の、最後の要素 | ||
+ | |||
+ | ===変数は使う直前で定義する=== | ||
+ | |||
+ | できる限り各変数のスコープが小さくなるようにし、再利用は避けましょう。変数を再利用しても速度は殆ど向上しません。 | ||
+ | |||
+ | ===変数は初期化する=== | ||
+ | Javaは基本データ型の配列でもメモリ確保をした際に自動的に初期化します。また、初期化の有無をコンパイラがチェックしてくれます。 | ||
+ | |||
+ | C++にはそうした便利な機能がありません。必要ないと思っても、必ず初期化する癖をつけましょう。 | ||
+ | |||
+ | ===値を変えない変数・関数はfinal, constをつける=== | ||
+ | 変数やメソッド毎に、値を変更するものかそうでないものか、明確にしましょう。 | ||
+ | 1ヵ月後にプログラムを眺めても中身がすぐわかるように処理目的を書いておきましょう。 | ||
+ | |||
+ | ==クラス== | ||
+ | |||
+ | ===クラス名は大文字で始める=== | ||
+ | クラス名は先頭1文字だけ大文字にして書き出し、単語をつなげるときは先頭だけを大文字にします。 | ||
+ | |||
+ | ===メンバー変数を公開しない=== | ||
+ | メンバー変数は原則privateとします。そのまま外に見せてはいけません。別の言い方をすると、Cにおける構造体として利用してはいけません。 | ||
+ | アクセスするにはメソッドを用い、値の初期化はクラス生成時におこないましょう。(例えば、メンバー毎に<tt>set/get</tt>メソッドなどをサポートしない。) | ||
+ | |||
+ | ===クラスは参照渡しする=== | ||
+ | C++では、できる限りクラスの参照渡しを利用しましょう。ポインタを使わざるを得ない場合のみポインタを用い、できるだけconst指定をしてアドレスを弄らないようにしましょう。 | ||
+ | |||
+ | ===サブクラスを無闇に作らない=== | ||
+ | サブクラス、特に多重継承(JavaであればInterface)は必要最小限にしましょう。 | ||
+ | |||
+ | ==数値== | ||
+ | ===大きさが極端に違う浮動小数点値を加減算しない=== | ||
+ | 32ビットマシンの場合、floatは7桁程度の精度しかありません。 | ||
+ | つまり、ppm (parts-per-million) レベルの操作をしてはいけません。 | ||
+ | <pre> | ||
+ | float million = 1000000.0; | ||
+ | million += 0.1; // 危険!やってはならない | ||
+ | </pre> | ||
+ | また浮動小数を<tt>==</tt>オペレータで比較するのもタブーです。 | ||
+ | <pre> | ||
+ | float fvalue1, fvalue2; | ||
+ | ... | ||
+ | if (fvalue1 == fvalue2) // 危険!やってはならない | ||
+ | { ... } | ||
+ | </pre> | ||
+ | |||
+ | ==文字列== | ||
+ | ===長い文字列を定数として使わない=== | ||
+ | プログラム中で "長い文字列" を入れると読みづらく修正も面倒です。できる限りプログラム先頭で定数として定義しましょう。 | ||
+ | |||
+ | |||
+ | ==ファイルのスタイル== | ||
+ | ===人に見せると思って書く=== | ||
+ | プログラムはソースを公開するものと思って書きましょう。 | ||
+ | そうすると、いい加減な関数名やファイル名をつけられなくなります。 | ||
+ | |||
+ | ===インデントをいじらない=== | ||
+ | 自分流のインデントだと、自分には見やすくても他人には見辛いものであることを意識しましょう。 | ||
+ | |||
+ | ==邪悪なコードを書きたい人へ== | ||
+ | ===国際「わかりにくいCコード」コンテスト=== | ||
+ | [http://www0.us.ioccc.org/main.html IOCCC] (The International Obfuscated C Code Contest) というコンテストがあり、[http://www0.us.ioccc.org/winners.html 優勝者のコード]を見ることができます。良い子は決して真似しないでください。 | ||
+ | |||
+ | 参考までに、Perl言語では様々な詩が作成されています。興味がある人はComputer Poetryというジャンルを見てください。 |
Latest revision as of 10:15, 9 November 2015
Wiki Top | Up one level | レポートの書き方 | Arita Laboratory |
|
[edit] プログラム設計
[edit] プログラムソースは目的別にディレクトリにまとめる
JavaでもCでも、関連する内容(たとえば課題)毎にディレクトリを作成する
[edit] オブジェクト指向で書く
Javaは半ば強制ですが、C++で書く場合も、処理をクラスにまとめましょう
[edit] 変数宣言
[edit] 変数には内容を説明する名前をつける
変数は小文字で書き出し、単語をつなげるときは先頭だけを大文字にします。 基本的に、名前の区切りにアンダースコア(_)は使いません。
名前 | Good | Bad |
---|---|---|
行のカウンター | lineCount | lc, line, l, x |
日付 | currentDate | cd, date, d, x |
アンダースコアは、グローバル変数のようにスコープが異なる場合にのみ使いましょう。
const double GLOBAL_PI = 3.141592;
- tmpやflagといった変数名を使用しない
- もっと具体的な名前を使いましょう。
- 単純ループの変数にはi, j, kを用いてよい
for(int i=0; i < Size; i++) { data[i] = 0; }
- 1,2文字の変数名は以下の場合にしか使わない
- c, ch ... 文字
- i, j, k ... 整数値
- n ... 汎用。何でもよい
- p ... ポインタ
- s ... 文字列
- マクロで定義する値やconst定数値は大文字にする
- マクロについては「マクロの書き方」を参照してください。
- 目的に応じて接頭辞をつける
- 使用目的に沿って以下のような接頭辞をつけると、意味がよりわかりやすくなります。
- head, min ... 配列やリスト自体の最初の要素
- first ... 配列やリストを処理する際の、最初の要素
- tail, max ... 配列やリスト自体の最後の要素
- last ... 配列やリストを処理する際の、最後の要素
[edit] 変数は使う直前で定義する
できる限り各変数のスコープが小さくなるようにし、再利用は避けましょう。変数を再利用しても速度は殆ど向上しません。
[edit] 変数は初期化する
Javaは基本データ型の配列でもメモリ確保をした際に自動的に初期化します。また、初期化の有無をコンパイラがチェックしてくれます。
C++にはそうした便利な機能がありません。必要ないと思っても、必ず初期化する癖をつけましょう。
[edit] 値を変えない変数・関数はfinal, constをつける
変数やメソッド毎に、値を変更するものかそうでないものか、明確にしましょう。 1ヵ月後にプログラムを眺めても中身がすぐわかるように処理目的を書いておきましょう。
[edit] クラス
[edit] クラス名は大文字で始める
クラス名は先頭1文字だけ大文字にして書き出し、単語をつなげるときは先頭だけを大文字にします。
[edit] メンバー変数を公開しない
メンバー変数は原則privateとします。そのまま外に見せてはいけません。別の言い方をすると、Cにおける構造体として利用してはいけません。 アクセスするにはメソッドを用い、値の初期化はクラス生成時におこないましょう。(例えば、メンバー毎にset/getメソッドなどをサポートしない。)
[edit] クラスは参照渡しする
C++では、できる限りクラスの参照渡しを利用しましょう。ポインタを使わざるを得ない場合のみポインタを用い、できるだけconst指定をしてアドレスを弄らないようにしましょう。
[edit] サブクラスを無闇に作らない
サブクラス、特に多重継承(JavaであればInterface)は必要最小限にしましょう。
[edit] 数値
[edit] 大きさが極端に違う浮動小数点値を加減算しない
32ビットマシンの場合、floatは7桁程度の精度しかありません。 つまり、ppm (parts-per-million) レベルの操作をしてはいけません。
float million = 1000000.0; million += 0.1; // 危険!やってはならない
また浮動小数を==オペレータで比較するのもタブーです。
float fvalue1, fvalue2; ... if (fvalue1 == fvalue2) // 危険!やってはならない { ... }
[edit] 文字列
[edit] 長い文字列を定数として使わない
プログラム中で "長い文字列" を入れると読みづらく修正も面倒です。できる限りプログラム先頭で定数として定義しましょう。
[edit] ファイルのスタイル
[edit] 人に見せると思って書く
プログラムはソースを公開するものと思って書きましょう。 そうすると、いい加減な関数名やファイル名をつけられなくなります。
[edit] インデントをいじらない
自分流のインデントだと、自分には見やすくても他人には見辛いものであることを意識しましょう。
[edit] 邪悪なコードを書きたい人へ
[edit] 国際「わかりにくいCコード」コンテスト
IOCCC (The International Obfuscated C Code Contest) というコンテストがあり、優勝者のコードを見ることができます。良い子は決して真似しないでください。
参考までに、Perl言語では様々な詩が作成されています。興味がある人はComputer Poetryというジャンルを見てください。