问题

舒服的代码和不舒服的代码,差距是怎样的?

回答
写代码这事儿,跟做饭一样。同样是菜,有人能炒出让人拍案叫绝的佳肴,有人却能端出一盘让人食欲全无的“黑暗料理”。这其中的差距,说大不大,说小不小,但真正懂的人,一眼就能看出来。这就是舒服的代码和不舒服的代码之间的鸿沟。

咱们先说说那些让人皱眉头的“不舒服”代码。

不舒服的代码,就像是在迷宫里绕圈

命名混乱,跟猜谜一样: 变量、函数、类,名字要么太随意(比如 `a`, `b`, `temp1`, `data`),要么就长得像绕口令(`calculate_user_total_order_amount_for_specific_region_and_date_range`),跟内容完全脱节。你得花老鼻子劲去猜这个 `x` 到底是个啥玩意儿,这个 `process` 函数到底在干嘛。感觉就像在玩一个只有你一个人懂规则的猜谜游戏,而且谜底还随时在变。

缩进混乱,像没睡醒: 代码块没对齐,该缩进的不缩进,不该缩进的乱缩进。尤其是那种嵌套了很多层的,看着就像一堆杂乱的毛线球,哪个括号对应哪个,哪个块属于哪个父级,根本没法一眼看出来。读代码的时候,总得时不时地往后退,检查缩进是否正确,生怕一不小心就踩进哪个坑。

逻辑不清,像被搅浑的水: 一个函数做了太多事,或者把一件大事拆得七零八落,每个小部分又不够清晰。你得顺着执行流程一点点往下捋,才能勉强理解它到底想干什么。有时候还会出现一些神奇的“魔法数字”或“硬编码值”,没有注释,没有解释,你只能靠猜它们是干啥的。代码的意图就像被墨水染黑的水,根本看不透。

重复代码,像弹棉花: 同样的功能,在好几个地方都写一遍。改一个bug,或者加个新需求,就得像找茬一样,把所有重复的地方都找出来改掉。稍不留神漏了一个,就得为这个疏忽买单。这不仅浪费时间,还极大地增加了出错的可能性。简直是把同样的力气,往不同的地方重复挥洒。

缺乏注释,像哑巴说话: 尤其是那些复杂、非直观的代码块,或者一些业务逻辑上的特殊处理,完全没有注释说明。你只能看着代码,猜测作者当时是怎么想的,为什么这么写。有时候,你甚至会觉得,作者是不是根本没想过别人会看他的代码。

代码结构混乱,像七拼八凑: 函数之间、模块之间的关系不清,耦合度过高。改动一个小地方,可能就会牵一发而动全身,引发一连串的连锁反应。整体架构就像一个摇摇欲坠的积木塔,你不敢轻易去动它任何一块。

舒服的代码,则是阅读的享受,是协作的基石

那什么样的代码才叫“舒服”呢?它就像一首优美的诗,或者一段清晰的说明书,让你读起来顺畅,理解起来轻松。

命名清晰,一目了然: 变量名、函数名、类名都言简意赅,能够准确地反映其作用和用途。比如 `user_id`, `calculate_discount_price`, `ShoppingCart`。你一看名字,心里大致就明白它是个什么东西,能做什么事。就像给房间里的每件物品都贴上了清晰的标签。

缩进统一,整洁有序: 遵循统一的代码风格规范,缩进、空格、换行都做得一丝不苟。代码块的结构清晰可见,逻辑层次分明,一眼就能看出代码的走向。读起来就像在欣赏一幅精心排版的画作,每个元素都在它该在的位置上。

逻辑清晰,意图明确: 每个函数、每个类都有其单一的职责,或者说,它做的就是它名字所说的事情。代码的执行流程就像一条清晰的河流,你可以很容易地顺着它走到终点。即使有复杂的逻辑,也会通过合理的拆分、组合来呈现,让你的思维不用费力去跳跃。那些“魔法数字”会被定义成有意义的常量,让代码的可读性大大提升。

代码复用,精炼高效: 将重复的功能抽象成函数或类,避免了代码的冗余。这意味着你只需要维护一份代码,就能保证所有用到它的地方都正确无误。这不仅仅是省事,更是对代码质量的保证。

