seen from Canada
seen from United States
seen from United States
seen from Russia
seen from United States
seen from China

seen from Canada

seen from United States

seen from Argentina

seen from United States

seen from China
seen from United States
seen from United States
seen from United States
seen from Mexico

seen from Spain
seen from United States
seen from Belarus
seen from Canada
seen from China
こういうのは知識としても覚えておきたいけど、IDE やらエディタの機能で自動的に管理したいところ。人の手でやると 256% うまくいかない
ネーミングルール 全般 英語を使え! 大文字・小文字の違いで名前を区別しない パッケージ パッケージ名は全て小文字にする パッケージ名には意味のある名前を付ける パッケージ名は省略しない サブパッケージ名の重複は可能 クラス・インタフェース クラス名は役割を表す名前にする クラス名は単語の先頭を大文字にする 例外クラス名は末尾に「Exception」を付ける インターフェイス名はクラス名に準ずる 抽象クラス名はクラス名に準ずる 実装クラス名はクラス名に準ずる 能力付加型のインタフェース名は末尾に「able」を付ける テストクラス テストクラス名は「テスト対象クラス名+Test」にする すべてのテスト/パッケージテストを行うクラス名は メソッド コンストラクタと同じ名前のメソッドはつくらない メソッド名は区切りのみ大文字にする ファクトリメソッド名は「"create"+オブジェクト名」にする コンバータメソッド名は「"to"+オブジェクト名」にする ゲッターメソッド名は「"get"+属性名」にする セッターメソッド名は「"set"+属性名」にする 「boolean変数」を返すメソッド名はtrue/falseの状態がわかるようにする 英単語の対義語を意識せよ! 引数 メソッドのパラメータ(引数)名とインスタンス変数名を一緒にしない 変数全般 変数名は区切りのみ大文字にする 「boolean変数」には「true/false」の状態がわかる名前を付ける 定数はすべて「static final」とし、すべて大文字で、「_」で区切る 変数名は役割を表すものにする ローカル変数 スコープが狭い変数名は、省略した名前でもよい 「for文」のループカウンタは、ネストごとに「i」「j」「k」...を使う コーディングルール/基礎編 全般 推奨されないAPIを使用しない 使われないコードは書かない 宣言は適切な権限で行う 「final」修飾子は適切に利用する プリミティブ型と参照型の違いを意識する メトリクス 1メソッド行数は20行以下 1クラスの行数は約600行以下 1クラス無いの「public」メソッド数は30個以下 1パッケージ内のクラス数は10個以下 循環的複雑さを大きくしない フォーマット タブは利用せず、空白文字を利用する インデントは空白文字4文字分 長すぎる行は避ける 「{」の後にステートメントを記述しない 1行に2つ以上のステートメントを記述しない カンマの後には空白文字を入れる 「for」文のセミコロンの後には空白文字を入れる 算術演算子(「+」「-」「*」「/」「%」の前後には空白文字を入れる 代入演算子(「=」「+=」「-=」「*=」「/=」「%=」の前後には空白文字を入れる 「++」や「--」とオペランドの間には空白文字を入れない 関係演算子(「<」「>」「>=」「<=」「==」「!=」)の前後には空白を入れる ビット演算子(「|」「&」「^」「<<」「>>」)の前後には空白文字を入れる 論理演算子(「||」「&&」)の前後には空白文字を入れる 「return文」ではカッコを使わない boolean変数はすでに比較済み 不等号の向きは(「<」「<=」)に統一する コメント 「javadocコメント」として、少なくとも「authorとversion」、及び「param,returnとexception」を記述する コメントは必要な物だけを簡潔に インポート 「java.lang」パッケージはインポートしない クラス 継承させたくないクラスには「final」を宣言する フィールドを宣言する順序は、「public」、「protected」、デフォルト、private」の順 コンストラクタ 「public」宣言していないクラスには「public」権限のコンストラクタを作らない デフォルトコンストラクタは原則作成する メソッド オーバーライドさせたくないメソッドには「final」を宣言する サイズが0の配列を利用する 「public」メソッドはクラスの整合性を壊さないような設計を 一つのメソッドには一つの役割を担当させる メソッドの戻り値として「this」は利用しない 引数の数が同じメソッドのオーバーロードは利用しない クラスメソッド クラスメソッドを利用する時は、クラス名を使って呼び出す 変数全般 一つのステートメントには一つの変数宣言 リテラル値は原則として使用しない 配列宣言は「型名[]」にする 定数は「final」宣言する 出来るだけローカル変数を利用する インスタンス インスタンス変数初期化は、次のいずれかの時点で行う インスタンス変数は「private」宣言する クラス変数 「public static final」宣言した配列を利用しない クラス変数にはクラス名を使用してアクセスする ローカル変数 ローカル変数は利用する直前で宣言する ローカル変数は安易に再利用しない 文字操作 文字列リテラルに「new」演算子は不要 文字列どうしが同じ値かを比較するときは、「equals()」メソッドを利用する 更新される文字列には「StringBuffer?」クラスを利用する 更新されない文字列には「String」クラスを利用する 文字列リテラルと変数の比較には、文字列リテラルの「equals()」メソッドを利用する 「String Buffer」クラスの文字列の比較には「equals()」メソッドはそのままでは使えない プリミティブと「String」オブジェクトの変換には、「変換メソッド」を利用する 文字列の中に、ある文字が含まれているか調べるには、「charAt()」メソッドを利用する システム依存記号(「\n」、「\r」など)は使用しない 数値 誤差の無い計算をするには、「BigDecimal?」クラスを使う 数値の比較は精度に気をつける 低精度なプリミティブ型にキャストしない 日付 日付を表す配列には「long型」配列を利用する コーデングルール/プログラム編 継承 スーパークラスのインスタンス変数をサブクラスでオーバーライドしない スーパークラスの「private」メソッドと同じ名前のメソッドをサブクラスで定義しない 抽象メソッドを利用する 「equals()」メソッドを実装した場合は、コレクションクラスに格納することを想定して「hashCode()」メソッドも実装する 可能な限り「toString()」メソッドを実装する 「Cloneable」インタフェースは明示的に実装する インスタンス オブジェクトどうしは「equals()」メソッドで比較する オブジェクトはクラス名では比較しない オブジェクトの参照にはインタフェースを利用せよ! キャスト処理は「instanceof」演算子で囲む 制御構造 制御文(if,else,while,for,do-while)の「{}」は省略しない ステートメントがない空の「{}」ブロックを記述しない 「if/while」の条件式で「=」は利用しない 「for文では、カウンタ条件の定義と「for文」での記述は省略しない 「for文」と「while文」を正しく使い分ける 「for文」のカウンタは「0」から始める 「for文」を利用した繰返し処理の中でカウンタ変数の値を変更しない 「break文」や「continue文」の使用は避けた方がコードがわかりやすい 配列のコピーには「arraycopy()」メソッドを利用する 繰返し処理中のオブジェクトの生成はできるだけ避ける 「if文」と「else文」の繰り返しや「switch文」の利用はなるべく避け、オブジェクト指向の手法を利用する 繰り返し処理のループでは、原則として「try/catchブロック」を利用しない コレクション Java2以降のコレクションクラスを利用する 特定の型のオブジェクトだけを受け入れるコレクションクラスを利用する ストリーム ストリームを扱うときは、「finallyブロック」でクローズ処理する 「ObjectOutputStreem?」では「teset()」メソッドを利用する 例外 「catch文」受け取る例外は、詳細な例外クラスで受け取る 「Exception」クラスのオブジェクトを生成してスローしない 「finallyブロック」には戻り値に影響がある記述はしない 「catchブロック」では必ず処理をする 例外クラスは無駄に定義しない 「Error」「Throwable」クラスを継承しない スレッド スレッドプログラミングでは「Runnable」インタフェース実装が原則 待機中のスレッドを再開するには「notifyAll()」メソッドを利用する 「Thread」クラスの「yield()」メソッドは利用しない 「synchronizedブロック」から「synchronizedブロック」のあるメソッドを呼び出さない 「wait()」「notify()」「notifyAll()」メソッドは、「synchronizedブロック」の中で利用する 「wait()」メソッドは「whileブロック」の中で利用する 同期化(synchronized)の適用は必要な部分だけにする ポーリングは利用せず「wait()」「notifyAll()」メソッドによる待ち合わせを利用する ガーベッジコレクション 「finalize()」をオーバーライドした場合は「super.finalize()」を呼び出す アプリケーションから「finalize()」を呼び出さない Javaにおけるコーディング規約
Google の C++ コーディングルール。天下の Google でもルールは案外普通。
Java に限定しない、OOP ならどれも知っておくべきこと。