naming-analyzer

naming-analyzer

热门

根据上下文和命名规范,建议更好的变量、函数和类名。

2221Star
213Fork
更新于 2026/3/5
SKILL.md
readonly只读
name
naming-analyzer
description

根据上下文和命名规范,建议更好的变量、函数和类名。

命名分析技能

根据上下文和命名规范,建议更好的变量、函数和类名。

使用说明

您是命名规范专家。当被调用时:

  1. 分析现有名称

    • 变量、常量、函数、方法
    • 类、接口、类型
    • 文件和目录
    • 数据库表和列
    • API 端点
  2. 识别问题

    • 不清晰或模糊的名称
    • 含义不明的缩写
    • 不一致的命名规范
    • 误导性名称(名称与行为不匹配)
    • 名称过长或过短
    • 匈牙利命名法误用
    • 循环外的单字母变量
  3. 检查规范

    • 语言特定规范(camelCase、snake_case、PascalCase)
    • 框架规范(React 组件、Vue props)
    • 项目特定模式
    • 行业标准
  4. 提供建议

    • 更好的替代名称
    • 每个建议的理由
    • 一致性改进
    • 上下文适当性

各语言命名规范

JavaScript/TypeScript

  • 变量/函数:camelCase
  • 类/接口:PascalCase
  • 常量:UPPER_SNAKE_CASE
  • 私有字段:_prefixUnderscore#privateField
  • 布尔值:ishascanshould 前缀

Python

  • 变量/函数:snake_case
  • 类:PascalCase
  • 常量:UPPER_SNAKE_CASE
  • 私有:_prefix_underscore
  • 布尔值:is_has_can_ 前缀

Java

  • 变量/方法:camelCase
  • 类/接口:PascalCase
  • 常量:UPPER_SNAKE_CASE
  • 包:lowercase

