code-quality
25
总安装量
19
周安装量
#14870
全站排名
安装命令
npx skills add https://github.com/ab300819/skills --skill code-quality
Agent 安装分布
claude-code
16
gemini-cli
15
opencode
15
antigravity
12
codex
12
github-copilot
10
Skill 文档
Code Quality
ç¼ç åéææ¶çè´¨é约æï¼ç¡®ä¿ä»£ç å¯ç»´æ¤ã坿µè¯ãé度æ©å±ã
Language
- Accept questions in both Chinese and English
- Always respond in Chinese
Trigger Conditions
- ç¨æ·æ£å¨ç¼åæ°ä»£ç
- ç¨æ·éè¦éæç°æä»£ç
- ç¨æ·éè¦ Code Review æ£æ¥æ¸ å
- ç¨æ·æå° MTE ååã代ç è´¨éãé¿å è¿åº¦è®¾è®¡
æ ¸å¿ååï¼MTE
ææä»£ç å¿ é¡»éµå¾ª MTE ååï¼
| åå | 说æ | æ£æ¥ç¹ |
|---|---|---|
| Maintainability | å¯ç»´æ¤æ§ | èè´£åä¸ãä¾èµæ¸ æ°ãæäºçè§£ |
| Testability | 坿µè¯æ§ | æ ¸å¿é»è¾å¯åå æµè¯ãä¾èµå¯ Mock |
| Extensibility | 坿©å±æ§ | é¢çåçæ©å±ç¹ãæ¥å£æ½è±¡ |
Part 1: ç¼ç 约æ
模å设计
åä¸èè´£
â
æ£ç¡®ï¼ä¸ä¸ªç±»/彿°åªåä¸ä»¶äº
- UserService: ç¨æ·ä¸å¡é»è¾
- UserRepository: ç¨æ·æ°æ®è®¿é®
- UserValidator: ç¨æ·æ°æ®æ ¡éª
â é误ï¼ä¸ä¸ªç±»åå¤ä»¶äº
- UserManager: ä¸å¡é»è¾ + æ°æ®è®¿é® + æ ¡éª + åéé®ä»¶
ä¾èµæ¹å
âââââââââââââââââââââââââââââââââââââââ
â Interface Layer â â èå±ï¼æ ä¸å¡é»è¾
âââââââââââââââââââââââââââââââââââââââ¤
â Service Layer â â ä¸å¡é»è¾ï¼æ ¸å¿ï¼
âââââââââââââââââââââââââââââââââââââââ¤
â Domain Layer â â é¢å模å
âââââââââââââââââââââââââââââââââââââââ¤
â Infrastructure Layer â â 坿¿æ¢
âââââââââââââââââââââââââââââââââââââââ
ä¾èµè§åï¼
- å¤å±ä¾èµå
å± â
- å
å±ä¾èµå¤å± â
- ä¾èµæ¥å£ï¼ä¸ä¾èµå®ç° â
彿°è®¾è®¡
彿°é¿åº¦
- 建议ï¼åä¸ªå½æ°ä¸è¶ è¿ 30 è¡
- æå¤§ï¼ä¸è¶ è¿ 50 è¡
- è¶ è¿æ¶ï¼æå为å¤ä¸ªå°å½æ°
åæ°æ°é
- 建议ï¼ä¸è¶ è¿ 3 ä¸ªåæ°
- æå¤§ï¼ä¸è¶ è¿ 5 ä¸ªåæ°
- è¶ è¿æ¶ï¼ä½¿ç¨åæ°å¯¹è±¡
// â åæ°è¿å¤
function createUser(name, email, age, role, department, manager) {}
// â
使ç¨åæ°å¯¹è±¡
function createUser(params: CreateUserParams) {}
åµå¥æ·±åº¦
- 建议ï¼ä¸è¶ è¿ 2 å±åµå¥
- æå¤§ï¼ä¸è¶ è¿ 3 å±åµå¥
- è¶ è¿æ¶ï¼æå彿°æä½¿ç¨æ©è¿å
// â åµå¥è¿æ·±
if (a) {
if (b) {
if (c) {
// ...
}
}
}
// â
æ©è¿å
if (!a) return;
if (!b) return;
if (!c) return;
// ...
坿µè¯æ§è®¾è®¡
详ç»çæµè¯ç¼åè§è请åè
/testing-guide
æ ¸å¿åå
坿µè¯ä»£ç çä¸ä¸ªè¦ç´ :
1. ä¾èµå¯æ³¨å
¥ - å¤é¨ä¾èµéè¿åæ°ä¼ å
¥
2. çº¯å½æ°ä¼å
- ä¸å¡é»è¾æ å¯ä½ç¨
3. è¾¹çå离 - ä¸å¡é»è¾ä¸ IO å离
ä¾èµæ³¨å ¥
// â 硬ç¼ç ä¾èµ
class UserService {
private db = new Database();
private mailer = new EmailService();
}
// â
ä¾èµæ³¨å
¥
class UserService {
constructor(
private db: IDatabase,
private mailer: IEmailService
) {}
}
çº¯å½æ°ä¼å
// â æå¯ä½ç¨ï¼é¾æµè¯
function calculateTotal(items) {
const total = items.reduce((sum, item) => sum + item.price, 0);
console.log(`Total: ${total}`); // å¯ä½ç¨
analytics.track('calculate'); // å¯ä½ç¨
return total;
}
// â
çº¯å½æ°ï¼ææµè¯
function calculateTotal(items) {
return items.reduce((sum, item) => sum + item.price, 0);
}
è¾¹çå离
// â ä¸å¡é»è¾æ··å IO
async function processOrder(orderId) {
const order = await db.findOrder(orderId); // IO
if (order.total > 1000) { // ä¸å¡é»è¾
order.discount = 0.1;
}
await db.save(order); // IO
await email.send(order.user, 'confirmed'); // IO
}
// â
å离ä¸å¡é»è¾
function applyDiscount(order) { // 纯ä¸å¡é»è¾ï¼å¯æµè¯
if (order.total > 1000) {
return { ...order, discount: 0.1 };
}
return order;
}
async function processOrder(orderId) {
const order = await db.findOrder(orderId);
const updated = applyDiscount(order); // è°ç¨çº¯å½æ°
await db.save(updated);
await email.send(order.user, 'confirmed');
}
ç¼åæµè¯æ¶ï¼åè
/testing-guideè·åæè¨è´¨éãMock çç¥ãå弿µè¯çè¯¦ç»æå¯¼
é¿å è¿åº¦è®¾è®¡
YAGNI åå
You Aren’t Gonna Need It – ä½ ä¸ä¼éè¦å®
// â è¿åº¦è®¾è®¡ï¼ä¸ºåè®¾éæ±æ·»å é
ç½®
const config = {
maxRetries: 3,
retryDelay: 1000,
enableCache: true,
cacheExpiry: 3600,
enableRateLimit: false, // 仿ªä½¿ç¨
rateLimitWindow: 60000, // 仿ªä½¿ç¨
enableMetrics: false, // 仿ªä½¿ç¨
metricsEndpoint: '', // 仿ªä½¿ç¨
};
// â
åªæ·»å å½åéè¦çé
ç½®
const config = {
maxRetries: 3,
retryDelay: 1000,
cacheExpiry: 3600,
};
æ½è±¡æ¶æº
â è¿æ©æ½è±¡ï¼
- åªæä¸ä¸ªå®ç°å°±å建æ¥å£
- åªæä¸å¤ä½¿ç¨å°±æå彿°
- åªæä¸¤ä¸ªç¸ä¼¼åºæ¯å°±å建åºç±»
â
éæ¶æ½è±¡ï¼Rule of Threeï¼ï¼
- 3 个以ä¸å®ç°æ¶èèæ¥å£
- 3 å¤ä»¥ä¸é夿¶èèæå
- 3 个以ä¸ç¸ä¼¼åºæ¯æ¶èèåºç±»
ç®åæ¹æ¡ä¼å
// â è¿åº¦è®¾è®¡ï¼ç®ååºæ¯ç¨å¤ææ¨¡å¼
class UserFactory {
createAdmin() { return new AdminUser(); }
createMember() { return new MemberUser(); }
createGuest() { return new GuestUser(); }
}
// â
ç®ååºæ¯ç¨ç®åæ¹æ¡
function createUser(role: 'admin' | 'member' | 'guest') {
return { role, permissions: getPermissions(role) };
}
设计模å¼ä½¿ç¨
使ç¨åå
- å¿ è¦æ¶æç¨ï¼è§£å³å®é é®é¢ï¼ä¸ä¸ºç«æ
- 说æçç±ï¼ä¸ºä»ä¹éæ©è¿ä¸ªæ¨¡å¼
- ä¿æä¸è´ï¼ç¸åé®é¢ç¨ç¸å模å¼
æ¨èåºæ¯
| åºæ¯ | æ¨èæ¨¡å¼ | ä½¿ç¨æ¡ä»¶ |
|---|---|---|
| 对象å建 | Factory / Builder | å建é»è¾å¤æãå¤ç§ç±»å |
| è¡ä¸ºæ©å± | Strategy / Template | ç®æ³å¯æ¿æ¢ãæµç¨æ¥éª¤å¯å |
| ç»æéé | Facade / Adapter | ç®åæ¥å£ãéé ç¬¬ä¸æ¹ |
| ç¶æç®¡ç | State / Observer | ç¶æé©±å¨ãäºä»¶éç¥ |
Part 2: 鿿坼
éæè§¦åæ¡ä»¶
å½ä»£ç åºç°ä»¥ä¸ Code Smells æ¶èèéæï¼
å¿ é¡»éæ
| é®é¢ | ææ | éææ¹å |
|---|---|---|
| 彿°è¿é¿ | > 50 è¡ | æå彿° |
| åæ°è¿å¤ | > 5 个 | åæ°å¯¹è±¡ |
| åµå¥è¿æ·± | > 3 å± | æ©è¿åãæå彿° |
| éå¤ä»£ç | 3+ å¤ | æåå ¬å ±é»è¾ |
| ä¸å¸ç±» | > 500 è¡ | æåèè´£ |
建议éæ
| é®é¢ | æè¿° | éææ¹å |
|---|---|---|
| ç¹æ§ä¾æ | é¢ç¹è®¿é®å ¶ä»ç±»æ°æ® | ç§»å¨æ¹æ³ |
| æ°æ®æ³¥å¢ | å¤ä¸ªåæ°æ»æ¯ä¸èµ·åºç° | æåç±» |
| é°å¼¹å¼ä¿®æ¹ | ä¸ä¸ªæ¹å¨å½±åå¤å¤ | éä¸é»è¾ |
| å¹³è¡ç»§æ¿ | æ¯æ¬¡å åç±»è¦å é å¥ç±» | å并屿¬¡ |
éææµç¨
1. ç¡®ä¿æµè¯è¦ç
â
âââ ææµè¯ â ç»§ç»
âââ æ æµè¯ â å
è¡¥å
æµè¯
â
â¼
2. å°æ¥éæ
â
âââ æ¯æ¬¡åªæ¹ä¸ä»¶äº
âââ æ¯æ¥é½è½è¿è¡
âââ æ¯æ¥é½è¿è¡æµè¯
â
â¼
3. éªè¯è¡ä¸ºä¸å
â
âââ æµè¯å
¨é¨éè¿
âââ æå¨éªè¯å
³é®è·¯å¾
â
â¼
4. æäº¤ä»£ç
éæçº¦æ
å®å ¨çº¦æ
- éæåå¿ é¡»ææµè¯è¦ç
- æ¯æ¥éæåè¿è¡æµè¯
- ä¸å¨éæä¸æ·»å æ°åè½
- ä¸å¨æ·»å åè½æ¶éæ
èå´çº¦æ
- 忬¡éæåªæ¹ä¸ç±»é®é¢
- 忬¡ PR åªå å«ä¸ä¸ªéæä¸»é¢
- 大èå´éæéè¦åé¶æ®µè¿è¡
é£é©è¯ä¼°
| é£é©ç级 | æ¡ä»¶ | çç¥ |
|---|---|---|
| ä½ | æå®åæµè¯ãæ¹å¨å±é¨ | ç´æ¥éæ |
| ä¸ | é¨åæµè¯ãå½±åå¤å¤ | å è¡¥æµè¯ |
| é« | æ æµè¯ãæ ¸å¿é»è¾ | éæ¥æ·»å æµè¯åéæ |
Part 3: Code Review æ¸ å
Review åç½®æ£æ¥
- PR æè¿°æ¸ æ°è¯´ææ¹å¨å 容ååå
- CI éè¿ï¼æµè¯ãlintãbuildï¼
- æ¹å¨èå´åçï¼åä¸ä¸»é¢ï¼
代ç è´¨éæ£æ¥
MTE åå
-
M – å¯ç»´æ¤æ§
- 彿°èè´£åä¸
- å½åæ¸ æ°åç¡®
- ä¾èµå ³ç³»æ¸ æ°
-
T – 坿µè¯æ§
- æ ¸å¿é»è¾ææµè¯
- ä¾èµå¯ä»¥ Mock
- è¾¹çæ¡ä»¶è¦ç
-
E – 坿©å±æ§
- é¢çåçæ©å±ç¹
- ä¸ä¸ºåè®¾éæ±è®¾è®¡
- é ç½®åç
代ç è§è
- 彿°é¿åº¦ < 50 è¡
- åæ°æ°é < 5 个
- åµå¥æ·±åº¦ < 3 å±
- æ éå¤ä»£ç
- æ 硬ç¼ç ææä¿¡æ¯
é误å¤ç
- è¾¹çæ¡ä»¶å¤ç
- éè¯¯ä¿¡æ¯ææä¹
- ä¸åæå¼å¸¸
å®å ¨æ£æ¥
- æ SQL æ³¨å ¥é£é©
- æ XSS é£é©
- æææ°æ®å å¯/è±æ
- æéæ§å¶æ£ç¡®
Review åé¦å级
| çº§å« | æ è®° | å«ä¹ | è¦æ± |
|---|---|---|---|
| é»å¡ | [Blocker] |
å¿ é¡»ä¿®å¤æè½åå¹¶ | å®å ¨é®é¢ãé»è¾é误 |
| 建议 | [Suggestion] |
建议修æ¹ä½ä¸é»å¡ | 代ç 飿 ¼ãå°ä¼å |
| çé® | [Question] |
éè¦ä½è è§£é | ä¸çè§£ç设计å³ç |
| èµ | [Nice] |
åå¾å¥½çå°æ¹ | é¼å±å¥½çå®è·µ |
Part 4: åºç¨åºæ¯
åºæ¯ 1: ç¼åæ°ä»£ç
å½ç¨æ·ç¼åæ°ä»£ç æ¶ï¼èªå¨åºç¨ä»¥ä¸çº¦æï¼
- 模åè®¾è®¡ï¼æ£æ¥èè´£æ¯å¦åä¸
- 彿°è®¾è®¡ï¼æ£æ¥é¿åº¦ãåæ°ãåµå¥
- 坿µè¯æ§ï¼æ£æ¥ä¾èµæ¯å¦å¯æ³¨å ¥
- é¿å è¿åº¦è®¾è®¡ï¼æ£æ¥æ¯å¦ YAGNI
åºæ¯ 2: éæç°æä»£ç
å½ç¨æ·è¦æ±éææ¶ï¼
- è¯ä¼°é£é©ï¼æ£æ¥æµè¯è¦ç
- è¯å«é®é¢ï¼æ¾åº Code Smells
- å¶å®è®¡åï¼ç¡®å®éææ¥éª¤
- å°æ¥æ§è¡ï¼æ¯æ¥è¿è¡æµè¯
åºæ¯ 3: Code Review
å½ç¨æ·è¦æ±å®¡æ¥ä»£ç æ¶ï¼
- ä½¿ç¨æ¸ åï¼éé¡¹æ£æ¥
- å级åé¦ï¼åºåé»å¡å建议
- 说æçç±ï¼è§£é为ä»ä¹è¿æ ·å»ºè®®
Constraints
ç¼ç 约æ
- 彿°ä¸è¶ è¿ 50 è¡
- åæ°ä¸è¶ è¿ 5 个
- åµå¥ä¸è¶ è¿ 3 å±
- ä¾èµéè¿æ³¨å ¥ï¼ä¸ç¡¬ç¼ç
- æ ¸å¿é»è¾å¯åå æµè¯
设计约æ
- æ¯ä¸ªæ¨¡åèè´£åä¸
- ä¾èµæ¹åï¼å¤å±ä¾èµå å±
- ä¸ä¸ºåè®¾éæ±è®¾è®¡
- 3 个以ä¸ç¸ä¼¼åºæ¯ææ½è±¡
éæçº¦æ
- éæåå¿ é¡»ææµè¯
- æ¯æ¥éæåè¿è¡æµè¯
- ä¸å¨éæä¸æ·»å åè½
Review 约æ
- åºåé»å¡å建议
- åé¦éè¦è¯´æçç±
- å®å ¨é®é¢å¿ é¡»é»å¡