编写干净的代码

2025-05-24

编写干净的代码

我最近开始了一份新工作。每一份新工作都会带来一个新的代码库。这大概是我的第二十份工作了。所以我看过很多代码库。

不幸的是,它们都面临着同一个根本问题——不一致。这可能是多年代码修补、庞大团队、易手或以上所有因素共同作用的结果。

这会产生一个问题,因为我们读代码的时间远比写代码的时间多。当我阅读一份新的代码库时,这些不一致之处会分散我对代码本身的注意力。我的注意力会转移到那些繁琐的缩进和变量跟踪上,而不是重要的业务逻辑上。

多年来,我发现自己总是用同样的方法来筛选新的代码库。我会运用三种简单的实践来清理代码,提高其可读性。

为了演示,我将把它们应用到前几天读到的以下真实代码中。

function check($scp, $uid){
  if (Auth::user()->hasRole('admin')){
    return true;
  }
  else {
  switch ($scp) {
    case 'public':
      return true;
      break;
    case 'private':
      if (Auth::user()->id === $uid)
        return true;
      break;
    default: return false;
  }
  return false;
  }
}
Enter fullscreen mode Exit fullscreen mode

采用代码风格

我知道我是第 1647 个说“格式化你的代码”的人。但显然还是需要说。我处理过的几乎所有代码库都没有采用统一的代码风格。有了强大的 IDE、预提交钩子和持续集成 (CI) 流水线,几乎不需要费什么力气就能统一地格式化代码库。

如果目标是提高代码可读性,那么采用一种代码风格是唯一且最佳的方法。最终,采用哪种代码风格并不重要,重要的是始终如一地应用它。一旦您或您的团队就代码风格达成一致,就可以配置您的 IDE 或寻找一个可以自动格式化代码的工具。

由于我们的代码是 PHP,我选择采用PSR-2 代码规范。我使用了PHPCodeSniffer中的PHP Code Beautifier来自动修复代码格式。

这是采用某种代码风格后的代码。缩进让我们更容易看清代码的结构。

function check($scp, $uid)
{
    if (Auth::user()->hasRole('admin')) {
        return true;
    } else {
        switch ($scp) {
            case 'public':
                return true;
            break;
            case 'private':
                if (Auth::user()->id === $uid) {
                    return true;
                }
                break;
            default:
                return false;
        }
        return false;
    }
}
Enter fullscreen mode Exit fullscreen mode

命名事物 适当地清楚地

是的,你肯定听过很多次了。我知道命名很难。原因之一是命名没有明确的规则。一切都取决于上下文。而上下文在代码中经常变化。

利用这些上下文来构思一个名称。找到一个清晰的名称后,将其应用于所有上下文,将它们关联起来。这将确保一致性,并使变量在代码库中更容易追踪。

不必担心严格遵循传统的命名约定。我经常发现代码库混搭使用。清晰的名称比snake_casevs更重要camelCase。只需在当前上下文中保持一致即可。

如果遇到困难,可以使用临时名称继续编码。我经常会给变量命名$bob$whatever以避免卡在某个难题上。完成剩余部分的代码后,我会返回并重命名变量。到那时,我就能更好地理解上下文,并且通常能找到一个清晰的名称。

清晰的名称有助于未来的读者更快地理解这段代码。它们不必完美无缺。目标是增强对未来读者的信号。也许他们可以根据自己的智力水平逐步改进命名。

分析完这段代码后,我掌握了更多背景知识,可以选择更清晰的名称。使用清晰的名称不仅可以提高代码的可读性,还能增强上下文关联,使代码的意图更容易被理解。

function canView($scope, $owner_id)
{
    if (Auth::user()->hasRole('admin')) {
        return true;
    } else {
        switch ($scope) {
            case 'public':
                return true;
            break;
            case 'private':
                if (Auth::user()->id === $owner_id) {
                    return true;
                }
                break;
            default:
                return false;
        }
        return false;
    }
}
Enter fullscreen mode Exit fullscreen mode

避免嵌套代码

关于嵌套代码有一些硬性规定。许多开发人员认为应该只允许一层嵌套。一般来说,我倾向于忽略那些硬性数字的规则。考虑到代码的流动性,这些规则显得过于武断。

更重要的是,嵌套代码通常是不必要的。我见过函数体被包裹在 中if。我见过多层嵌套。我甚至见过空else代码块。通常,添加保护子句、反转条件逻辑或利用其他方法return可以消除嵌套代码的需要。

在这种情况下,我将利用现有的return语句并翻转以switch从代码中删除大部分嵌套。

function canView($scope, $owner_id)
{
    if ($scope === 'public') {
        return true;
    }

    if (Auth::user()->hasRole('admin')) {
        return true;
    }

    if ($scope === 'private' && Auth::user()->id === $owner_id) {
        return true;
    }

    return false;
}
Enter fullscreen mode Exit fullscreen mode

说到底,编程就是写作。作为一名作者,你对读者负有责任。保持一致的风格、词汇和流程是确保可读性的最简单方法。删除或修改这些内容并保持可读性,你就不会这样做。

想亲眼看看这些实践吗?我将举办一个一小时的免费研讨会,现场编码演示这些实践,甚至更多。立即注册,预留您的席位。

文章来源:https://dev.to/gonedark/writing-clean-code
PREV
我列出了 70 多个开源克隆网站,例如 Airbnb、Tiktok、Netflix、Spotify 等。非常适合学习!
NEXT
一个月的清洁代码