Aritalab:Lecture/Programming/Style

From Metabolomics.JP
< Aritalab:Lecture | Programming(Difference between revisions)
Jump to: navigation, search
m
m
Line 114: Line 114:
 
===国際「わかりにくいCコード」コンテスト===
 
===国際「わかりにくいCコード」コンテスト===
 
いまは開催されていませんが、[http://www0.us.ioccc.org/main.html IOCCC] (The International Obfuscated C Code Contest) というコンテストがあり、[http://www0.us.ioccc.org/winners.html 優勝者のコード]を見ることができます。良い子は決して真似しないでください。
 
いまは開催されていませんが、[http://www0.us.ioccc.org/main.html IOCCC] (The International Obfuscated C Code Contest) というコンテストがあり、[http://www0.us.ioccc.org/winners.html 優勝者のコード]を見ることができます。良い子は決して真似しないでください。
 +
 +
参考までに、Perl言語では様々な詩が作成されています。興味がある人は以下のページをどうぞ。
 +
* [http://internet.ls-la.net/ Best of Internet]

Revision as of 11:54, 13 October 2010

Contents

プログラム設計

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

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文字が出てくるまで処理を続けます。できる限り、処理する長さを自分で管理してください。

ファイルのスタイル

人に見せると思って書く

プログラムはソースを公開するものと思って書きましょう。 そうすると、いい加減な関数名やファイル名をつけられなくなります。

インデントをいじらない

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

邪悪なコードを書きたい人へ

国際「わかりにくいCコード」コンテスト

いまは開催されていませんが、IOCCC (The International Obfuscated C Code Contest) というコンテストがあり、優勝者のコードを見ることができます。良い子は決して真似しないでください。

参考までに、Perl言語では様々な詩が作成されています。興味がある人は以下のページをどうぞ。

Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox