code-quality
4
总安装量
2
周安装量
#50044
全站排名
安装命令
npx skills add https://github.com/wutongci/agentdemo --skill code-quality
Agent 安装分布
gemini-cli
2
replit
1
amp
1
trae
1
kimi-cli
1
Skill 文档
代ç è´¨éæ£æ¥ç¥è¯åº
æ¬æè½æä¾èªå¨åç代ç è´¨éæ£æ¥ï¼è¯å«å¸¸è§é®é¢å¹¶æä¾æ¹è¿å»ºè®®ã
æ£æ¥ç»´åº¦
1. 代ç å¤æåº¦
åå¤æåº¦ (Cyclomatic Complexity)
è¡¡é代ç ä¸ç¬ç«è·¯å¾çæ°éã
éå¼å»ºè®®:
- 1-10: ç®åï¼å®¹æçè§£åæµè¯
- 11-20: ä¸ç夿ï¼éè¦æ³¨æ
- 21-50: 夿ï¼å»ºè®®éæ
- 50+: é叏夿ï¼å¿ é¡»éæ
éä½å¤æåº¦çæ¹æ³:
// â é«å¤æåº¦
func ProcessOrder(order Order) error {
if order.Status == "pending" {
if order.Amount > 1000 {
if order.User.IsVIP {
// 夿çé»è¾
} else {
// å¦ä¸ä¸ªå¤æé»è¾
}
} else {
// æ´å¤é»è¾
}
} else if order.Status == "confirmed" {
// æ´å¤åµå¥
}
return nil
}
// â
éä½å¤æåº¦ï¼æåæ¹æ³
func ProcessOrder(order Order) error {
if order.Status == "pending" {
return processPendingOrder(order)
}
if order.Status == "confirmed" {
return processConfirmedOrder(order)
}
return nil
}
func processPendingOrder(order Order) error {
if order.Amount > 1000 {
return processLargeOrder(order)
}
return processSmallOrder(order)
}
认ç¥å¤æåº¦ (Cognitive Complexity)
è¡¡é代ç ççè§£é¾åº¦ã
éä½è®¤ç¥å¤æåº¦:
- åå°åµå¥å±çº§ï¼ä¸è¶ è¿ 3 å±ï¼
- ä½¿ç¨æ©è¿åï¼early returnï¼
- æå夿æ¡ä»¶ä¸ºå½å彿°
- 使ç¨å«è¯å¥ï¼guard clausesï¼
// â é«è®¤ç¥å¤æåº¦
func ValidateUser(user User) error {
if user.Name != "" {
if user.Email != "" {
if user.Age >= 18 {
return nil
} else {
return errors.New("age must be >= 18")
}
} else {
return errors.New("email required")
}
} else {
return errors.New("name required")
}
}
// â
ä½è®¤ç¥å¤æåº¦ï¼ä½¿ç¨å«è¯å¥
func ValidateUser(user User) error {
if user.Name == "" {
return errors.New("name required")
}
if user.Email == "" {
return errors.New("email required")
}
if user.Age < 18 {
return errors.New("age must be >= 18")
}
return nil
}
2. 代ç éå¤ (Code Duplication)
æ£æµéå¤
- å®å ¨éå¤ç代ç å
- ç»æç¸ä¼¼ä½ç»èä¸åç代ç
- å¤å¶ç²è´´ç代ç
éå¤çå±å®³
- ç»´æ¤ææ¬é«ï¼ä¿®æ¹éè¦å¤å¤æ´æ¹ï¼
- 容æå¼å ¥ bug
- 代ç åºè¨è
æ¶é¤éå¤
// â éå¤ä»£ç
func CreateUserOrder(user User, items []Item) error {
total := 0.0
for _, item := range items {
total += item.Price * float64(item.Quantity)
}
discount := total * 0.1
final := total - discount
return saveOrder(user.ID, final)
}
func CreateGuestOrder(email string, items []Item) error {
total := 0.0
for _, item := range items {
total += item.Price * float64(item.Quantity)
}
discount := total * 0.1
final := total - discount
return saveGuestOrder(email, final)
}
// â
æåå
Œ
±é»è¾
func calculateOrderTotal(items []Item) float64 {
total := 0.0
for _, item := range items {
total += item.Price * float64(item.Quantity)
}
discount := total * 0.1
return total - discount
}
func CreateUserOrder(user User, items []Item) error {
total := calculateOrderTotal(items)
return saveOrder(user.ID, total)
}
func CreateGuestOrder(email string, items []Item) error {
total := calculateOrderTotal(items)
return saveGuestOrder(email, total)
}
3. 彿°åæ¹æ³è´¨é
彿°é¿åº¦
- 建议: ä¸è¶ è¿ 50 è¡
- çæ³: 20-30 è¡
- è¿é¿: èèèè´£æ¯å¦è¿å¤
åæ°æ°é
- çæ³: 0-2 ä¸ªåæ°
- 坿¥å: 3-4 ä¸ªåæ°
- éè¦éæ: 5+ ä¸ªåæ°
æ¹è¿æ¹æ³:
// â åæ°è¿å¤
func CreateUser(name, email, phone, address, city, country, zipCode string, age int) error {
// ...
}
// â
使ç¨å¯¹è±¡å°è£
type UserInfo struct {
Name string
Email string
Phone string
Address Address
Age int
}
type Address struct {
Street string
City string
Country string
ZipCode string
}
func CreateUser(info UserInfo) error {
// ...
}
è¿åå¼
- æç¡®çè¿åç±»å
- é误å¤çæ¸ æ°
- é¿å è¿å nil å¯¼è´ panic
4. å½åè´¨é
åéå½å
// â ç³ç³çå½å
var d int // ä»ä¹ç d?
var data []byte // 太éç¨
var x User // æ æä¹
// â
好çå½å
var daysSinceLastLogin int
var requestBody []byte
var currentUser User
彿°å½å
// â 䏿¸
æ°
func proc() error { ... }
func handle(d Data) { ... }
// â
æ¸
æ°è¡¨æ
func ProcessPayment() error { ... }
func HandleUserRegistration(data RegistrationData) { ... }
常éåé ç½®
// â 鿝æ°å
if user.LoginAttempts > 5 { ... }
time.Sleep(300 * time.Second)
// â
å½å常é
const MaxLoginAttempts = 5
const DefaultTimeout = 300 * time.Second
if user.LoginAttempts > MaxLoginAttempts { ... }
time.Sleep(DefaultTimeout)
5. 注éè´¨é
æä»·å¼ç注é
// â
è§£é为ä»ä¹
// ä½¿ç¨ææ°éé¿é¿å
卿å¡é坿¶é æé·é¸£è¬ç请æ±
func retryWithBackoff() { ... }
// è§£éä¸å¡è§å
// æ ¹æ®ç¨æ³è§å®ï¼è¶
è¿ 1000 å
ç订åéè¦é¢å¤å®¡æ ¸
if order.Amount > 1000 { ... }
æ ä»·å¼ç注é
// â éå¤ä»£ç å
容
// 设置å称为 John
name := "John"
// 循ç¯éåç¨æ·
for _, user := range users { ... }
6. é误å¤çè´¨é
æ£æ¥ç¹
- ææé误é½è¢«å¤ç
- éè¯¯æ¶æ¯å å«ä¸ä¸æ
- 使ç¨é误å è£ ä¿çå æ
- å¨éå½çå±çº§å¤çé误
// â 忽ç¥é误
file, _ := os.Open("config.json")
// â 丢失ä¸ä¸æ
return err
// â
è¯å¥½çé误å¤ç
file, err := os.Open("config.json")
if err != nil {
return fmt.Errorf("failed to open config file: %w", err)
}
defer file.Close()
7. èµæºç®¡ç
æä»¶å¤ç
// â
ä½¿ç¨ defer ç¡®ä¿å
³é
file, err := os.Open("data.txt")
if err != nil {
return err
}
defer file.Close()
å¹¶åèµæº
// â
ä½¿ç¨ sync.WaitGroup
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
// å¤ç
}(i)
}
wg.Wait()
8. ä¾èµç®¡ç
è¦å度
- ä½è¦å: 模åé´ä¾èµå°
- é«å è: 模åå é¨åè½ç¸å ³
ä¾èµæ³¨å ¥
// â ç´§è¦å
type UserService struct {
db *sql.DB // ç´æ¥ä¾èµå
·ä½å®ç°
}
// â
ä¾èµæ³¨å
¥
type UserRepository interface {
FindByID(id string) (*User, error)
Save(user *User) error
}
type UserService struct {
repo UserRepository // ä¾èµæ½è±¡
}
è´¨éææ
ä¼å 级åç±»
P0 – å¿ é¡»ä¿®å¤
- æªå¤ççé误
- èµæºæ³æ¼
- ææ¾çé»è¾é误
- å®å ¨æ¼æ´
P1 – 强ç建议
- é«å¤æåº¦å½æ°ï¼åå¤æåº¦ > 20ï¼
- 大ééå¤ä»£ç
- è¿é¿ç彿°ï¼> 100 è¡ï¼
- åæ°è¿å¤ï¼> 5 个ï¼
P2 – 建议æ¹è¿
- ä¸çå¤æåº¦ï¼åå¤æåº¦ 11-20ï¼
- å½å䏿¸ æ°
- 缺å°å¿ è¦æ³¨é
- å¯ä»¥ä¼åçæ§è½
P3 – å¯éä¼å
- 轻微ç代ç 飿 ¼é®é¢
- å¯ä»¥æ´å¥½çå½å
- 次è¦çéææºä¼
èªå¨æ£æ¥æ¸ å
å¨å®¡æ¥ä»£ç æ¶ï¼èªå¨æ£æ¥ä»¥ä¸é¡¹ç®ï¼
åºæ¬è´¨é
- æ è¯æ³é误
- æ ææ¾çé»è¾é误
- ææé误é½è¢«å¤ç
- èµæºæ£ç¡®éæ¾
å¯ç»´æ¤æ§
- 彿°é¿åº¦åçï¼< 50 è¡ï¼
- åå¤æåº¦å¯æ¥åï¼< 10ï¼
- æ 大ééå¤ä»£ç
- å½åæ¸ æ°ææä¹
å¯è¯»æ§
- 代ç ç»ææ¸ æ°
- éå½ç注é
- ä¸è´ç代ç 飿 ¼
- åçç缩è¿åæ ¼å¼
æ§è½
- æ ææ¾çæ§è½é®é¢
- èµæºä½¿ç¨åç
- ç®æ³å¤æåº¦å¯æ¥å
æ¹è¿å»ºè®®æ¨¡æ¿
å½è¯å«å°è´¨éé®é¢æ¶ï¼æä¾ä»¥ä¸æ ¼å¼ç建议ï¼
### 代ç è´¨éé®é¢: [é®é¢ç±»å]
**ä½ç½®**: [æä»¶å:è¡å·]
**é®é¢**: [æè¿°é®é¢]
**严éç¨åº¦**: P0 / P1 / P2 / P3
**å½±å**: [说æå½±å]
**建议修æ¹**:
[æä¾å
·ä½çæ¹è¿ä»£ç ]
**åå **: [è§£é为ä»ä¹è¦è¿æ ·æ¹]