# 命名 ## 規則 - 核心原則:有意義 - 能從命名就看出 - 函式功能 - 變數儲存內容 - 沒有一定的對與錯(要看整個代碼分佈和團隊定義) ## 為什麼命名重要 - 讓使用者不用深入研究代碼細節就能了解代碼 ## 如何正確的命名 - 常數/變數 - 本質:資料的容器 - 功能: - 使用者輸入資料 - 驗證結果 - 產品列表 - 命名:**名詞**或短語+形容詞 - 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`