Aritalab:Lecture/Programming/Style

From Metabolomics.JP
< Aritalab:Lecture | Programming(Difference between revisions)
Jump to: navigation, search
m
Line 1: Line 1:
 
==Elements of Programming Style==
 
==Elements of Programming Style==
  
===プログラム設計の作法===
+
==プログラム設計==
; プログラムソースは目的別にディレクトリにまとめる
+
===プログラムソースは目的別にディレクトリにまとめる===
: JavaでもCでも、関連する内容毎にディレクトリを作成する
+
  
; オブジェクト指向で書く
+
JavaでもCでも、関連する内容毎にディレクトリを作成する
: Javaは半ば強制ですが、C&#43;&#43;で書く場合も、処理をクラスにまとめましょう
+
  
; サブクラスを無闇に作らない
+
===オブジェクト指向で書く===
: サブクラス、特に多重継承(JavaであればInterface)は必要最小限にしましょう
+
  
 +
Javaは半ば強制ですが、C&#43;&#43;で書く場合も、処理をクラスにまとめましょう
  
===各ファイル中での作法===
 
; インデントをいじらない
 
: 自分流のインデントだと、自分には見やすくても他人には見辛いものであることを意識しましょう
 
  
; 変数は使う直前で定義する
+
==変数宣言==
: 各変数のスコープが小さくなるようにし、再利用は避けましょう。変数を再利用しても速度は殆ど向上しません。
+
  
; 値を変更しない変数や関数はfinal, constをつける
+
===変数には内容を説明する名前をつける===
: 1ヵ月後にプログラムを眺めても中身がすぐわかるように処理目的を書いておきましょう。
+
変数は小文字で書き出し、単語をつなげるときは先頭だけを大文字にします。
 +
基本的に、名前の区切りにアンダースコア(_)は使いません。
  
