自分用のコーディング規約

# はじめに
開発に携わる、すべての人たちが直感的に学習および理解できるコードを目指す。
一個人の意見ではあるが、標準のAPIやライブラリをできる限り用いること。学習面でいうと一度目にしたことがあったりドキュメントが豊富であるから。高品質なレビューやテストを受けているため信頼性が高い。（なるべく責任を押し付けていきたいってこと）
コードスタイルの基本をグーグルスタイルとしている。

[グーグルスタイルのJava規約](https://google.github.io/styleguide/javaguide.html)
明確に違いが説明できる知識さえあれば、バグの早期発見など開発に貢献することができる。

# 命名規則
**シンプルである**

単純な単語、文章のような命名が一番理解しやすいと思う。なぜなら大まかな処理、動作が想像できるからである。業界全体で浸透している略語であれば問題ない。しかし、関係性や状態が不明瞭な命名は行わない。

:::note
問題ない
index, idx
counts, wins 
countWin, winCount
URL, USA // 頭字語 ユーアールエル とか
NASA // 頭文字語 ナサ とか
:::



:::note alert 
問題あり
tbl, mst, rslt
num // なんの値？ 
flg // なに関係するの？どの状態がtrue？ 
:::

# クラスの中身
**クラス名に沿った実装、必要最低限の宣言を行うべきである**

クラス図などで関係性を表すことによりおかしなクラスの責務を持っていることを認識することができる。
本来は複数で構成されるべきクラスが１つのクラスに纏められていたり、仕様書やJavaDoc、ソースコードなどを読み解かなければいけないほど複雑なコードであったり、これらはバグの温床になりやすい。さらに可読性や保守性にも繋がる重要な箇所であるため、慎重にクラスを設計すべきである。
によりより明確に責務を持たせることができる。


## おまけ：クラス名について
### Enum~, I~
古い慣例によって生み出された悲しい化け物である。生息地は古いライブラリやアプリ。
今の流行りは、ResponseResult(enum)にSUCCESS,FAILがあったとしたら日本語に直すと
「レスポンスのリザルトが成功でした。」のような一文で意味の通る命名規則になっている。

### ~Entity
JPAで使用されるクラス
* クラスに javax.persistence.Entity アノテーションが付与されていること
* クラスに 引数のない public または protected のコンストラクタが宣言されていること
* クラスや変数、メソッドなどの宣言に final を付与していないこと
* インスタンス変数は、public 以外のアクセス修飾子を付与しメソッドを介して値の設定や取得を行えること
* クラスに java.io.Serializable インターフェースを継承していること（必要であれば）

### ~Bean
JavaBeansの仕様に沿ったクラスであることを示す

サイトなどに記載されているやり方は、デファクトスタンダードである。
その条件が以下の３つである。
* クラスに java.io.Serializable インターフェースを継承していること
* クラスに 引数なしの public コンストラクタが宣言されていること
* setter と getterの両方もしくは片一方が宣言されていること

ソースコードを読み解くと実際にJavaBeansとして認識される条件が以下の３つであることが判明した。
* インターフェースクラス ではないこと
* 変数に transient が付与されていないこと
* 変数に static が付与されていないこと

##### *1 : [シリアライゼーション、Beans、および PMD](https://wordpress.adamkoch.com/2012/08/28/serialization-beans-and-pmd/)

### ~Util, ~Utils, ~Utility
便利なメソッドをまとめたクラスであることを示す

有名なライブラリでは両方を満たしていることが多い。
* 引数なしプライベートコンストラクタ
* すべてstaticメソッドである
* 並列処理でも問題なく動作する

## コードを積み木として

```java
private boolean hasItem(Item item){
    for(Item inventoryItem : this.getUser().getInventoryItems()){
        if(inventoryItem.getId().equals(item.getId())){
            return true;
        }
    }

    return false;
}
```
このコードのパターンをよく見かけたことがある。
今回の例は短くて読み手には負担がかからないが、これ以上に長いコードも存在する。
```java
private boolean hasItem(Item item){
    final Inventory inventory = this.getUser().getInventory();
    final List<Item> inventoryItems = inventory.getItems();
    
    final Item itemId = item.getId();
    
    for(Item inventoryItem : inventoryItems){
        final Item inventoryItemId = inventoryItem.getId();
    
        if(inventoryItemId.equals(itemId)){ // この部分を短くするだけでも読みやすくなる
            return true;
        }
    }

    return false;
}
```

```java
// 悪い例
final boolean isHovered = (x <= mouseX && mouseX <= (x + width )) 
                       && (y <= mouseY && mouseY <= (y + height));

// 良い例 
final boolean isHovered = this.isHovered(mouseX, mouseY, x, y, width, height);

public static boolean isHovered(double mouseX, double mouseY, ...){
    final double minX = x;
    final double maxX = x + width;
    final double minY = y;
    final double maxY = y + height;

    return (minX <= mouseX && mouseX <= maxX) 
        && (minY <= mouseY && mouseY <= maxY);
}
```

## 例外処理

・原則、例外クラスの自作は禁止
・適切なクラスでラップすること


# インデントレベル
原則レベルは、３までとする。超える場合はしょうがない。



## for文 while文 について

禁止事項
* 再帰処理
* ラベルを付与およびラベルジャンプ


# 条件式

条件式はboolean型の変数またはメソッドのみしか書いてはいけない。
```java
// 悪い例
if ( 0 < size ) { ... }

// 良い例 変数を用意
final boolean hasChildren = 0 < size;

if ( hasChildren ) { ... }

// 良い例 メソッドを用意
boolean hasChildren(){
  return 0 < this.list.size;
}

if ( this.hasChildren() ) { ... }
```

# 演算
比較や計算時に どれを優先的に計算させているのか、
目で分かるようにするために括弧でグループ化をする。
全員、優先順位を覚えていること前提でコードを書いてはいけない。

## 三項演算子
[条件式](条件式) を変数へ移すことによって、switch 文のような記述ができるため禁止はしていない。
```java
color = isRed    ? 0xFF0000 
      : isGreen  ? 0x00FF00
      : isBlue   ? 0x0000FF
      : 0xFFFFFF
```