---
# System prepended metadata

title: 命名
tags: [Note, Clean Code]

---

# 命名

## 規則
- 核心原則：有意義
- 能從命名就看出
    - 函式功能
    - 變數儲存內容
- 沒有一定的對與錯(要看整個代碼分佈和團隊定義)


## 為什麼命名重要
- 讓使用者不用深入研究代碼細節就能了解代碼

## 如何正確的命名
- 常數/變數
    - 本質：資料的容器
    - 功能:
        - 使用者輸入資料
        - 驗證結果
        - 產品列表
    - 命名：**名詞**或短語+形容詞
        - ex.
            - userData
            - isValid
- 方法/函式
    - 本質：
        - 指令
        - 計算
        - 獲取特定值
    - 功能:
        - 傳輸資料給服務器
        - 驗證使用者輸入是否有效
    - 命名：**動詞**或短語+形容詞
        - ex:
            - sendData
            - inputIsValid
            - getUser
            - createUser
- 類
    - 本質：
        - 創建對象(物件)的實例
    - 功能:
        - 創建
            - 使用者
            - http 請求
    - 命名：**名詞**或短語+名詞 (名詞相互結合)
        - ex:
            - User
            - RequestBody

:::info
如何挑選最適合的名詞/動詞 ?
:::

## 命名種類
- snake_case
    - 應用語言：Python
    - 範例：
        - is_valid
        - send_response
    - 使用場景
        - 變量
        - 函式
        - 方法
- camelCase
    - 應用語言：Java,JS
    - 範例：
        - isValid
        - sendResponse
    - 使用場景
        - 變量
        - 函式
        - 方法
- PascalCase
    - 應用語言：Python,Java,JS
    - 範例：
        - AdminRole
        - UserRepository
    - 使用場景
        - 類
- kebap-case
    - 應用語言：HTML
    - 範例：
        - `<side-drawer>`
    - 使用場景
        - HTML 元素

:::info
每一種程式語言,命名方式都是一樣,只是使用了不同命名種類
:::

## 命名變數/常數/屬性(類變數)
根據類型區分：
- 物件,數字/字符串/屬性
    - 命名：代表的事物/資料
    - 範例：
        - user
        - database
        - name
        - age
        - 提供更多資訊
            - authenticatedUser
            - sqlDatabase
- 布林
    - 命名：可以使用 true/false 回答的問題
    - 範例：
        - isActive
        - loggedIn
        - 提供更多資訊
            - isActivatedUser

### 範例 1
儲存資料：使用者物件(name, email, age)
#### Bad Name
- u
- data

-> 沒有代表任何事物

#### Ok Name
- userData ->過於冗
- person ->不夠精確

#### Good Name
- user -> 一般描述
- customer -> 特定

### 範例 2
儲存資料：使用輸入驗證的結果(true/false)
#### Bad Name
- v -> 沒有代表任何事物
- val -> 可以是 value 也可以是 validation result

#### Ok Name
- correct
- validatedInput

-> 並沒有表達 true/false
#### Good Name
- userInputIsValid
- isCorrect
- isValid

-> 描述性,並且值的類型很清楚


## 命名方法/函式
- 計算某些值
    - 布林：回答一個 true/false 問題
        - isValid()
        - emailIsValid()
        - purchase.isPaid()
    - 其他類型(同做某些事)
- 做某些事：描述它所做的事
    - getUser()
    - response.send()
    - 給出更多但不多餘的資訊：
        - getUserByEmail()

### 範例 1
方法：儲存用戶資料進入資料庫
#### Bad Name
- process()
- handle() 

-> 沒有代表任何事物(可以是處理用戶/處理訂單)

#### Ok Name
- save()
    - 如果是 User 類的方法,那就夠清楚
- storeData()

-> 不夠清楚

#### Good Name
- saveUser()
- user.store()

### 範例 2
方法：驗證用戶輸入
#### Bad Name
- process()
- save() 

-> 沒有代表任何事物

#### Ok Name
- validateSave()
- check()

-> 不夠清楚

#### Good Name
- validateUserInput()
- user.validateInput()
- user.InputIsValid()
- validate()
- isValid()

### 例外
getter/setter -> 用屬性方式命名

## 命名類
- 類適用於實例化物件
    - 命名反應實例化的物件
        - User
        - Product
        - 提供更多細節：
            - Customer
            - Course
        - 過於多餘的：
            - DateUtil
            - DatabaseManager
                - 有例外: ex 包含多數 staticmethod
## 其他重點
- 命名中不要提供過多資訊
    - ex.
        - userWithNameAndAge
- 使用通用辭彙,不要用縮寫
- 要視其他代碼的情況而改變命名
    - ex.
        - 不要有重複獲益混淆的命名
- 保持命名一致性 (使用一致的動詞和名詞)
    - ex.
        - getUser -> get
        - fetchUser -> fetch
        - retriveUser -> retrive

:::info
重點並非在要取什麼名字
而是為什麼取這個名字
:::

## 
###### tags: `Clean Code` `Note`