; ポインタの指す位置に注意する
+
{| style="text-align:center" class="wikitable"
: C&#43;&#43;でもできる限りクラスの参照渡しを利用しましょう。ポインタを使わざるを得ない場合、ポインタ内のアドレスを弄らないようにしましょう。
+
! 名前
 +
!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&#43;&#43;にはそうした便利な機能がありません。必要ないと思っても、必ず初期化する癖をつけましょう。
 +
 
 +
===値を変えない変数・関数はfinal, constをつける===
 +
変数やメソッド毎に、値を変更するものかそうでないものか、明確にしましょう。
 +
1ヵ月後にプログラムを眺めても中身がすぐわかるように処理目的を書いておきましょう。
 +
 
 +
==クラス==
 +
 
 +
===クラス名は大文字で始める===
 +
クラス名は先頭1文字だけ大文字にして書き出し、単語をつなげるときは先頭だけを大文字にします。
 +
 
 +
===メンバー変数を公開しない===
 +
メンバー変数は原則privateとします。そのまま外に見せてはいけません。別の言い方をすると、Cにおける構造体として利用してはいけません。
 +
アクセスするにはメソッドを用い、値の初期化はクラス生成時におこないましょう。(例えば、メンバー毎に<tt>set/get</tt>メソッドなどをサポートしない。)
 +
 
 +
===クラスは参照渡しする===
 +
C&#43;&#43;では、できる限りクラスの参照渡しを利用しましょう。ポインタを使わざるを得ない場合のみポインタを用い、できるだけconst指定をしてアドレスを弄らないようにしましょう。
 +
 
 +
===サブクラスを無闇に作らない===
 +
サブクラス、特に多重継承(JavaであればInterface)は必要最小限にしましょう。
 +
 
 +
==数値==
 +
===大きさが極端に違う浮動小数点値を加減算しない===
 +
32ビットマシンの場合、7桁程度の精度しかありません。つまり、ppm (parts-per-million) レベルの操作をしてはいけません。
 +
<pre>
 +
float million = 1000000.0;
 +
million += 0.1; // 危険!やってはならない
 +
</pre>
 +
また浮動小数点に<tt>==</tt>オペレータで比較するのもタブーです。
 +
 
 +
==文字列==
 +
===長い文字列を定数として使わない===
 +
プログラム中で "長い文字列" を入れると読みづらく修正も面倒です。できる限りプログラム先頭で定数として定義しましょう。
 +
 
 +
===stringクラスを使う===
 +
単純な文字列でも、できる限りstringクラスを使いましょう。自分で<tt>char*</tt>を使うことは、できる限り避けましょう。以下は、それでも<tt>char*</tt>を使いたい人に向けたヒントです。
 +
 
 +
* 文字列は文字数+1の長さを宣言する。最後のnull文字分を忘れないように。
 +
* 文字列のメモリはcallocで確保する。callocはmallocした後に0で初期化するのと同じです。
 +
* strncpy, strncmpを利用する。strcpyやstrcmpはnull文字が出てくるまで処理を続けます。できる限り、処理する長さを自分で管理してください。
 +
 
 +
==ファイルのスタイル==
 +
===インデントをいじらない===
 +
自分流のインデントだと、自分には見やすくても他人には見辛いものであることを意識しましょう。

Revision as of 17:16, 12 October 2010

Contents

Elements of Programming Style

プログラム設計

プログラムソースは目的別にディレクトリにまとめる

JavaでもCでも、関連する内容毎にディレクトリを作成する

オブジェクト指向で書く

Javaは半ば強制ですが、C++で書く場合も、処理をクラスにまとめましょう


変数宣言

変数には内容を説明する名前をつける

変数は小文字で書き出し、単語をつなげるときは先頭だけを大文字にします。 基本的に、名前の区切りにアンダースコア(_)は使いません。

名前 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 ... 配列やリストを処理する際の、最後の要素

変数は使う直前で定義する

できる限り各変数のスコープが小さくなるようにし、再利用は避けましょう。変数を再利用しても速度は殆ど向上しません。

変数は初期化する

Javaは基本データ型の配列でもメモリ確保をした際に自動的に初期化します。また、初期化の有無をコンパイラがチェックしてくれます。

C++にはそうした便利な機能がありません。必要ないと思っても、必ず初期化する癖をつけましょう。

値を変えない変数・関数はfinal, constをつける

変数やメソッド毎に、値を変更するものかそうでないものか、明確にしましょう。 1ヵ月後にプログラムを眺めても中身がすぐわかるように処理目的を書いておきましょう。

クラス

クラス名は大文字で始める

クラス名は先頭1文字だけ大文字にして書き出し、単語をつなげるときは先頭だけを大文字にします。

メンバー変数を公開しない

メンバー変数は原則privateとします。そのまま外に見せてはいけません。別の言い方をすると、Cにおける構造体として利用してはいけません。 アクセスするにはメソッドを用い、値の初期化はクラス生成時におこないましょう。(例えば、メンバー毎にset/getメソッドなどをサポートしない。)

クラスは参照渡しする

C++では、できる限りクラスの参照渡しを利用しましょう。ポインタを使わざるを得ない場合のみポインタを用い、できるだけconst指定をしてアドレスを弄らないようにしましょう。

サブクラスを無闇に作らない

サブクラス、特に多重継承(JavaであればInterface)は必要最小限にしましょう。

数値

大きさが極端に違う浮動小数点値を加減算しない

32ビットマシンの場合、7桁程度の精度しかありません。つまり、ppm (parts-per-million) レベルの操作をしてはいけません。

float million = 1000000.0;
million += 0.1; // 危険!やってはならない

また浮動小数点に==オペレータで比較するのもタブーです。

文字列

長い文字列を定数として使わない

プログラム中で "長い文字列" を入れると読みづらく修正も面倒です。できる限りプログラム先頭で定数として定義しましょう。

stringクラスを使う

単純な文字列でも、できる限りstringクラスを使いましょう。自分でchar*を使うことは、できる限り避けましょう。以下は、それでもchar*を使いたい人に向けたヒントです。

  • 文字列は文字数+1の長さを宣言する。最後のnull文字分を忘れないように。
  • 文字列のメモリはcallocで確保する。callocはmallocした後に0で初期化するのと同じです。
  • strncpy, strncmpを利用する。strcpyやstrcmpはnull文字が出てくるまで処理を続けます。できる限り、処理する長さを自分で管理してください。

ファイルのスタイル

インデントをいじらない

自分流のインデントだと、自分には見やすくても他人には見辛いものであることを意識しましょう。

Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox