どのプログラミング言語を使用する場合でも、よいコードを書くための基本は「見やすさ」である。「見やすさ」とは統一されたフォーマット、簡潔なロジック、コメントによる補足説明などから実現し、他の人がそのコードの内容をスムースに理解できることを目的とする。時にはプログラム作成者でさえ、1週間もすればそのコードの意味を忘れてしまい、他の人と変わらなくなってしまう場合もある。結局のところ、「見やすさ」の考慮は自分にとっても、他人にとっても大切なことなのである。
ここで示すコーディングルールは、当社標準化プロジェクトにて規定した社内ルールであり、その他の技術者向けに策定したものではない。従って、本ルールを参照する技術者の方々については、それぞれの感性にてカスタマイズして適用していただきたい。
ネーミング
パッケージ名
パッケージ名は”.”で区切った文字列で定義し、基本的には英小文字を使用する。
パッケージの機能が判断できる名前を使用し、単語の短縮形は極力避ける。
クラス名
クラス名は先頭文字を大文字にする。複数の単語を組み合わせて構成する場合は、各単語の先頭を大文字にする。クラス名には意味のある文字列を使用する。
}
public class LocalFormatString {
}
例外クラス名
例外クラス名はクラス名の最後に”Exception”をつける。
}
インタフェース名
インタフェース名はクラス名の規約に準ずる。なお、クラス名と区別する必要がある場合は明示的に先頭に”I”をつける。
}
public class Sample implements ISample {
}
抽象クラス名
抽象クラス名はクラス名の規約に準ずる。なお、適当な名前がない場合は明示的に”Abstract”から始まり、サブクラス名を連想させるクラス名をつける。
}
実装クラス名
実装クラス名はクラス名の規約に準ずる。なお、インタフェースと区別する必要がある場合は明示的にクラス名の最後に”Impl”をつける。
}
メソッド名
メソッド名は小文字を基本とする。複数の単語を組み合わせて構成する場合は、各単語の先頭を大文字にする。メソッド名には意味のある文字列を使用する。
}
ファクトリメソッド名
ファクトリメソッド(オブジェクトをnewするメソッド)名はメソッド名の先頭に”create”をつけ、その後ろにメソッドで生成するオブジェクト名を続ける。
}
コンバータメソッド名
コンバータメソッド(オブジェクトを別のオブジェクトへ変換するメソッド)名はメソッド名の先頭に”to”をつけ、その後ろにメソッドで変換するオブェクト名を続ける。
}
属性取得メソッド名
属性取得メソッド(ゲッターメソッド)名はメソッド名の先頭に”get”をつけ、その後ろにメソッドで取得する属性名(プロパティ)を続ける。
public String getEmploeeName() {
return emploeeName;
}
属性設定メソッド名
属性設定メソッド(セッターメソッド)名はメソッド名の先頭に”set”をつけ、その後ろにメソッドで設定する属性名(プロパティ)を続ける。
public void setEmploeeName(String name) {
emploeeName = name;
}
boolean変数を返却するメソッド名
boolean変数を返却するメソッド名は戻り値の状態が判断できる名前をつける。メソッド名の先頭に”is”、”can”、”has”等をつけ、その後ろに形容詞、動詞、名詞を続ける。
}
public boolean canDelete() {
}
public boolean hasValue() {
}
変数名
変数名は小文字を基本とする。複数の単語を組み合わせて構成する場合は、各単語の先頭を大文字にする。(メソッド名と同一規約)
boolean変数の場合はその変数の状態が判断できる名前をつける。変数名の先頭に”is”、”can”、”has”等をつけ、その後ろに形容詞、動詞、名詞を続ける。
private boolean isEmpty;
private boolean canDelete;
private boolean hasValue;
定数名
定数名はすべて大文字とする。複数の単語を組み合わせて構成する場合は、各単語の間を”_”(アンダースコア)で区切る。
public static final int MAX_VALUE = 100;
ループカウンタ
スコープが狭いループやイテレータでは、そのループカウンタとして”i”、”j”、”k”...の文字をアルファベット順で使用する。(通常処理やスコープの広いループでは使用しない)
}
}
}
スタイル
コメント
ファイルの先頭にコピーライト、およびシステム名等を記述する。なお「javadocコメント」を使用せず、/* (コメント) */の形式を用いる。
* $Id$
* Copyright (c) 2006 PRIME CO.,LTD All Rights Reserved.
*
* システム名: プロジェクト管理システム
* サブシステム名: 日報・月報管理
*
* 作成者: t.sugahara
* 日付: $Date$
* バージョン: $Revision$
* メモ:
*
* 履歴:
* 変更ID 変更日 変更者 変更理由
* —————————————————–
* A001 2006/05/23 t.sugahara 新規作成
* —————————————————–
*/
publicクラス、およびメソッドのコメントでは「javadocコメント」を活用する。
書式
・「/**」ではじめ、「*/」で終わる。
基本的には1行目を「/**」とし、2行目以降を「*」ではじめる。最終行を「*/」で終わる。
タグ
@author [作成者]
クラスの作成者を明記する。
@param [パラメータ名] [説明]
メソッドにパラメータがある場合、そのパラメータの名称と説明を明記する。
@return [戻り値]
メソッドに戻り値がある場合、その戻り値の説明を明記する。
@exception [例外名]
メソッド内で発生する例外がある場合、その例外名を明記する。
@version [バージョン]
クラスのバージョンを明記する。
上記以外のタグもあるが、適宜、必要なものを記述する。
補足
クラス、およびメソッドの定義が始まる直前にコメント行を配置し、そのクラスの機能概要、外部インタフェースについて記述する。
なお、最初の1行目はHTMLのメソッドインデックスに使用されるため、外部へ公開するための要約した短い説明にとどめ、その行は半角ピリオド(.)、または
HTMLタグで閉じる。
詳細については「javadoc」のドキュメントを参照のこと。
* プロジェクト日報に関するデータアクセスクラス.
* 日報データの読み書き機能を提供する.
*
* @author t.sugahara
* @version 1.0
*/
public class PmsDailyLog {
/**
* 日報データ管理情報からタグ名を取得する.
* @param kind 管理情報区分
* @return タグ名
* @exception PmsException システム障害を返却する
*/
public String getTagName(int kind)
throws PmsExcption {
<省略>
return m_mngData.tagName;
}
}
改行のルール
プログラムの見やすさを考慮した場合、1行の長さを適度に制限する必要がある。基本的には80桁以内を目安とし、それを超える場合は行を分割する。行を分割するには、「,(カンマ)」の位置での改行、または演算子(複数の演算子を使用している場合は優先順位の低い演算子)の前で改行を入れる。このような考慮をするだけで、コードの可読性が高まる。
package宣言とimport宣言
ファイルの先頭に書いたコメント(コピーライト、およびシステム名等)の下にpackageの宣言を記述する。次に1行空けてimportの宣言を記述する。また、import宣言では「*」を使わない。(「*」を使用すると実際に使用しているパッケージが不明確になってしまう)
* $Id$
* Copyright (c) 2006 PRIME CO.,LTD All Rights Reserved.
*
* システム名: プロジェクト管理システム
* サブシステム名: 日報・月報管理
*
* 作成者: t.sugahara
* 日付: $Date$
* バージョン: $Revision$
* メモ:
*
* 履歴:
* 変更ID 変更日 変更者 変更理由
* —————————————————–
* A001 2006/05/23 t.sugahara 新規作成
* —————————————————–
*/
package jp.co.prime97.Pms.manage
import java.util.Date;
import java.util.HashMap;
import java.util.Vector;
不要メソッド・変数の削除
プログラム内で使用していない変数(インスタンス変数、ローカル変数)は必ず削除する。不要な変数があると、プログラムの可読性が低くなる。同様にメソッドについても使用しないものについては実装しない。後々必要と思えるものについても、必要となったときに実装する。
フォーマット
見た目のフォーマットは非常に大切である。技術者の感性は様々であり、統一は困難であるが基本方針について記述する。
・1行の文字数を最大80桁とする。
・インデントは空白4文字分とする。その際、タブは使用せず空白文字を使用する。
・1行に複数のステートメント(式)を記述しない。
(変数定義も同様に、1行1変数の宣言とする)
・不等号の向きは左向き(「<」、「<=」)にする。
(定数と比較する場合は右向きでも可)
・不等号で使用する定数は右側に配置する。
・カンマの後には空白文字を入れる。
・for文の「;(セミコロン)」の後には空白文字を入れる。
・算術演算子(「+」、「-」、「*」、「/」、「%」)の前後には空白文字を入れる。
・算術演算子(「++」、「--」)とオペランドの間には空白文字を入れない。
・代入演算子(「=」、「+=」、「-=」、「*=」、「/=」、「%=」)の前後には空白文字を入れる。
・比較演算子(「<」、「<=」、「==」、「>」、「>=」、「!=」)の前後には空白文字を入れる。
・条件演算子(「||」、「&&」、「|」、「&」、「^」、「!」)の前後には空白文字を入れる。
・シフト演算子(「<<」、「>>」、「>>>」)の前後には空白文字を入れる。
・ビット演算子(「|」、「&」、「^」、「~」)の前後には空白文字を入れる。
・return文では括弧を使用しない。
(メソッドでなく式であることを明確にする)
文法の基本形
文法の書式・形式についてもフォーマットと同様、技術者の感性に依存する部分である。基本方針について記述する。
・for文で使用するカウンタはfor文のカウンタ宣言にて行なう。
(for文の外側で宣言しない)
・for文とwhile文の使用用途を明確にする。
(カウンタを利用する規則的な繰り返しの場合はfor文、それ以外はwhile文を使用する)
・for文で使用するカウンタの初期値は「0」を基本とする。
(配列の添字は「0」からである.カウンタはインデックスの役割で使用する場合が多い)
・制御文(「if」、「else」、「while」、「for」、「do while」)での「{}」は省略しない。
(1行の式でも省略しない.機能追加時のバグ発生を避けられる)
・ローカル変数は利用する直前で宣言する。
(C言語のように関数の入り口で宣言しない)