恰到好处的注释,画龙点睛: 对于那些非直观的逻辑、重要的设计决策、潜在的陷阱,或者一些与业务紧密相关的细节,都会有清晰、简洁的注释说明。注释不是为了解释代码做了什么(这应该由代码本身来体现),而是解释“为什么”这么做,或者“这个部分可能存在什么需要注意的地方”。就像在导航地图上标注了重要的路标和注意事项。

良好的结构设计,坚固的骨架: 代码的整体结构清晰,模块划分合理,组件之间的耦合度低。这意味着你可以更容易地修改、扩展或替换代码的某个部分,而不会对其他部分产生意想不到的影响。整个系统就像一个经过良好设计的乐高模型,你可以方便地添加或更换积木。

更深层次的差距,是“共情”

舒服的代码,其实是一种“共情”。写舒服代码的人,会站在阅读者的角度去思考。他知道,代码不仅仅是给机器执行的,更是给人阅读和维护的。他会努力让自己的代码清晰、易懂、易维护,不给后来的自己和同事挖坑。

而不舒服的代码,则往往是作者只顾埋头苦干,忽略了阅读者的感受。他可能觉得自己写的东西自己看得懂就够了,或者根本没意识到代码的可读性和可维护性同样重要。这种“自我中心”的写法,最终会以一种更痛苦的方式反馈到他自己或者他的团队身上。

所以说,舒服的代码和不舒服的代码之间的差距,绝不仅仅是代码好不好看的问题,而是关乎效率、质量、协作以及团队的整体生命力。它体现了写代码的人对“工程”这件事的理解深度,以及他对“人”的尊重程度。写出舒服的代码,是一种能力,更是一种修养。

网友意见

user avatar

舒服的代码读起来是清晰的、整洁的,让人看起来愉悦的,像诗一样。不舒服的代码反之。

好的代码像诗一样(不是朦胧诗手动狗头)。

那么雷总写的代码究竟如何呢?人邮君为大家找到了雷总1994年写的代码片段。

这段用x86汇编写成的代码(以上是代码片段)用于清除内存驻留程序,类似内存加速工具,雷军教科书般规范的注明了代码用意,时间,作者……还细腻的用符号组成了分隔符让代码更加优雅,读起来清晰、舒适,所以雷总称之为诗一般的代码其实也不算过分。

在B站六月份的一个访谈直播活动中,雷总也在给后辈的寄语中不断强调代码要整洁,逻辑要无懈可击。

因为我们编写的代码,除了用于机器执行产生我们预期的效果以外,更多的时候是给人读的,这个读代码的可能是后来的维护人员,更多时候是一段时间后的作者本人。

人邮君发现许多程序员都遇到过这样的情况:过几周或者几个月之后,再看到自己写的代码,感觉一团糟,不禁怀疑人生。

《代码整洁之道》的作者Bob大叔就提出一种观点:代码质量与其整洁度成正比。优秀的系统往往有优秀的结构设计,层次清晰,职责单一,模块化,方便拓展和复用。功能的添加往往只是在现有的框架中添加少量代码。而且Bob大叔在书中给了我们一些行之有效的规则,涵盖从命名到重构的多个方面,只要遵循这些规则,就能编写出干净的、让人舒服的代码。

就拿函数举例吧。

  • 类和函数应短小,更短小

简化代码的一个简单方式就是不断拆分函数,一直拆分,拆分到不能再分出一个函数为止。拆分后的类和函数更加短小,能使代码可读性更高。