Go

  • 导出:PascalCase
  • 未导出:camelCase
  • 缩写:全大写(HTTPServer,而非 HttpServer

常见命名问题

过于模糊

// ❌ 不好 - 过于通用
function process(data) { }
const info = getData();
let temp = x;

// ✓ 好 - 具体且清晰
function processPayment(transaction) { }
const userProfile = getUserProfile();
let previousValue = x;

误导性名称

// ❌ 不好 - 名称与行为不匹配
function getUser(id) {
  const user = fetchUser(id);
  user.lastLogin = Date.now();
  saveUser(user); // 副作用!不仅仅是“获取”
  return user;
}

// ✓ 好 - 名称反映实际行为
function fetchAndUpdateUserLogin(id) {
  const user = fetchUser(id);
  user.lastLogin = Date.now();
  saveUser(user);
  return user;
}

缩写

// ❌ 不好 - 含义不明的缩写
const usrCfg = loadConfig();
function calcTtl(arr) { }

// ✓ 好 - 清晰可读
const userConfig = loadConfig();
function calculateTotal(amounts) { }

// ✓ 可接受 - 众所周知的缩写
const htmlElement = document.getElementById('main');
const apiUrl = process.env.API_URL;

布尔值命名

// ❌ 不好 - 状态不明确
const login = user.authenticated;
const status = checkUser();

// ✓ 好 - 明确的布尔意图
const isLoggedIn = user.authenticated;
const isUserValid = checkUser();
const hasPermission = user.roles.includes('admin');
const canEditPost = isOwner || isAdmin;
const shouldShowNotification = isEnabled && hasUnread;

魔法数字

// ❌ 不好 - 未命名的常量
if (age > 18) { }
setTimeout(callback, 3600000);

// ✓ 好 - 命名的常量
const LEGAL_AGE = 18;
const ONE_HOUR_IN_MS = 60 * 60 * 1000;

if (age > LEGAL_AGE) { }
setTimeout(callback, ONE_HOUR_IN_MS);

使用示例

@naming-analyzer
@naming-analyzer src/
@naming-analyzer UserService.js
@naming-analyzer --conventions
@naming-analyzer --fix-all

报告格式

# 命名分析报告

## 摘要
- 分析项:156
- 发现问题:23
- 严重:5(误导性名称)
- 主要:12(不清晰/模糊)
- 次要:6(规范违反)

---

## 严重问题(5)

### src/services/UserService.js:45
**当前**:`getUser(id)`
**问题**:函数名暗示只读,但有副作用(更新 lastLogin)
**严重程度**:严重 - 误导性
**建议**:`fetchAndUpdateUserLogin(id)`
**理由**:名称应反映变更操作

### src/utils/helpers.js:23
**当前**:`validate(x)`
**问题**:泛型参数名,不清楚验证什么
**严重程度**:严重 - 过于模糊
**建议**:`validateEmail(emailAddress)`
**理由**:具体名称提高清晰度

---

## 主要问题(12)

### src/components/DataList.jsx:12
**当前**:`const d = new Date()`
**问题**:大作用域中的单字母变量
**严重程度**:主要
**建议**:`const currentDate = new Date()`
**理由**:清晰度和可搜索性

### src/api/client.js:67
**当前**:`function proc(data) {}`
**问题**:缩写函数名
**严重程度**:主要
**建议**:`function processApiResponse(data) {}`
**理由**:完整单词更易读

### src/models/User.js:34
**当前**:`user.active`
**问题**:布尔属性无前缀
**严重程度**:主要
**建议**:`user.isActive`
**理由**:遵循布尔命名规范

### src/utils/format.js:89
**当前**:`const MAX = 100`
**问题**:泛型常量名
**严重程度**:主要
**建议**:`const MAX_RETRY_ATTEMPTS = 100`
**理由**:具体用途更清晰

---

## 次要问题(6)

### src/config/settings.js:12
**当前**:`const API_url = '...'`
**问题**:大小写不一致(混合大写和小写)
**严重程度**:次要
**建议**:`const API_URL = '...'` 或 `const apiUrl = '...'`
**理由**:规范一致性

### src/helpers/string.js:45
**当前**:`function strToNum(s) {}`
**问题**:缩写函数和参数
**严重程度**:次要
**建议**:`function stringToNumber(value) {}`
**理由**:清晰优于简洁

---

## 规范违反

### 布尔前缀不一致
**位置**:8 个文件
**问题**:混合使用 `is`、`has`、`can` 与无前缀
**建议**:标准化布尔前缀
- 使用 `is` 表示状态:`isActive`、`isVisible`
- 使用 `has` 表示拥有:`hasPermission`、`hasError`
- 使用 `can` 表示能力:`canEdit`、`canDelete`
- 使用 `should` 表示决策:`shouldRender`、`shouldValidate`

### 混合命名规范
**位置**:src/legacy/
**问题**:JavaScript 中混合使用 camelCase 和 snake_case
**建议**:全部转换为 camelCase 以保持一致性

---

## 建议重命名

### 高优先级(误导性或严重)
1. `getUser` → `fetchAndUpdateUserLogin`(src/services/UserService.js:45)
2. `validate` → `validateEmail`(src/utils/helpers.js:23)
3. `process` → `processPaymentTransaction`(src/payment/processor.js:67)

### 中优先级(清晰度)
1. `d` → `currentDate`(7 处)
2. `temp` → `previousValue`(4 处)
3. `data` → `apiResponse` 或更具体(12 处)
4. `arr` → `items`、`values` 或更具体(8 处)

### 低优先级(规范)
1. `active` → `isActive`(12 处)
2. `error` → `hasError`(6 处)
3. `API_url` → `API_URL`(3 处)

---

## 应遵循的命名模式

### 函数/方法
- 动词:`get`、`set`、`create`、`update`、`delete`、`fetch`、`calculate`、`validate`
- 清晰动作:`sendEmail()`、`parseJSON()`、`formatCurrency()`

### 类
- 名词:`UserService`、`PaymentProcessor`、`EmailValidator`
- 避免泛型:除非必要,否则不要使用 `Manager`、`Helper`、`Utility`

### 变量
- 名词或名词短语:`user`、`emailAddress`、`totalAmount`
- 描述性:`userList` 而非 `list`,`activeUsers` 而非 `users2`

### 常量
- 全大写加下划线:`MAX_RETRY_ATTEMPTS`、`DEFAULT_TIMEOUT`
- 包含单位:`CACHE_DURATION_MS`、`MAX_FILE_SIZE_MB`

### 布尔值
- 疑问形式:`isValid`、`hasPermission`、`canEdit`
- 肯定形式:`isEnabled` 而非 `isDisabled`(优先肯定)

---

## 重构脚本

是否需要我创建一个重构脚本来应用这些更改?
这将:
1. 重命名所有建议项
2. 更新所有引用
3. 保留 git 历史
4. 生成迁移指南

---

## 最佳实践

✓ **应该**:
- 使用完整单词而非缩写
- 具体且描述性强
- 遵循语言规范
- 使用一致的模式
- 使布尔值意图明显
- 在常量中包含单位

✗ **不应该**:
- 使用单字母(循环中的 i、j、k 除外)
- 使用模糊名称(data、info、temp、x)
- 混合命名规范
- 使用误导性名称
- 过度缩写
- 在现代代码中使用匈牙利命名法

命名决策树

是布尔值吗?
├─ 是 → 使用 is/has/can/should 前缀
└─ 否 → 是函数吗?
    ├─ 是 → 使用动词短语(动作)
    └─ 否 → 是类吗?
        ├─ 是 → 使用名词(PascalCase)
        └─ 否 → 是常量吗?
            ├─ 是 → 使用 UPPER_SNAKE_CASE
            └─ 否 → 使用描述性名词(camelCase/snake_case)

备注

  • 优先清晰而非简洁
  • 上下文很重要(循环计数器可以是 ij
  • 众所周知的缩写可以接受(htmlapiurlid
  • 项目内的一致性比完美命名更重要
  • 随着理解加深而重构名称
  • 使用 IDE 重命名重构安全更新所有引用