引言
今天我们来聊点轻松的话题:命名。先别走,你以为轻松就意味着不重要?但是我要告诉你,这个话题却是计算机科学的两大难题之一。
程序员圈子里有句经典调侃:“计算机科学其实就两个难点,一个是缓存失效,另一个是命名。”说来好笑,但懂行的人都知道,这话一点不夸张。命名这件事,看起来谁都会,真要做得好,可真没那么容易。
古人讲“名不正则言不顺”,这放在写代码上也挺贴切:名字都没起对,沟通和理解自然就会出问题。尤其是做后端的 Java 开发者、架构师,在搞领域驱动设计(DDD)或者微服务架构时,类名、变量名、服务名……每个都不是随手写写就行的。
说得直白点,如果你连这些关键名词的含义和边界都没想明白,那真的 先别急着动手写代码。
下面我们就从几个角度聊聊,为什么命名这事儿这么难搞,它背后又藏着哪些深层的问题,以及我们有哪些靠谱的应对方法。
命名的重要性:代码可读性与沟通效率的基石
写代码时,名字起得好不好,直接决定别人(包括你未来的自己)看不看得懂。一个清晰的类名、变量名,往往不需要注释就能说明它的用途和意图;反过来,如果名字乱七八糟,再聪明的逻辑也会被埋没,搞得别人一头雾水。
命名不只是让代码“好看”那么简单,它关系到团队协作。试想一下,一个团队如果大家说的术语都不一致,一个叫“Order”,另一个叫“Booking”,你说的是“商品”,别人理解成了“库存”……讨论起需求和设计,就像各说各话,效率大打折扣。好的命名,是大家沟通时的公共语言,是避免误解的第一步。
尤其在多人协作、大型系统开发中,清晰、一致的命名甚至能左右整个项目的节奏。从代码评审到写文档再到和产品、业务沟通,统一的术语能省下无数解释的口水和时间。
再说深一点,命名的重要性在领域驱动设计(DDD)中体现得更彻底。DDD 强调“代码就该说人话”——什么意思?类名、方法名、变量名这些东西,应该和业务领域里常用的词保持一致。这样一来,不懂技术的业务同事也能看懂基本结构,开发和业务就更容易形成共识。
有时候,一个贴切的名字胜过十行注释,它直接告诉你:这个类、这个方法,在业务中是干嘛的,扮演什么角色。
顺带说句实话:给变量取个合适的名字,真的不比写逻辑轻松。有时候脑细胞烧光都想不出一个合适的词。但回过头来想一想,咱这么较真,不就是为了让代码名正言顺,自己和别人都能放心读下去嘛。
从领域建模看命名:名字乱,其实是业务没想清
在领域驱动设计(DDD)里,有个特别关键的概念叫“通用语言(Ubiquitous Language)”。什么意思?就是开发和业务人员要用同一套说法来描述领域里的东西,避免各说各话、鸡同鸭讲。只有大家对业务有一致理解,代码里的命名才会清晰、准确。
但现实是:命名混乱,很多时候不是开发粗心,而是业务本身就没捋顺。说白了,名字乱,是因为我们对业务的理解还不够深。
你可以想象个场景:如果连业务方都说不清楚“订单”和“合同”到底有什么不同,开发人员十有八九就会整出个 DataInfo
或 TmpResult
来应付。这种“临时名”“万金油名”背后,其实透露着一种集体的困惑:我们压根没弄明白眼前的业务是什么,更谈不上建模和抽象了。
很多让人看不懂的类名、变量名,其实反映的是:领域模型没建好,边界不清楚。DDD 提倡用“边界上下文”把不同业务领域隔开,每个上下文里有自己的术语、模型,一旦这些清楚了,命名反而变得容易。你只要照着业务来的概念取名,类名、方法名自然就顺理成章了。
所以啊,如果你卡在一个变量上,翻来覆去都想不出个合适的名字,不一定是你词穷了,可能是你还没搞懂自己要表达的业务逻辑到底是什么。
命名不恰当的典型反例
为了让问题更直观,我们来看几个命名混乱的反面案例,感受一下“糟糕命名”带来的迷惑:
1 | // 示例1:类名含糊,职责不清 |
看到这个DataManager
,你是不是也一脸问号?它到底是管什么数据的?订单?用户?日志?完全看不出来。再看里面的dataMap1
、dataMap2
,命名就像写作业随手糊弄的变量,根本猜不出里面存的是什么。process()
方法名也一样模糊,处理什么?怎么处理?职责边界在哪儿?一概不知。
要是你在一个电商系统里遇到这样的类,你甚至不知道它是处理订单、商品,还是别的什么业务——只知道它看起来在“忙着处理些事”,但到底是啥事儿,天知道。
1 | // 示例2:变量命名随意,令人困惑 |
变量名aa
、bb
、cc
,完全像临时代码,还以为是在调试阶段忘了改名;方法名getPname()
、getPdesc()
也一头雾水,Pname 是什么的名字?Product?Person?Partner?没有任何上下文线索,全靠猜。
阅读这类代码,简直像在解谜:你得边读边反推它到底想干嘛,效率低不说,还容易猜错。更别提这种代码交给别人维护,简直是灾难现场。
说实话,写出这种命名的代码,不光坑队友,连几周后自己回头看,可能也只能自问一句:“我这是写了个啥来着?”
当命名卡壳时,需求和设计可能早已跑偏
很多时候,我们在给类或变量取名时卡住,不是因为词穷了,而是因为这东西到底该怎么定义,自己心里也没谱。换句话说,命名上的犹豫,往往是一个提醒:你对这个业务、这个设计,还没真正想清楚。
如果业务概念本身就模糊、需求逻辑不通,那代码里再怎么斟酌用词也是白搭——正所谓“名不正,则言不顺”,名字都起不好,后面的实现也很难走正道。
最典型的情况是:需求方提供的描述模棱两可,甚至自相矛盾。你问“这个订单和那个订单是一个意思吗?”对方可能含糊其辞,说“差不多吧”。这时候你要落地实现,只能凭感觉起个“听起来像那么回事”的名字凑合用。问题是,一旦整个概念没厘清,后面不仅命名乱,逻辑也会跟着乱,等着返工就是迟早的事。
更极端一点的例子:有时候你发现一个类或者服务怎么起名都别扭,那不一定是命名功底的问题,而是整个设计就有问题。比如一个模块里,既处理订单逻辑又处理支付逻辑,怎么起名都像在偷换概念——这可能意味着本该拆开的两个职责被硬塞在了一起。这就像一个服务既当快递员又当出纳员,怎么命名都别扭,因为根本就是设计出了问题。
还有一种情况是类或方法职责太重,你试着给它命名,却发现无论写多长都概括不了它到底干了什么。那基本可以断定:它干的活太多,违反了单一职责原则。命名上的犹豫,其实是在提醒你该拆了。
所以,如果你发现自己在命名时反复斟酌、总觉得“不对劲”,别忽视这种直觉。它可能不是你语文水平的问题,而是在提醒你:需求和设计该回炉重造了。比起硬憋一个听起来还行的名字,不如先停下来问一句:我真的理解这个东西了吗?它该做的事,清楚了吗?边界在哪儿,职责是什么,有没有搞混?
命名难,不只是语言难,它难在——它暴露了问题的模糊。
别急着敲代码,先把名字想明白
当你在给类或变量命名时陷入纠结,别着急凑一个“差不多”的名字敷衍过去。正确的做法是:往回倒推,看看问题到底出在哪儿。很多时候,命名卡壳的背后,是业务没理顺、需求没讲清。
这时候,最有用的不是埋头敲代码,而是抬头去问:这个东西在业务里到底是啥?它扮演什么角色?有没有已经约定俗成的业务术语可以用?和产品、业务方多聊聊,哪怕多问几句“这个到底是啥意思”,很多模糊的需求都会因此变清晰。开发者的“较真”,反而常常能帮大家把方案理顺。
此外,也别忽视领域建模的价值。用领域驱动设计(DDD)的方法来梳理概念,比如画一画领域模型、明确“边界上下文”,这些都能帮助我们厘清:这个名词到底在哪个子系统里?它代表的是哪个角色?在这个范围内我们应该统一叫什么名字?
一个好的领域划分,就像画好地图边界:这边叫订单,那边叫支付,中间不能混着来。有时候,外部系统传过来的字段和你内部模型不一致,这时候可以加个防腐层做转换,别硬往自己模型里塞些“似是而非”的名字,长远看只会把系统搞得越来越乱。
当然,这一切的前提是:别怕花时间搞清楚问题。有人调侃说“写代码5分钟,想名字两小时”,虽然听起来夸张,但意思没错,前期想清楚了,后期就不用花三倍的时间去返工、重构、解释。名字是写给人看的,不清不楚的命名只会给未来的你和团队挖坑。
(顺便一提:命名这事儿别冲动,想清楚再下手。多问几个“它到底是啥”,多和业务确认几次,你可能会惊讶地发现:原来它真正应该叫X,而不是我们一直以为的Y。)
命名这事儿,没点底子真不行
想把命名这件事做得漂亮,光靠临场发挥是不够的。平时的积累和调研,才是你命名功力的底气。
最基本的,是对业务的熟悉。开发者最好别只盯着代码,多花点时间了解自己所处行业的术语和模型。如果接手了一个新模块,先别急着上手写逻辑,不妨先问问:这个东西行业里一般怎么叫?有没有官方的定义?有没有标准的流程图?提前做点功课,下笔时才不至于拍脑袋起名。
再进一步,可以多看看经典的系统设计。不管是开源项目,还是大厂的技术分享,很多成熟系统在命名和模型设计上的用词都很讲究。你会发现,那些看起来“理所当然”的好名字,其实都是对业务理解到位后的自然表达。多看、多学,你的脑子里就会慢慢建立起一套“命名参考库”,一遇到类似问题,能立马调出合适的表达。
还有一点很重要:别闭门造车。多和产品、运营、业务同事聊天,听他们怎么描述业务。很多术语和说法,就是从他们嘴里蹦出来的。能把这些“业务语言”转化为“代码语言”,就是领域驱动设计里讲的“通用语言”。一旦大家说的词统一了,写出来的代码自然就顺眼、顺手,也更容易被理解。
结语
“类和变量的名字都没想清楚,就别着急写代码。”这不是矫情,而是靠谱开发者的一种习惯:先想明白,再动手。
命名,说到底是一种表达能力。好名字的背后,是你对业务、对系统、对边界的深入理解。反过来,那些看着就让人迷糊的名字,往往是你对问题还没完全吃透的信号。
希望上面这些分享,能让你开始重视命名这个看似细节、其实影响深远的事情。在日常开发中,留点时间给命名,多积累一点背景知识,多跟业务聊几句。久而久之,你会发现:代码好不好读,其实从名字就能看出来。
毕竟,写代码不难,难的是写出让人读得懂、维护得起的好代码。而一个贴切的名字,正是这段好代码的起点。