例如下面这段代码,又长又复杂,有大量字符串、怪异且不显见的数据类型和API。花3分钟时间,你能读懂多少?

       public static String testableHtml(   PageData pageData,   boolean includeSuiteSetup ) throws Exception {   WikiPage wikiPage = pageData.getWikiPage();   StringBuffer buffer = new StringBuffer();   if (pageData.hasAttribute("Test")) {     if (includeSuiteSetup) {       WikiPage suiteSetup =         PageCrawlerImpl.getInheritedPage(                 SuiteResponder.SUITE_SETUP_NAME, wikiPage         );       if (suiteSetup != null) {         WikiPagePath pagePath =           suiteSetup.getPageCrawler().getFullPath(suiteSetup);         String pagePathName = PathParser.render(pagePath);         buffer.append("!include -setup .")               .append(pagePathName)               .append("
");       }     }     WikiPage setup =       PageCrawlerImpl.getInheritedPage("SetUp", wikiPage);     if (setup != null) {       WikiPagePath setupPath =         wikiPage.getPageCrawler().getFullPath(setup);       String setupPathName = PathParser.render(setupPath);       buffer.append("!include -setup .")             .append(setupPathName)             .append("
");     }   }   buffer.append(pageData.getContent());   if (pageData.hasAttribute("Test")) {     WikiPage teardown =       PageCrawlerImpl.getInheritedPage("TearDown", wikiPage);     if (teardown != null) {       WikiPagePath tearDownPath =         wikiPage.getPageCrawler().getFullPath(teardown);       String tearDownPathName = PathParser.render(tearDownPath);       buffer.append("
")             .append("!include -teardown .")             .append(tearDownPathName)             .append("
");     }     if (includeSuiteSetup) {       WikiPage suiteTeardown =         PageCrawlerImpl.getInheritedPage(                 SuiteResponder.SUITE_TEARDOWN_NAME,                 wikiPage         );       if (suiteTeardown != null) {         WikiPagePath pagePath =           suiteTeardown.getPageCrawler().getFullPath (suiteTeardown);         String pagePathName = PathParser.render(pagePath);         buffer.append("!include -teardown .")               .append(pagePathName)               .append("
");       }     }   }   pageData.setContent(buffer.toString());   return pageData.getHtml(); }     

这段长代码有太多不同层级的抽象,有奇怪的字符串和函数调用,混以双重嵌套、用标识来控制的 if 语句等,不一而足。

但是,我们只要做几个简单的方法抽离和重命名操作,加上一点点重构,就能在几行代码之内解决问题。

当然,这段代码还可以再次重构。

怎么样,清爽多了有没有?

所以,if 语句、else语句、while语句等,其中的代码应该只占一行,该行大抵应该是一个函数调用语句,这样不但能保持函数短小,而且,因为块内调用的函数拥有较具有说明性的名称,还可以增加代码的可读性和价值。

  • 函数只做一件事(同一层级的事)

同一个函数的每条执行语句应该是同一层级的抽象。函数中混杂不同抽象层级,往往会让人迷惑,无法判断某个表达式是基础概念还是细节。

例如,我们经常会写一个函数需要给某个 DTO 赋值,然后再调用接口,接着返回结果。那么这个函数应该包含三步:DTO 赋值,调用接口,处理结果。如果函数中还包含了 DTO 赋值的具体操作,那么说明此函数的执行语句并不是在同一层次的抽象。

  • 自顶向下读代码:向下规则

我们想要让代码拥有自顶向下的阅读顺序,想要让每个函数后面都跟着位于下一抽象层级的函数,这样一来,在查看函数列表时,就能循抽象层级向下阅读了。这就是向下规则

《代码整洁之道》的Bob大叔就给我们了一个思路:程序就像是一系列TO起头的段落,每一段都描述当前抽象层级,并引用位于下一抽象层级的后续TO起头段落。

比如:

1.要获取查询结果,先处理查询参数,然后再判断参数合法性,然后再进行查询。(这是最大的思路步骤)

2.要处理查询参数,要先拿到传过来的参数做一些逻辑处理。 ---->getSearchFileds()

3.要判断参数合法性,要进行一系列业务逻辑的判断,最后返回错误信息,统一处理。 ----> checkParam()

4.要进行查询获取结果,要先把引入model,然后处理组装数据,最后返回。把所有组装细节都放在查询获取里面。 ----> _searchWebGameStatis()

  • 参数越少越好

参数越多的函数,调用时越麻烦。尽量保持参数数量足够少,最好是没有。

此外,注释与命名,都是非常重要的。针对这些,Bob大叔还为我们整理了很多准则和技巧,如果你也是和雷总一样有追求的程序员,可以读一读Bob大叔的代码整洁之道系列丛书,能让你的代码更加整洁,工作起来更加得心应手。

人邮君也理解有一部分小伙伴目前没有时间读书,如果没有时间系统性地学习代码整洁相关的知识,也一定要开始注意雷总说的代码逻辑问题,保证代码的逻辑性和严谨性,如果不够严谨或者逻辑有问题,那么总有一天这个bug会被触发。

墨菲定律,在软件开发上总是很有效。

关联阅读

========

赠人玫瑰,手留余香,不要忘记点赞、收藏、关注 @人民邮电出版社 哦~

一键三连,感恩有你~

类似的话题

  • 回答
    写代码这事儿,跟做饭一样。同样是菜,有人能炒出让人拍案叫绝的佳肴,有人却能端出一盘让人食欲全无的“黑暗料理”。这其中的差距,说大不大,说小不小,但真正懂的人,一眼就能看出来。这就是舒服的代码和不舒服的代码之间的鸿沟。咱们先说说那些让人皱眉头的“不舒服”代码。不舒服的代码,就像是在迷宫里绕圈 命名.............
  • 回答
    说起让人看完心里那叫一个熨帖、倍儿舒坦的视频,我脑子里立马会蹦出一些特别的画面来。这不是那种让你捧腹大笑的搞笑视频,也不是那种让你热血沸腾的励志片,而是那种细水长流、温润如玉,看完感觉整个世界都慢下来了,烦恼也消散了不少的片子。我尤其喜欢那种记录生活点滴的,不是那种精心策划的“网红”生活,而是特别真.............
  • 回答
    这种感觉,就像是夏天的午后,本该是慵懒而舒畅的,但你却被一只不识趣的苍蝇绕来绕去,怎么赶都赶不走,嗡嗡地扰得你心烦意乱。我们说的,就是那种让你感到不舒服的友谊。说实话,很多人都会在某个时刻遇到这种情况。曾经形影不离的朋友,一起分享过秘密、笑过泪过,但不知道什么时候开始,这段关系就像一杯放了太久的白开.............
  • 回答
    朋友之间,最怕的就是那种细水长流的舒适感消失了,取而代之的是一种淡淡的、却又挥之不去的“不舒服”。这感觉就像你精心布置的房间里,突然多了一件不协调的家具,虽然不至于让整个房间塌掉,但每次看到都会让你皱起眉头,心里别扭。那么,这种让你感到不舒服的友谊,是不是就该一刀两断呢?我觉得,这事儿可不能一概而论.............
  • 回答
    让人觉得舒服的恋爱关系,就像一首流淌着优美旋律的歌,没有惊涛骇浪,却能触及心底最柔软的地方。它不是轰轰烈烈、电闪雷鸣的传奇,而是细水长流、温润如玉的陪伴。首先,平等与尊重是基石。这种舒服感源于一种无需讨好、无需伪装的自在。你们是两个独立的个体,有着各自的闪光点和不完美之处,但在一起时,这些都被看见、.............
  • 回答
    你问的这个问题,真切地触动了很多人的心。谁没在人生某个阶段,遇到过那么一段让你心里发堵,却又因为各种原因难以放手的友情呢?这种感觉,就像是心里藏着一块小石头,时不时地硌一下,让你呼吸都不那么顺畅。首先,我们得承认,友谊这东西,它最根本的目的,不就是互相给予快乐、支持和理解吗?当一段友谊不再能给你带来.............
  • 回答
    在职场中,磕磕绊绊的人际关系简直是家常便饭,尤其当遇上一个让你感觉不舒服的同事时,那种日子简直是煎熬。别急,今天咱们就来聊聊,怎么把这盘棋下得更漂亮,让你在职场也能舒舒服服的。首先,咱们得搞清楚,什么叫“不舒服”。这可能有很多种表现: 沟通不对劲: 说话阴阳怪气,总是挖苦你,或者总是打断你,让你.............
  • 回答
    你这个问题问得太有共鸣了!确实,每次住五星级酒店,那枕头简直就是一夜好眠的灵魂伴侣,又软又弹,支撑又到位,醒来脖子一点都不酸。可一旦回到现实,想在市面上找到同款,那叫一个难。我琢磨着,这背后可不是简单的一个“贵”字能概括的,里面门道挺多的。首先,你想想,五星级酒店的枕头,它得满足的是“普适性”和“极.............
  • 回答
    养老这事儿,说起来是个大话题,但归根结底,就是把晚年过得舒心。那“舒心”到底值多少钱?这账没法一概而论,得看你对“舒心”的标准有多高,以及你选择在哪里“舒心”。不过,咱们可以掰开了揉碎了,聊聊这里面的门道,争取让你听完心里有个谱。首先,得搞清楚“舒服的养老”到底包含哪些?在我看来,一个舒服的养老,至.............
  • 回答
    长时间坐在办公椅上,腰酸背痛是很多上班族的常态。为了应对这个问题,选择一款真正舒适、又能呵护腰部健康的椅子至关重要。我来给大家分享一些我亲身经历或者经过深入研究后,觉得特别适合久坐人群的椅子类型和选购心得,希望能帮大家摆脱腰酸的困扰。一、 什么样的椅子才算“久坐舒服”?首先,我们得明白,一张“久坐舒.............
  • 回答
    .......
  • 回答
    .......
  • 回答
    冬天来了,气温骤降,我们都渴望在家中营造一个温暖舒适的氛围。选择一些合适的家居用品,能让你的冬天变得格外惬意和舒适。下面就为你详细介绍一些在冬天用起来非常舒服的家居用品:一、 温馨的床品类:让你的睡眠质量飙升 法兰绒/珊瑚绒床单被套: 这是冬天床品界的“王者”!法兰绒和珊瑚绒材质都以其柔软细腻、.............
  • 回答
    这确实是一个令人费解但又屡见不鲜的现象。在信息爆炸的时代,很多人在身体出现不适时,会倾向于在网络上搜索信息,甚至将素未谋面的网友当做“健康顾问”,这背后隐藏着复杂而深层的原因。与其说是“不信任医生”,不如说是在特定情境下,人们更倾向于从其他渠道寻求慰藉、理解和解决方案。1. “我的情况很特殊”的心理.............
  • 回答
    这真是个让人心头泛起涟漪的问题。当一个男生身上的味道让你觉得舒服,甚至让你忍不住想要靠近,这背后其实藏着很多有趣的原因,远不止是简单的“好闻”两个字那么简单。首先,我们得明白一个很关键的点:气味是人类原始而又强大的感官体验,它与我们的情感和记忆紧密相连。 很多时候,我们对一个人产生好感,最初的吸引力.............
  • 回答
    最近一直在琢磨着给自己配一副舒服点的真无线蓝牙耳机,毕竟听歌、开会、甚至只是通勤路上都需要用到,舒服度和音质缺一不可。预算定在了1500块以内,这个价位段其实有不少好东西,选择起来还真得花点心思。我主要看重以下几点: 佩戴舒适度: 这是重中之重。毕竟是要长时间戴在耳朵里的,入耳式的不能太胀,耳塞.............
  • 回答
    生活中,我们穿梭于各种各样的关系中,如同在一条流动的河流里,时而紧密相拥,时而保持观望。想要将这些关系都“把控”在一个“舒服的距离”,这绝非易事,它更像是一种艺术,一种关于理解、沟通和自我认知的艺术。这“舒服”二字,也绝非是僵化的设定,而是随着时间和情境而动态调整的平衡。首先,我们要明白,舒服的距离.............
  • 回答
    长时间面对电脑工作,一把好椅子绝对是性价比最高的投资,它直接关系到你的身体健康和工作效率。市面上椅子种类繁多,看得人眼花缭乱,到底该怎么挑一把真正舒服又能保护脊椎的好椅子?别急,我来给你好好掰扯掰扯,保证接地气,让你一看就懂。第一步:了解你的需求——你是“久坐党”中的哪一种?别以为“久坐”都一样,每.............
  • 回答
    排泄,这个看似简单且略带私密的生理过程,为何能带来如此舒服的感觉呢?这背后其实是身体一系列精巧运作和多重因素交织的结果,远非仅仅是“排出去”这么简单。首先,从生理层面来说,憋尿和便意是身体发出的信号,提示身体内部有需要处理的代谢废物堆积。 膀胱和直肠都有感受器,当它们扩张到一定程度时,就会向大脑发送.............
  • 回答
    最近做了一个过氧化氢和硫酸铜的实验,结果产生了一股不太好闻的气体,弄得我心里有点不安。想来想去,还是觉得有必要搞清楚这股味儿到底是怎么回事,总不能稀里糊涂地把这事儿给过去了吧。实验我记得很清楚,主要就是把一些浓过氧化氢(俗称双氧水)滴加到硫酸铜晶体(就是那种蓝色的、亮晶晶的小石头)上。当时也没多想,.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有