信息无障碍通道 | 滚动新闻 | RSS订阅 | 网站地图 |
你好,游客 登录 注册 搜索

Goodbye Clean Code,这是对代码编写与重构的新感悟

发布时间:2020-01-20 10:34:17  来源:机器之心 企鹅号   采编:郭椿砾  背景: 无障碍通道

  干净的代码是我们的目标吗?不,可能冗余一点的代码才更好读。

  Clean Code,顾名思义就是整洁的代码,或者说清晰、漂亮的代码,相信大多数开发者都希望自己能写出这种类型的代码。

  那么我们为什么需要 Clean Code 呢?这里需要明确的是,写代码并不只是用来跑一跑或实现某些功能,写代码更重要的是便于维护。所以从这一点出发,写代码就像写一篇文章,阅读体验应该非常流程,逻辑承接应该非常顺滑。

  现在有两种文章会让我们阅读体验不难么好,一种是过度冗余,有一些简单的概念经常出现,让我们会觉得文章不够精炼。另一种是太精炼了,每一部分之间的逻辑跳跃比较大,或者说我们很难跟上作者的叙述逻辑,那么这样的文章看起来会显得生涩难懂。

  代码也一样,有些重复使用的方法可以编入相同的函数,同类函数之间的关系可以编入类与对象。这样代码整体能显得更加「干净」。但需要注意的是,并不是说最紧凑的代码就是最好的,例如类的继承,如果说读懂当前类需要往上翻好几个类,这种体验并不友好,似乎代码的逻辑跳跃让人很难跟着走。

  所以 Clean Code 到底好不好?

  根据列表推导式(first method)精简代码(second method)。

  React 主要维护者 Dan Abramov 也在考虑这件事,其中 React 是 Facebook 维护的 JavaScript UI 库。他在博客上写了一篇对 Clean Code 的反思,这篇文章在 HackNews 上获得了非常热烈的反响。下面我们具体看看 Dan Abramov 眼中的代码编写准则。

  精简的魅力

  已经到了深夜,我的同事正在检查这一周写的所有代码。他们在做的东西可以理解为,通过拉拽图形边缘的小控件来变成矩形和椭圆形等形状,代码本身是没有问题的。

  但似乎代码的重复性有点多,每一个形状都有一组不同的控件,从不同方向拉拽每一个控件都会以不同的方式影响形状的位置与大小。如果用户按住了 Shift 键,那么在改变形状的同时还应该展示各种属性。实现这些能力需要如下一系列数学计算:

  letRectangle=,resizeTopRight(position,size,preserveAspect,dx,dy){//10repetitivelinesofmath},resizeBottomLeft(position,size,preserveAspect,dx,dy){//10repetitivelinesofmath},resizeBottomRight(position,size,preserveAspect,dx,dy){//10repetitivelinesofmath},};letOval=,resizeRight(position,size,preserveAspect,dx,dy){//10repetitivelinesofmath},resizeTop(position,size,preserveAspect,dx,dy){//10repetitivelinesofmath},resizeBottom(position,size,preserveAspect,dx,dy){//10repetitivelinesofmath},};letHeader=,resizeRight(position,size,preserveAspect,dx,dy){//10repetitivelinesofmath},}letTextBlock=,resizeTopRight(position,size,preserveAspect,dx,dy){//10repetitivelinesofmath},resizeBottomLeft(position,size,preserveAspect,dx,dy){//10repetitivelinesofmath},resizeBottomRight(position,size,preserveAspect,dx,dy){//10repetitivelinesofmath},};

  我们可以看到上面已经是简化的代码了,每一条计算语句下都有 10 条几乎重复的计算过程。这样的重复性计算代码看起来就很冗余,它也不是一种 Clean Code。

  我们很容易发现,大多数重复代码都有相似的属性。例如 Oval.resizeLeft() 与 Oval 的其它方法都非常相似,因为它们都是椭圆的某些属性或操作。其它 Rectangle、Header 和 TextBlock 也会有重复,因为文本框都是矩形的。

  所以我们可能会想到,能不能通过组合与合并的方式将所有重复项都删除掉?我们大概能得出下面的这种代码:

  letDirections=,left(...){//5uniquelinesofmath},bottom(...){//5uniquelinesofmath},right(...){//5uniquelinesofmath},};letShapes=,Rectangle(...){//5uniquelinesofmath},}

  组合成各种行为特性:

  let=Directions;functioncreateHandle(directions){//20linesofcode}letfourCorners=[createHandle([top,left]),createHandle([top,right]),createHandle([bottom,left]),createHandle([bottom,right]),];letfourSides=[createHandle([top]),createHandle([left]),createHandle([right]),createHandle([bottom]),];lettwoSides=[createHandle([left]),createHandle([right]),];functioncreateBox(shape,handles){//20linesofcode}letRectangle=createBox(Shapes.Rectangle,fourCorners);letOval=createBox(Shapes.Oval,fourSides);letHeader=createBox(Shapes.Rectangle,twoSides);letTextBox=createBox(Shapes.Rectangle,fourCorners);

  上面这种方法只会有一半的代码量,重复代码基本都被删除了,所以它是干净的。如果我们想改变图形方向或形状等特定属性,我们只需要修改一段代码,而不需要到处更新这个函数。

  现在代码过于重复这个问题解决了,我们可以开心地把它提交给代码库。并且因为写了更简洁的代码,我们可以带着成就感上床睡觉了。

  事情并不那么简单

  但是等等,到了第二天,你会发现事情并不简单。可能老板会找你谈话,委婉地想要你撤回昨晚重构的干净代码。但这出现了什么问题?重构的代码非常简单,它比之前一堆乱麻的代码漂亮很多。

  当时你很可能心不甘情不愿,但几年后,你会发现老板的观点才是正确的。

  痴迷于「Clean Code」并删除重复代码是我们都会经历的一个过程。当我们对代码感到不太自信时,我们很容易将自我价值与自信感联系到一些可衡量的标准。例如一组严格的代码规则、一个确定的命名策略、一个明确的文件结构和没有重复的「干净」代码等。

  在实践中,我们很自然地想着删除重复代码。我们通常知道每一次修改代码后的长短变化,因此移除重复代码可以提升一些客观的代码度量标准。不过糟糕的是,这种现象扰乱了我们的认同感:「虽然难懂一些,但我现在是在写一种干净的代码。」

  一旦我们学会了创建 Abstraction,就很容易对这种能力产生很高的期望,并且每当我们看到重复代码就会想起一种「高效」的抽象方法。经过几年的代码经验后,我们一眼就可以看到各种重复代码,抽象就是我们新的能力。如果有人告诉我们抽象是一种美德,我们就会欣然接受它,同时也会因为别人不崇尚「清洁代码」而对他们品头论足。

  现在,我们要考虑到,「重构」是一场灾难,它主要体现在两方面:

  首先,我们并不能和写代码的人直接交流,我们只是重写代码,并简要地检查它。即使这是一种进步,那也是一种非常糟糕的方式。一个健康的工程团队需要不断建立信任,在没有讨论的情况下重写同事的代码是对协作的一个打击。

  其次,什么都是有成本的,我们的代码会在后续的修改需求与降低重复性上进行权衡。还是之前的例子,如果我们需要为不同形状上的不同控件提供许多特殊能力。那么我们的抽象需要复杂好几倍才能完全囊括它们,而在最初「冗余」的代码中,添加新行为简直就是小菜一碟。

  这难道意味着我们需要写「不干净」的代码?并不是的,我们需要仔细思考到底「干净」和「不干净」指的都是什么。

  写代码就是一段旅程,我们需要考虑这段旅程到底需要走多远,也需要考虑我们现在的位置又在哪。如果我们第一次通过函数或重构一个类来令代码变得更简单,那么会获得很多满足感。如果我们对自己代码感到比较满意,那么追求更干净的代码是非常好的,我们可以在这个阶段持续做一段时间。

  但不要止步于此,不要做一个干净代码的狂热推崇者。干净的代码并不是最终目标,只是我们在处理复杂系统的一个尝试。我们可能并不知道这种修改最终对代码库有什么样的影响,但是干净的代码会指引一条明路,至少这个方向是对的。

  干净代码可以指引我们,但熟悉后应该放松它的指引。代码库整体的逻辑与风格,整体的可读性与修改便捷性,才是我们该追求的。

  参考链接:

  https://overreacted.io/goodbye-clean-code/

  https://news.ycombinator.com/item?id=22022466https://zhuanlan.zhihu.com/p/25541626


本文来源:机器之心 企鹅号

本文评论
再憋大招!神秘地标现身,荣耀正在加快科技创新步伐
11月2日,荣耀官方微博发布了一张#解锁新地标#的海报,海报中充满了科技元素,并有“深圳·荣耀智慧制造产业园”的定位字样,并发文表示...
日期:11-04
混动集大成之作 迈凯伦Artura科技揭秘
“我们曾率先将高性能混合动力技术运用于P1和Speedtail车型,现如今问世的全新Artura(参数|询价)堪称我们在该技术领域的集大成之作,它将演绎新一代...
日期:10-20
特斯拉将向车主提供新版 FSD,驾驶记录良好才能获得
北京时间 9 月 18 日早间消息,特斯拉将向用户推送备受争议的新版全自动驾驶 Full Self-Driving(简称 FSD)软件,谁能获得最新测试版软件呢?特斯拉将会调...
日期:09-18
特斯拉太阳能设备突然涨价引不满:欲恢复原价平息此事
北京时间 9 月 18 日早间消息,据报道,根据今年提交给美国加州圣何塞地区法院的最新文件,由于部分特斯拉客户抱怨太阳能价格在今年早些时候突然上涨,该...
日期:09-18
华为:正式加入互联网路由安全规范 MANRS
9 月 18 日消息 昨日,华为宣布正式成为 MANRS(Mutually Agreed Norms for Routing Security,互联网路由安全规范)的 EVP(Equipment Vendor Program,设...
日期:09-18
外媒:三星90Hz笔记本电脑OLED面板有望用于苹果MacBook Pro
9月17日消息,据国外媒体报道,当地时间周四,三星显示在官网上宣布,他们已开始大规模生产90Hz刷新率的笔记本电脑OLED面板,并将向华硕供货,用于他们即...
日期:09-17
特斯拉 CEO 马斯克:中国汽车制造商具备全球竞争力,特别是在软件设计方面
9 月 17 日上午消息,2021 世界新能源汽车大会继续在海南进行。特斯拉公司 CEO 埃隆・马斯克在演讲中透露,特斯拉正在研发处于第一阶段的训练芯片,并基...
日期:09-17
炭黑产业网:打造炭黑产业互联网供应链平台!
炭黑产业网于2021年上线,是炭黑行业内率先成立的首个第三方“互联网+”电商平台,炭黑产业网是“互联网+”行动计划重点扶持企业,该...
日期:09-16
消息称吉利将启动沃尔沃上市计划:估值200亿美元
沃尔沃上市再传新消息!
  9月16日,据媒体报道,吉利正在与银行就其沃尔沃汽车部门在未来几周内上市进行深入讨论,预计将成为今年欧洲最大的首次...
日期:09-16
现代汽车集团与 LG 合资印尼电池工厂已开建,投资 11 亿美元
对致力于发展电动汽车的汽车厂商来说,稳定可靠的电池供应至关重要,决定着电动汽车的产量,汽车厂商也在寻找可靠的电池供应商,签订长期的供应协议。
日期:09-15
芯片短缺,8 月份韩国汽车出口仍增长 4%
9 月 15 日消息,据国外媒体报道,受芯片短缺等因素影响,今年 7 月份韩国汽车出口量有下滑,同比下滑近 3%。
日期:09-15
要想拍摄 4K ProRes 视频,需要购买至少 256GB 存储的苹果 iPhone 13 Pro
9 月 15 日消息 全新的 iPhone 13 Pro 系列支持 4K ProRes 视频录制,但如果你想以最高质量拍摄视频,有一个限制:你需要购买至少有 256GB 存储空间的 iP...
日期:09-15
华米黄汪:下月发布旗下最高屏占比新品,苹果 Apple Watch 7 没血压功能略感意外
9 月 15 日消息 苹果在今日凌晨的 2021 秋季新品发布会上正式发布了 Apple Watch Series 7 智能手表,拥有更高的屏占比,比上代增大了 20%,屏幕边框比上...
日期:09-15
比亚迪工程师真实工资曝光:211硕士起薪6800元 4年涨4900
作为当前国内新能源汽车的领军品牌,比亚迪集团内部的工程师,工资有多高呢?答案可能会出乎你的意料。
日期:09-14
博世回应车用芯片价格暴涨 300 倍:短缺确实存在,尽全力保供
9 月 14 日消息 此前有消息称,受马来西亚疫情影响,博世 ESP 芯片单价被炒至约 4000 元,而正常供货情况下原价仅 13 元,涨幅高达 300 倍。
日期:09-14
Mac 和 iPad 还得等等,苹果下半年的发布会可能不止一场
北京时间 9 月 13 日消息,北京时间周三凌晨 1 点,苹果公司将举行特别活动,主角是 iPhone 13。别着急,这或许只是第一场。
日期:09-13
小米汽车工厂选址地即将水落石出,消息称采用北京、武汉“双工厂”模式
9 月 13 日消息 据财联社报道,近日从多位消息人士处了解到,小米汽车或将采用“双工厂”模式,即,在通过收购方式以获得产能和生产资质,以便...
日期:09-13
产能稳了!苹果iPhone 13将至:富士康已招工超10万人生产
一年一度的“苹果春晚”即将拉开帷幕,作为科技界最重磅、最受期待的苹果秋季新品发布会,每年都能成为众多数码爱好者和媒体关注的焦点。
日期:09-13
消息称苹果 M1X MacBook Pro”将在“几周”后到货
9 月 12 日消息 苹果公司将会于 9 月 15 日凌晨举行发布会,预计将会推出 iPhone 13 系列等产品。
日期:09-13
中国6G专利申请全球第一 专家警告:一定要避免臆想、武断
国内在5G专利上位列全球第一,现在也在5G建设上领先全球,5G基站已经建成99.3万座,占全球2/3以上。日前华为更一步表态6G网络将在2030年建成。
日期:09-13