コーディング規約は一般的には「保守性」や「可読性」を上げるために作られているルールです。
多くのプログラマが関わるシステム開発のプロジェクトの現場では、好き勝手にプログラムを皆が作ると統一性に欠け問題が発生するため、ソースコードの品質を統一するためのコーディングルールがあります。
さらに、Javaにはメソッド名の先頭1文字目は小文字で書くルールなど、企業や個人の開発に関わらず、一般的に言語として守るべきルールがあります。
この記事では、Java言語において最低限、守っておきたたいコーディングルールを紹介します。
命名ルール
命名ルールは、可読性が高いソースコードを作る上で非常に重要です。
クラスやメソッド名は、分かりやすい名前がつけられていれば、第三者がメソッド名を見れば、ある程度の処理内容を掴むことができます。
パッケージ構成
パッケージ名は全て小文字で記述します。
また、業務アプリケーションでは、クラスの役割に従ってパッケージを構成します。WEBアプリケーションの例で言えば、次のような形でパッケージを構成します。
アクションクラス:com.example.action
エンティティクラス:com.example.entity
モデル:com.example.form
DTO:com.example.dto
クラス名
クラス名は、先頭の1文字目は大文字にします。また、クラス名を見ただけで、それがどのような役割を持つクラスなのかが分かるような名前を付けましょう。
悪いクラス名の例
先頭1文字目が小文字
public class taxcalc {
}
クラス名が分かりにくい
public class ClassA {
}
良い例
public class TaxCalc {
}
必要に応じで役割沿ったサフィックス(接尾語)をつける
基本的にJavaの開発では、1つの機能に対し、役割に応じで複数のクラスを作成します。
例えば Springの Web開発であれば、1つの画面を作るだけでも次の種類のクラスのを作ることがあるため、それぞれの役割のクラス名に接尾語を付けて分かりやすくします。
- コントローラークラス
- モデルクラス
- バリデーションクラス
- サービスクラス
- SQLアクセスなどをするDAOクラス
メソッド名
メソッド名は先頭1文字目を小文字とし、動詞から始まるように命名します。さらにメソッドを見ればある程度の処理内容が分かるように意味のある名前にします。
悪いメソッド名の例
先頭1文字目が大文字
public void Create() {
}
メソッド名が分かりにくい
public void create1() {
}
同じようなメソッド名で違いがわからずらい
public void create() {
}
public void create2() {
}
public void createEx() {
}
良い例
public void create() {
}
略しすぎのメソッド名はNG
一昔前のプログラムをメモ帳などで書いていた時代では、極力キーボードのタイプ量を減らすために、メソッド名の文字数は少ないほうが良しとされ、動詞などを略した書き方のメソッド名が散見されました。
現代では、統合開発環境の進化によって、コード補完機能が強化され、一部の名称を入力するだけで該当するメソッドやクラスの候補が表示され、長い名前でも少ないタイプ量でも簡単に入力を行うことが可能です。
例えば、次の例のように動詞の一部が略されたメソッド名の場合、メソッド名を見るだけでは、どのような情報が取得できるのか分かりません。
public void getLUser() {
}
上のメソッドは、次のように略さないメソッド名に変更すれば、非常にわかりやすくなるでしょう。
public void getLoginUser() {
}
変数
定数を除く、ローカル変数やクラス変数は、単語の区切りのみ大文字とし、残りは小文字で宣言します。(先頭1文字目は小文字)また、基本的には名詞の変数名とします。
また、wkやtmpなどのような意味が分りにくい名称は避け、分かりやすい変数名にしましょう。
悪い変数の例
先頭1文字目が大文字、単語の区切りが大文字でない
String Usernane;
変数の役割が分かりにくい
String a;
良い例
String userNane;
ループカウンタ、ストリームなどの命名は慣習に従おう
ループカウンタや、ファイルの入出力を行うストリームなどは、慣習上、決まった変数名を付けます。
まず、ループカウンタは基本的にはiという名前の変数とします。2重ループなどループが入れ子になるループのループカウンタはjを使用して、さらに入れ子になる場合はkなどが一般的に用いられます。
int[] foo = { 1, 2, 3 };
for (int i = 0; i < foo.length; i++) {
System.out.println("i=" + String.valueOf(i));
}
ファイルの読み込みを行うjava.io.InputStreamや、書き込みを行うjava.io.OutputStreamクラスの変数は、inやoutが慣習として変数名に用いられています。
// InputStream
try (final InputStream in = new FileInputStream("file.txt")) {
//ファイル読み込み処理
}
// OutputStream
try (final InputStream in = new FileOutputStream("file.txt", true)) {
//ファイル書き込み処理
}
コメント
クラスやメソッド、定数などの宣言には Javadocコメントでクラスやメソッドの役割を簡潔に記述します。
Javadocコメントは、クラスやメソッド宣言部に「/**」から「*/」の間に書かれたコメントを指します。Javaの世界ではJavadocコメントの形式を使用することが一般的であり、Javadocコメントで書かれたソースコードであれば、ツールを使用してJavaの公式APIドキュメントのようなHTML形式のAPI仕様書を作成することができます。
クラスのJavadocコメント
クラス宣言部のJavadocコメントには、そのクラスがどのような役割を持つクラスなのかを簡潔に記述します。また、クラスの作成者などの情報も記述しておくことで、だれがそのクラスを作成したのかも分かるようにしておきます。
/*** ユーザーの情報を格納するためのクラスです。* @author ポテパン太郎* @version 1.0*/public class User { }
メソッドのJavadocコメント
メソッド宣言部のJavadocコメントには、メソッドの概要や、引数と戻り値、発生する例外などを記述します。メソッドのJavadocコメントは、宣言部のコメントを見ただけである程度の処理内容が理解できるのが理想です。
/*** 年齢の計算* <p>* 誕生日から現時点での年齢を計算する<br>* 税込み金額の計算を行う。* </p>* * @param birthday 誕生日 * @return 現時点での年齢(birthdayがnullの場合は -1を返す)*/public int calcAge(DateTime birthday) { }
例外が発生する恐れがあるメソッドの場合は、@throwsでスローされる可能性がある例外もコメントに記述しましょう。
/*** ...* @throws FileNotFoundException 指定したCSVファイルが見つからない時*/public int readCsv(String filePath) { }
まとめ
Javaで守っておきたいコーディング ルールについて解説してきました。冒頭でも述べたように、システム開発の現場では複数名でのチームでシステムを開発していくため、コーディング規約を定めてルールに沿って統一化されたプログラムを作っていくことが一般的です。
プログラマーを目指す場合は、技術も必要ですが、こういったチームでの協調性を守ることも必要です。コーディング規約を守ることで「保守性」や「可読性」の高いコードをチームで生産できるようにしましょう。
@authorや@versionの指定は任意で、プロジェクトによっては記述を省略することもあります。