article.read --id=200

技术选型会议:如何避免变成信仰之争

// published: 2025-08-31

在编程的世界里,命名是一件看似简单却极其重要的事情。有人说,计算机科学中只有两件难事:缓存失效和命名。这个玩笑道出了命名的困难,但也揭示了命名的重要性。好的命名让代码自解释,坏的命名让代码难以理解。命名是程序员最基本也最重要的技能之一,它直接影响代码的可读性和可维护性。

让我们深入探讨命名的艺术。命名的核心原则是"表达意图":一个好的名字应该清楚地表达这个变量、函数、类的用途,让读者不需要查看实现就能理解它的作用。比如getUserById比get更清晰,因为它明确说明了获取什么(用户)以及如何获取(通过ID)。calculateTotalPrice比calc更明确,因为它说明了计算什么(总价格)。isValidEmail比check更具体,因为它说明了检查什么(邮箱是否有效)以及返回什么(布尔值)。避免使用缩写和简写,除非是广为人知的(如HTTP、URL、ID)。usr、msg、btn这样的缩写虽然节省了几个字符,但降低了可读性。temp、data、info这样的泛化名称应该避免,它们没有传递任何有用的信息。如果一个变量叫temp,读者无法知道它存储的是什么,必须查看上下文才能理解。使用领域术语:如果你在开发电商系统,就用order、cart、checkout这样的业务术语,而不是thing1、thing2这样的通用名称。领域术语让代码和业务对齐,让非技术人员也能理解代码的意图。保持一致性:同一个概念在整个代码库中应该使用同一个名称,不要一会儿叫user,一会儿叫customer,一会儿叫account。不一致的命名会让人困惑,不知道它们是同一个概念还是不同的概念。使用可搜索的名称:单字母变量名(除了循环变量i、j、k)很难搜索,当你需要重构时会很麻烦。如果一个常量叫做7,你无法搜索它;如果叫做MAX_RETRY_COUNT,就很容易搜索。函数名应该是动词或动词短语,如getUser、calculatePrice、sendEmail,因为函数表示动作。类名应该是名词或名词短语,如User、OrderService、PaymentGateway,因为类表示事物。布尔变量应该是形容词或疑问句,如isValid、hasPermission、canEdit,让读者一眼就知道它是布尔值。

案例分析:Robert C. Martin在他的经典著作《Clean Code》中,用大量篇幅讨论了命名的重要性。他提出了许多实用的命名原则,这些原则已经成为业界共识。一个经典的例子是关于"魔法数字"的处理。假设代码中有这样一行:if (status == 4)。这个4是什么意思?只有写代码的人知道,而且过几个月连他自己也可能忘记。如果改成if (status == STATUS_APPROVED),意图就清晰了,任何人都能理解这是在检查状态是否为已批准。Martin还强调了"揭示意图"的重要性。比如一个函数叫做getDate(),它返回什么日期?创建日期?修改日期?到期日期?如果改成getCreatedDate()、getModifiedDate()、getExpirationDate(),就不会有歧义了。他还提出了"避免误导"的原则:不要用accountList来命名一个不是List类型的变量,这会误导读者。如果它是一个集合,就叫accounts;如果确实是List,才叫accountList。不要用hp、aix、sco这样的名字,因为它们是Unix平台的名称,会让人联想到平台相关的代码。Martin在ThoughtWorks工作期间,将这些原则应用到实际项目中,通过代码审查来推广良好的命名习惯。他发现,当团队建立了良好的命名文化后,代码的可读性显著提升,新人的上手速度也大大加快,bug的数量也减少了,因为好的命名让逻辑更清晰,错误更容易被发现。好的命名就像好的文档,它让代码自解释,减少了对注释的依赖。Martin有一句名言:"代码是写给人看的,只是顺便让机器执行。"这句话道出了命名的本质。

深度思考:命名的困难在于它需要对业务的深刻理解。一个不理解业务的程序员很难起出好的名字,因为他不知道这个概念在业务中的准确含义。这也是为什么领域驱动设计(DDD)如此强调"统一语言"(Ubiquitous Language):开发团队和业务团队应该使用相同的术语,这些术语应该直接反映在代码的命名中。比如在电商领域,"订单"、"购物车"、"结算"这些术语应该在代码中直接使用,而不是翻译成order、cart、checkout后再翻译回来。命名也是一个迭代的过程:第一次命名可能不够准确,随着对业务理解的深入,应该及时重命名。现代IDE都提供了强大的重命名功能,可以自动更新所有引用,不要因为怕麻烦而保留不好的名字。重命名是一种重构,是改善代码质量的重要手段。命名也需要团队共识:建立命名规范,在代码审查中关注命名质量,逐步形成团队的命名文化。命名规范应该包括:变量名用小驼峰,类名用大驼峰,常量用全大写下划线分隔,私有成员用下划线前缀等。但规范不是死板的规则,而是团队的约定,可以根据实际情况调整。好的命名是一种投资:它需要花费时间思考,但会在未来节省更多的时间。当你半年后回来看代码,好的命名会让你快速理解代码的意图;当新人加入团队,好的命名会让他们更快上手。

结语:命名是编程的基本功,也是代码质量的重要指标。当我们在键盘上敲下一个名字时,不妨多想几秒:这个名字清楚地表达了意图吗?它会误导读者吗?有更好的名字吗?这几秒钟的思考,会让代码的可读性大大提升。好的命名让代码成为文学,让编程成为艺术。命名是一种关怀,是对未来的自己和他人的尊重。