[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EMVQC1GWZMBMVMV8BFDMSN":3,"skill-same:01M6EMVQC1GWZMBMVMV8BFDMSN":62},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":33,"commitSha":34,"skillDirectory":35,"forksCount":36,"repositoryHtmlUrl":37,"repositoryHomepageUrl":38,"ownerHtmlUrl":39,"ownerBlogUrl":6,"ownerDescription":40,"updatedAt":41,"install":42,"resources":55},"01M6EMVQC1GWZMBMVMV8BFDMSN","clean-code",null,"Clean code principles for readable, maintainable software","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbenny9193\u002Fclean-code\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[24,25,26,27],"code","clean code","clean","software","2026-11-10 10:12:30",false,"---\nname: clean-code\ndescription: Clean code principles for readable, maintainable software\n---\n\n# Clean Code Principles\n\nWrite code that humans can understand. Code is read far more often than it's written.\n\n## Naming\n\n### Variables\n```typescript\n\u002F\u002F BAD\nconst d = 86400000; \u002F\u002F what is this?\nconst yyyymmdd = formatDate(date);\nconst list = getUsers();\n\n\u002F\u002F GOOD\nconst MILLISECONDS_PER_DAY = 86400000;\nconst formattedDate = formatDate(date);\nconst users = getUsers();\n```\n\n### Functions\n```typescript\n\u002F\u002F BAD - unclear what it does\nfunction handle(data) { }\nfunction process(item) { }\nfunction doIt() { }\n\n\u002F\u002F GOOD - verb + noun, describes action\nfunction validateUserInput(input) { }\nfunction calculateTotalPrice(items) { }\nfunction sendWelcomeEmail(user) { }\n```\n\n### Booleans\n```typescript\n\u002F\u002F BAD\nconst open = true;\nconst write = false;\nconst fruit = true;\n\n\u002F\u002F GOOD - is\u002Fhas\u002Fcan\u002Fshould prefix\nconst isOpen = true;\nconst canWrite = false;\nconst hasFruit = true;\n```\n\n## Functions\n\n### Single Responsibility\n```typescript\n\u002F\u002F BAD - does too much\nfunction createUserAndSendEmailAndLogActivity(data) {\n  const user = db.insert(data);\n  mailer.send(user.email, 'Welcome!');\n  logger.log(`User ${user.id} created`);\n  return user;\n}\n\n\u002F\u002F GOOD - one thing each\nfunction createUser(data) {\n  return db.insert(data);\n}\n\nfunction sendWelcomeEmail(user) {\n  mailer.send(user.email, 'Welcome!');\n}\n\nfunction logUserCreation(user) {\n  logger.log(`User ${user.id} created`);\n}\n```\n\n### Few Parameters\n```typescript\n\u002F\u002F BAD - too many parameters\nfunction createUser(name, email, age, country, role, department, manager) { }\n\n\u002F\u002F GOOD - use object\nfunction createUser(options: CreateUserOptions) { }\n\ninterface CreateUserOptions {\n  name: string;\n  email: string;\n  age?: number;\n  country?: string;\n  role: Role;\n  department?: string;\n  manager?: string;\n}\n```\n\n### Avoid Flag Arguments\n```typescript\n\u002F\u002F BAD - boolean changes behavior\nfunction createFile(name: string, temp: boolean) {\n  if (temp) {\n    fs.create(`\u002Ftmp\u002F${name}`);\n  } else {\n    fs.create(name);\n  }\n}\n\n\u002F\u002F GOOD - separate functions\nfunction createFile(name: string) {\n  fs.create(name);\n}\n\nfunction createTempFile(name: string) {\n  fs.create(`\u002Ftmp\u002F${name}`);\n}\n```\n\n### Return Early\n```typescript\n\u002F\u002F BAD - nested conditionals\nfunction getPayAmount(employee) {\n  let result;\n  if (employee.isSeparated) {\n    result = 0;\n  } else {\n    if (employee.isRetired) {\n      result = employee.pension;\n    } else {\n      result = employee.salary;\n    }\n  }\n  return result;\n}\n\n\u002F\u002F GOOD - early returns\nfunction getPayAmount(employee) {\n  if (employee.isSeparated) return 0;\n  if (employee.isRetired) return employee.pension;\n  return employee.salary;\n}\n```\n\n## Comments\n\n### Don't Comment Bad Code - Rewrite It\n```typescript\n\u002F\u002F BAD\n\u002F\u002F Check if employee is eligible for benefits\nif ((employee.flags & 0x0F) && (employee.age > 65)) { }\n\n\u002F\u002F GOOD - code explains itself\nconst isEligibleForBenefits = employee.hasHealthPlan && employee.isRetired;\nif (isEligibleForBenefits) { }\n```\n\n### Good Comments\n```typescript\n\u002F\u002F Regex matches ISO 8601 date format\nconst DATE_PATTERN = \u002F^\\d{4}-\\d{2}-\\d{2}$\u002F;\n\n\u002F\u002F TODO: Refactor when API v2 launches\n\u002F\u002F WARNING: This must run before database migration\n\u002F\u002F NOTE: Third-party API has 100ms minimum delay\n```\n\n## Error Handling\n\n### Don't Return Null\n```typescript\n\u002F\u002F BAD\nfunction getUser(id: string): User | null {\n  return db.find(id) || null;\n}\n\n\u002F\u002F GOOD - throw or return Result type\nfunction getUser(id: string): User {\n  const user = db.find(id);\n  if (!user) throw new UserNotFoundError(id);\n  return user;\n}\n\n\u002F\u002F OR use Result type\nfunction getUser(id: string): Result\u003CUser, NotFoundError> { }\n```\n\n### Don't Pass Null\n```typescript\n\u002F\u002F BAD\nfunction calculateArea(width: number | null, height: number | null) {\n  if (width === null || height === null) {\n    throw new Error('Invalid dimensions');\n  }\n  return width * height;\n}\n\n\u002F\u002F GOOD - require valid inputs\nfunction calculateArea(width: number, height: number) {\n  return width * height;\n}\n```\n\n## Formatting\n\n### Consistent Style\n- Pick a style guide (Prettier, StandardJS, Black)\n- Automate with formatters\n- Never debate style in code review\n\n### Vertical Density\n```typescript\n\u002F\u002F BAD - unrelated code together\nconst user = getUser(id);\nconst config = loadConfig();\nconst result = processData(user, config);\nlogger.log(result);\nsendNotification(user);\n\n\u002F\u002F GOOD - group related code\nconst user = getUser(id);\nsendNotification(user);\n\nconst config = loadConfig();\nconst result = processData(user, config);\nlogger.log(result);\n```\n\n## Code Smells to Avoid\n\n| Smell | Problem | Solution |\n|-------|---------|----------|\n| Long Method | Hard to understand | Extract methods |\n| Long Parameter List | Complex interface | Parameter object |\n| Duplicate Code | Change in multiple places | Extract function |\n| Dead Code | Confusion, maintenance | Delete it |\n| Magic Numbers | Unclear meaning | Named constants |\n| Deep Nesting | Hard to follow | Early returns, extract |\n| Feature Envy | Wrong location | Move method |\n| Data Clumps | Always together | Create class |\n\n## The Boy Scout Rule\n\n> Leave the code cleaner than you found it.\n\nEvery commit should improve code quality slightly. Small, incremental improvements compound over time.\n\n## Checklist\n\nBefore committing, ask:\n\n- [ ] Can I understand this code in 6 months?\n- [ ] Would a new team member understand it?\n- [ ] Are names descriptive and searchable?\n- [ ] Does each function do one thing?\n- [ ] Are there any magic numbers\u002Fstrings?\n- [ ] Is error handling appropriate?\n- [ ] Did I remove all dead code?\n","# Clean Code Principles\n\nWrite code that humans can understand. Code is read far more often than it's written.\n\n## Naming\n\n### Variables\n```typescript\n\u002F\u002F BAD\nconst d = 86400000; \u002F\u002F what is this?\nconst yyyymmdd = formatDate(date);\nconst list = getUsers();\n\n\u002F\u002F GOOD\nconst MILLISECONDS_PER_DAY = 86400000;\nconst formattedDate = formatDate(date);\nconst users = getUsers();\n```\n\n### Functions\n```typescript\n\u002F\u002F BAD - unclear what it does\nfunction handle(data) { }\nfunction process(item) { }\nfunction doIt() { }\n\n\u002F\u002F GOOD - verb + noun, describes action\nfunction validateUserInput(input) { }\nfunction calculateTotalPrice(items) { }\nfunction sendWelcomeEmail(user) { }\n```\n\n### Booleans\n```typescript\n\u002F\u002F BAD\nconst open = true;\nconst write = false;\nconst fruit = true;\n\n\u002F\u002F GOOD - is\u002Fhas\u002Fcan\u002Fshould prefix\nconst isOpen = true;\nconst canWrite = false;\nconst hasFruit = true;\n```\n\n## Functions\n\n### Single Responsibility\n```typescript\n\u002F\u002F BAD - does too much\nfunction createUserAndSendEmailAndLogActivity(data) {\n  const user = db.insert(data);\n  mailer.send(user.email, 'Welcome!');\n  logger.log(`User ${user.id} created`);\n  return user;\n}\n\n\u002F\u002F GOOD - one thing each\nfunction createUser(data) {\n  return db.insert(data);\n}\n\nfunction sendWelcomeEmail(user) {\n  mailer.send(user.email, 'Welcome!');\n}\n\nfunction logUserCreation(user) {\n  logger.log(`User ${user.id} created`);\n}\n```\n\n### Few Parameters\n```typescript\n\u002F\u002F BAD - too many parameters\nfunction createUser(name, email, age, country, role, department, manager) { }\n\n\u002F\u002F GOOD - use object\nfunction createUser(options: CreateUserOptions) { }\n\ninterface CreateUserOptions {\n  name: string;\n  email: string;\n  age?: number;\n  country?: string;\n  role: Role;\n  department?: string;\n  manager?: string;\n}\n```\n\n### Avoid Flag Arguments\n```typescript\n\u002F\u002F BAD - boolean changes behavior\nfunction createFile(name: string, temp: boolean) {\n  if (temp) {\n    fs.create(`\u002Ftmp\u002F${name}`);\n  } else {\n    fs.create(name);\n  }\n}\n\n\u002F\u002F GOOD - separate functions\nfunction createFile(name: string) {\n  fs.create(name);\n}\n\nfunction createTempFile(name: string) {\n  fs.create(`\u002Ftmp\u002F${name}`);\n}\n```\n\n### Return Early\n```typescript\n\u002F\u002F BAD - nested conditionals\nfunction getPayAmount(employee) {\n  let result;\n  if (employee.isSeparated) {\n    result = 0;\n  } else {\n    if (employee.isRetired) {\n      result = employee.pension;\n    } else {\n      result = employee.salary;\n    }\n  }\n  return result;\n}\n\n\u002F\u002F GOOD - early returns\nfunction getPayAmount(employee) {\n  if (employee.isSeparated) return 0;\n  if (employee.isRetired) return employee.pension;\n  return employee.salary;\n}\n```\n\n## Comments\n\n### Don't Comment Bad Code - Rewrite It\n```typescript\n\u002F\u002F BAD\n\u002F\u002F Check if employee is eligible for benefits\nif ((employee.flags & 0x0F) && (employee.age > 65)) { }\n\n\u002F\u002F GOOD - code explains itself\nconst isEligibleForBenefits = employee.hasHealthPlan && employee.isRetired;\nif (isEligibleForBenefits) { }\n```\n\n### Good Comments\n```typescript\n\u002F\u002F Regex matches ISO 8601 date format\nconst DATE_PATTERN = \u002F^\\d{4}-\\d{2}-\\d{2}$\u002F;\n\n\u002F\u002F TODO: Refactor when API v2 launches\n\u002F\u002F WARNING: This must run before database migration\n\u002F\u002F NOTE: Third-party API has 100ms minimum delay\n```\n\n## Error Handling\n\n### Don't Return Null\n```typescript\n\u002F\u002F BAD\nfunction getUser(id: string): User | null {\n  return db.find(id) || null;\n}\n\n\u002F\u002F GOOD - throw or return Result type\nfunction getUser(id: string): User {\n  const user = db.find(id);\n  if (!user) throw new UserNotFoundError(id);\n  return user;\n}\n\n\u002F\u002F OR use Result type\nfunction getUser(id: string): Result\u003CUser, NotFoundError> { }\n```\n\n### Don't Pass Null\n```typescript\n\u002F\u002F BAD\nfunction calculateArea(width: number | null, height: number | null) {\n  if (width === null || height === null) {\n    throw new Error('Invalid dimensions');\n  }\n  return width * height;\n}\n\n\u002F\u002F GOOD - require valid inputs\nfunction calculateArea(width: number, height: number) {\n  return width * height;\n}\n```\n\n## Formatting\n\n### Consistent Style\n- Pick a style guide (Prettier, StandardJS, Black)\n- Automate with formatters\n- Never debate style in code review\n\n### Vertical Density\n```typescript\n\u002F\u002F BAD - unrelated code together\nconst user = getUser(id);\nconst config = loadConfig();\nconst result = processData(user, config);\nlogger.log(result);\nsendNotification(user);\n\n\u002F\u002F GOOD - group related code\nconst user = getUser(id);\nsendNotification(user);\n\nconst config = loadConfig();\nconst result = processData(user, config);\nlogger.log(result);\n```\n\n## Code Smells to Avoid\n\n| Smell | Problem | Solution |\n|-------|---------|----------|\n| Long Method | Hard to understand | Extract methods |\n| Long Parameter List | Complex interface | Parameter object |\n| Duplicate Code | Change in multiple places | Extract function |\n| Dead Code | Confusion, maintenance | Delete it |\n| Magic Numbers | Unclear meaning | Named constants |\n| Deep Nesting | Hard to follow | Early returns, extract |\n| Feature Envy | Wrong location | Move method |\n| Data Clumps | Always together | Create class |\n\n## The Boy Scout Rule\n\n> Leave the code cleaner than you found it.\n\nEvery commit should improve code quality slightly. Small, incremental improvements compound over time.\n\n## Checklist\n\nBefore committing, ask:\n\n- [ ] Can I understand this code in 6 months?\n- [ ] Would a new team member understand it?\n- [ ] Are names descriptive and searchable?\n- [ ] Does each function do one thing?\n- [ ] Are there any magic numbers\u002Fstrings?\n- [ ] Is error handling appropriate?\n- [ ] Did I remove all dead code?\n",{"name":5,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fbenny9193\u002Fclean-code",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":43,"prompt":53,"zipAvailable":54},[44,47,50],{"tool":45,"command":46},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill clean-code",{"tool":48,"command":49},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill clean-code",{"tool":51,"command":52},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill clean-code","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbenny9193\u002Fclean-code\u002FSKILL.md",true,[56],{"path":57,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":60,"sourceHtmlUrl":61},"skill-report.json","REFERENCE","参考文档",11030,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fbenny9193\u002Fclean-code\u002Fskill-report.json",[63,77,87,96,102,109],{"skillNo":64,"name":65,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":73,"publishedAt":28},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[68],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[74,75,76],"model","model hierarchy","model hierarchy skill",{"skillNo":78,"name":79,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":83,"publishedAt":28},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[82],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},[84,85,86],"MCP","zoom","zoom mcp",{"skillNo":88,"name":89,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":28},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[93,94,95,85],"sdk","zoom apps sdk","apps",{"skillNo":97,"name":98,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":28},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[98],{"skillNo":103,"name":104,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":108,"publishedAt":28},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[107],{"categoryNo":69,"categoryName":70,"taxonomyType":71,"taxonomyTypeDesc":72},[104],{"skillNo":110,"name":111,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":28},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[111]]