# 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()`;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://brianwu.gitbook.io/brian/brians-za-ji/guan-nian/java-cheng-shi-feng-ge.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
