JavaScript中的Clean Code:原则与实践示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

JavaScript中的Clean Code:原则与实践示例

\n\n

整洁代码(Clean Code)不仅仅是一个流行术语,而是一种开发哲学,它将混乱的指令集转变为结构清晰、可读且可维护的系统。在JavaScript和Node.js的世界中,随着项目快速成长和复杂化,编写整洁代码的能力变得至关重要。在本文中,我们将通过使用Node.js的具体示例来解析Clean Code的关键原则。

\n\n

为什么整洁代码对JavaScript开发者很重要?

\n\n

JavaScript是一种动态类型且高度灵活的语言,这既是它的优势,也是问题的根源。如果不遵循整洁代码的规范,项目很快就会变成“泥潭”,任何修改都可能破坏系统中意想不到的部分。Clean Code有助于:

\n
    \n
  • 减少错误数量以及查找错误的时间。
  • \n
  • 加快新开发者融入项目的速度。
  • \n
  • 简化代码库的重构和扩展。
  • \n
  • 提高代码评审的质量。
  • \n
\n\n

原则1:有意义的命名——理解的基础

\n\n

Clean Code的第一个也是最重要的原则——正确命名变量、函数、类和文件。名称应该回答“这是什么?”和“为什么用这个?”的问题。避免使用单个字母的变量(循环计数器除外)和抽象的名称。

\n\n

糟糕的示例(Node.js):

\n
// 这个函数是做什么的?不清楚。\nfunction d(a, b) {\n  let r = [];\n  for (let i = 0; i < a.length; i++) {\n    if (b.includes(a[i])) {\n      r.push(a[i]);\n    }\n  }\n  return r;\n}\n\n// 使用\nconst arr1 = [1, 2, 3, 4, 5];\nconst arr2 = [3, 4, 5, 6, 7];\nconst result = d(arr1, arr2);\nconsole.log(result); // [3, 4, 5]
\n\n

良好的示例(Clean Code):

\n
// 函数和参数的名称不言自明\nfunction findCommonElements(array1, array2) {\n  const commonElements = [];\n  for (const element of array1) {\n    if (array2.includes(element)) {\n      commonElements.push(element);\n    }\n  }\n  return commonElements;\n}\n\n// 使用\nconst firstList = [1, 2, 3, 4, 5];\nconst secondList = [3, 4, 5, 6, 7];\nconst intersection = findCommonElements(firstList, secondList);\nconsole.log(intersection); // [3, 4, 5]
\n\n

额外的命名建议:

\n
    \n
  • 布尔变量:使用前缀 is、has、can(例如 isActive、hasPermission)。
  • \n
  • 函数:使用动词(getUserData、validateEmail、sendNotification)。
  • \n
  • 常量:使用大写蛇形命名法 UPPER_SNAKE_CASE(MAX_RETRY_COUNT、DEFAULT_TIMEOUT_MS)。
  • \n
\n\n

原则2:单一职责的小函数

\n\n

每个函数应该只做一件事,并且把它做好。如果一个函数执行多个操作(例如验证数据、查询数据库和发送邮件),它应该被拆分成多个小函数。这可以提高代码的可测试性和可复用性。

\n\n

糟糕的示例(Node.js Express):

\n
app.post('/api/users', async (req, res) => {\n  const { name, email, password } = req.body;\n\n  // 验证\n  if (!name || !email || !password) {\n    return res.status(400).json({ error: 'Missing fields' });\n  }\n  if (password.length < 8) {\n    return res.status(400).json({ error: 'Password too short' });\n  }\n\n  // 数据库操作\n  const existingUser = await db.findUserByEmail(email);\n  if (existingUser) {\n    return res.status(409).json({ error: 'User exists' });\n  }\n\n  const hashedPassword = await bcrypt.hash(password, 10);\n  const newUser = await db.createUser({ name, email, password: hashedPassword });\n\n  //                

博客

书籍推荐