# Java 程式風格

## 如果為了更好的可讀性、可以違反下列規則

以下建議是為了增加可讀性，使程式碼容易被了解、維護、較一致。

## Naming Conventions

### General Naming Conventions

#### package 全小寫

```
com.company.application.ui
```

#### 資料型態(Type)必須是名詞，開頭大寫，大小寫並用，駝峰

```
AudioSystem
```

#### 變數命名 開頭小寫，大小寫並用，駝峰

```
audioSystem
```

&#x20;_**這樣的方式，可以容易將型態和變數做區隔，避免潛在的宣告衝突。**_&#x20;

#### 常數的命名(final的變數) 全大寫，並使用 "\_" 來分隔每個 key words

```
COLOR_RED
```

#### Method的名稱必須是動詞，開頭小寫，大小寫並用，駝峰

```
getName()
```

#### 命名時，"不要"將專有名詞的縮寫或簡稱全部大寫

```
exportHtmlSource()
```

#### 私有成員變數 的命名，在後面加 (\_)

```
private String name_;
```

&#x20;**&#x20;**_**除了變數的名稱和型態，最重要的就是有效範圍。**_**&#x20;**  &#x20;**&#x20;**_**利用(\_\_) 可以很容易跟暫存變數做區別。**_**&#x20;**  &#x20;**&#x20;**_**對於我們來說，class variable 比 method variable 更重要也更有意義。 所以class variable 應該被突顯。**_**&#x20;**  &#x20;**&#x20;**_**對 setter method 來說，也可輕易找到合理的參數名稱，避免混淆**_**&#x20;**  &#x20;**&#x20;**_**(\_\_)建議加在後面，因為可讀性比較好**_**&#x20;**&#x20;

#### 共用的變數名稱，應該和資料型態(Type)有一樣的命名

```
void setTopic(Topic topic)

NOT: void setTopic(Topic value)
```

&#x20;**&#x20;**_**減少使用不同的 專有名詞 or 不同名稱 的數量，可降低複雜性。且可從變數名稱輕易推斷出型態。**_**&#x20;**  &#x20;**&#x20;**_**如果某些理由讓此慣例變得不洽當，這強烈地意味著此型態(Type)的定義或命名並不洽當。**_**&#x20;**  &#x20;**&#x20;**_**非共用的變數名稱都有其扮演的角色，可結合角色與型態，來命名這些變數， 例如: Point startingPoint, centerPoint;**_**&#x20;**&#x20;

#### 所有的命名都應以英文(English)來書寫

變數在命名時，當使用的範圍較大者 命名可以長一點，反之 使用範圍較小 命名就短一點。

&#x20;**&#x20;**_**暫時儲存所用的變數或索引(index) 的命名最好短一點，我們在看的時候，就可以假設他不會被其他地方用到。**_**&#x20;**  &#x20;**&#x20;**_**一般整數的暫存變數，會命名為 i, j, k, m, n**_**&#x20;**  &#x20;**&#x20;**_**而字元(character)則會命名為 c, d**_**&#x20;**&#x20;

#### 倘若Method 命名裡的某些單字意義，若已隱含在物件的名稱裡，就可以拿掉

```
line.getLength();

NOT: line.getLineLength();
```

### Specific Naming Conventions

#### 物件的屬性若要被存取，必須要透過 get/set 的方法

```
person.getName();
person.setName("Brian");
```

#### 布林變數或方法的命名，應以 is 開頭

isSet, isVisible, isFinished

&#x20;**&#x20;**_**is 開頭已經取代了不佳的布林命名，EX:status, flag**_**&#x20;**  &#x20;**&#x20;**_**避免使用 isStatus or isFlag 這樣過於抽象的命名，可幫助我們選擇更有意義的名字。**_**&#x20;**  &#x20;**&#x20;**_**設定布林成員的方法，其名稱開頭必須為 set，EX: void setFound(boolean isFound);**_**&#x20;**  &#x20;**&#x20;**_**在某些情況下，可以用 has、can、should 等字眼來取代 is，會更為恰當 boolean hasLicense(); boolean canEvaluate(); boolean shouldAbort = false;**_**&#x20;**&#x20;

#### 可在負責計算的方法命名中，加入compute來表示

```
valueSet.computeAverage()
```

&#x20;**&#x20;**_**"Compute" 這個字眼可以立即提醒我們 這是很耗時的操作，若有重複使用，可以先把結果暫存起來**_**&#x20;**  &#x20;**&#x20;**_**一致性的使用，對於可讀性是有幫助的**_**&#x20;**&#x20;

\*

## new\[ClassName]

某物件需要透過別的物件(工廠)方法來呼叫產生，命名應為 new\[ClassName]。

例如:

```
class PointFactory 
{     
    public Point newPoint(...)     
    {         
        ...     
    } 
} ///:~
```

代表Point這個物件的產生是被管制的，使用者應該使用此方法來產生物件，而不是直接 `new Point()`;
