编写优美的代码

2025-05-27

编写优美的代码

因为编程是一门技术性很强的职业,我们常常在编写代码时忽略了设计。代码是为了让计算机执行我们需要的操作,设计又何必重要呢?我们使用的大多数编程语言都是为程序员构建的,并最终被转化为针对计算机进行优化的语言。因此,我们编写的代码不仅要面向编译器或解释器,更要面向人类阅读。为了提高代码的可读性,我将其视为一门艺术。当你将代码视为艺术时,它会变得易于理解和扩展。富有创意的代码还能减少错误,因为它更容易理解代码的执行过程。

写出艺术性代码的难点在于它并不容易。很多时候,一开始就让代码运行起来就已经够难的了,更别提发挥创造力了!然而,就像任何艺术形式一样,我们可以遵循一些基本技巧来编写设计精良的代码。我仍在探索编写优美代码的最佳方法,但这些步骤正是我为我的编程增添一抹艺术气息所遵循的。

从单元测试开始

测试驱动开发并非人人都喜欢,但我发现它是一种非常好的实践。它不仅能确保所有代码都经过测试,还能迫使你在编写代码之前思考其用途。在这些例子中,假设我们正在用 PHP 编写一个电子邮件客户端,并且希望在客户端的设计上有所创新。让我们从发送电子邮件的单元测试开始:

<?php

class EmailClientTest extends \PHPUnit\Framework\TestCase
{
    public function test_sending_an_email()
    {
        $client = new \Email\Client();
        $emailMessage = new \Email\Message('Hello world!');

        $result = $client->send('andrew@dev.to', $emailMessage);

        $this->assertTrue($result);
    }
}
Enter fullscreen mode Exit fullscreen mode

由于我们先编写了单元测试,所以我们已经知道代码应该如何布局。我们知道我们将有一个Email命名空间,其中包含两个分别代表Client和 的类Message。我们还知道我们将有一个send方法用于向客户端提交电子邮件消息。在单元测试中,我们还确定了代码片段的命名方式,这就引出了我的下一个要点。

命名变量和方法时使用语法

程序员经常开玩笑说命名很难,这的确是事实!然而,命名一段代码不仅难,而且非常重要。代码的命名方式决定了开发人员理解代码的速度,从而减少错误并缩短开发时间。在上面的例子中,我们决定将所有代码放在 Email 命名空间中,这样可以非常清晰地了解代码中包含的内容。接下来,我们选择用描述性名词Client来表示发送消息的对象和Message电子邮件本身。最后,我们调用一个send方法,该方法通常是一个与电子邮件相关的动词。现在,我们看到了一个很好的模式:使用名词作为类名,使用动词作为方法名。

保持函数小巧

将一个操作的所有代码都放在一个函数中很诱人。然而,为了提高可读性和可测试性,将其拆分成小块非常重要。我们以该send方法为例。

<?php

namespace Email;

class Client
{
    public function send(string $emailAddress, Message $message): bool
    {
        // Validate parameters
        $validateEmail = filter_var($emailAddress, FILTER_VALIDATE_EMAIL);
        $validateMessage = strlen($message->text()) < 1000;
        if (!$validateEmail || !$validateMessage) {
            return false;
        }

        // Communicate with email server
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, 'https://mail.example.com');
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, [
            'to' => $emailAddress,
            'text' => $message->text(),
        ]);

        $result = curl_exec($curl);
        curl_close($curl);

        return $result;
    }
}
Enter fullscreen mode Exit fullscreen mode

这个方法很简单,但有点混乱。它有点难以理解,所以我们添加了一些注释,以便读者了解发生了什么。但是,如果我们创建一个新的方法而不是注释呢?

<?php

namespace Email;

class Client
{
    public function send(string $emailAddress, Message $message): bool
    {
        if (!$this->validateParameters($emailAddress, $message)) {
            return false;
        }

        return $this->sendToMailServer([
            'to' => $emailAddress,
            'text' => $message->text(),
        ]);
    }

    private function validateParameters(string $emailAddress, Message $message): bool
    {
        $validateEmail = filter_var($emailAddress, FILTER_VALIDATE_EMAIL);
        $validateMessage = strlen($message->text()) < 1000;
        if (!$validateEmail || !$validateMessage) {
            return false;
        }

        return true;
    }

    private function sendToMailServer(array $params): bool
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, 'https://mail.example.com');
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $params);

        $result = curl_exec($curl);
        curl_close($curl);

        return $result;
    }
}
Enter fullscreen mode Exit fullscreen mode

我们的send方法现在简洁多了。其他函数每个都只用不到 10 行代码来执行单个任务,非常易于阅读。

使用样式指南

最后,我建议你使用所选编程语言的样式指南。对于 PHP,我喜欢使用PSR-2 FIG 标准来编写代码。FIG 标准得到了 Laravel 和 Symfony 等主流 PHP 框架的广泛认可和使用。此外,Symfony 团队发布了一个 CLI 实用程序,可以自动重新格式化你的代码以遵循 PSR-2:PHP 编码标准修复程序

结论

设计代码需要付出努力和实践,但回报也颇丰。它能使你的代码更精简、更易读,并通过提升清晰度和专注度来减少错误。为了继续学习,我建议阅读设计精良的代码。LaravelRuby on Rails代码库都是简洁代码的典范,并且经过了巧妙的处理。深入研究这两个库的源代码,了解更多信息!

文章来源:https://dev.to/restoreddev/writing-beautiful-code-10p6
PREV
OAuth 新手指南:使用 Google API 理解访问令牌和授权码 什么是授权码和访问令牌?OAuth 分步指南 使用刷新令牌获取新的访问令牌
NEXT
掌握 Apache Kafka:实时数据流核心完整指南