不要那么做,编写更好的功能

本文通过一个实际案例,探讨了在软件开发中编写高质量函数的重要性。文章提出了四个关键原则:函数应小巧、清洁、简单且专注于单一职责。这些原则不仅提高了代码的可读性和可维护性,还促进了更高效的团队协作和软件开发过程。

一天早晨,当我在办公室厨房里加热早餐时,我的一位同事走进来,我们开始进行一些闲聊。 我要打电话给这个同事弗雷迪。 弗雷迪(Freddie)在公司工作了几周,所以自然而然地,我问他情况如何。 从那以后,他继续说的话一直困扰着我。 他叹了口气,谈到自己在理解自己正在从事的特定项目上继承的代码库时遇到了麻烦。

然后,弗雷迪(Freddie)花了很多时间告诉我,由于盯着一个毫无意义的函数的庞然大物而变得烦躁和疲倦。 我问他是否尝试过与在他之前从事该软件工作的队友进行核对,他对此轻笑着回答,然后说:“(队友的名字)也不知道。 他像我一样专心地盯着它,只是说他没有写。

与房地美交谈后,我对自己说了两件事。 第一个是,“不要那么做!”。 也就是说,不要像使弗雷迪受苦的人那样。 第二个是“编写更好的功能”。 那是不像那个家伙的唯一方法。 我敢肯定,有无数的房地美必须继承,理解和重构软件项目中编写错误的功能。 精心设计的软件会关注小型单位(或方法),例如微观层面的功能,而不仅仅是宏观层面的整体功能。

我在很短的编码时间内编写了很多错误的函数,因此我开始认真考虑在此特定领域进行改进。 以下是一些我已经(并且仍在学习)的指南和方法,可以从经验丰富的专业人员,同事和其他推荐的来源中应用。

了解功能

定义事物始终是一个不错的起点。 功能是编程的程序。 如果您正在寻找比这更冗长的内容,则必须去Google。 软件系统将在不同程度上包含功能。 可能是您正在开发面向对象设计的软件,其中的功能将存在于组成系统的类中,并且这些功能将根据它们所处的类的状态起作用。 或者您的系统是面向功能的设计,其中系统被分解为一组作用在集中状态的交互功能。 无论采用哪种方法,功能都是存在的,因为我们需要分解解决方案的概念,而在这种分解的非常低的水平上,我们会发现这些用于特定目的的小单元。

函数应该很小

缩小体积可使函数更易于阅读,理解,测试和调试。 我不会给你一个神奇的数字。 一些专家会说不超过15条线,另一些专家会说不超过25条线。这可能是您必须在团队中决定的事情。 重要的是要记住保持功能小的原则的原因。

可读性 :一个函数通常将具有一个签名和一个块代码,该代码在调用或调用该函数时执行。 该函数块中的代码行较少,有助于轻松阅读并了解该函数的意图。

可理解性 :较小的功能有助于减少偏离功能主要目的的可能性。 函数的概念或目的越线性,它就会越容易理解。

可测试性 :简短的方法变化少,这意味着它们更易于测试

这是一个旨在检查承载令牌有效性的函数示例:

功能应该干净

它可能不会比这更模棱两可了。 但是,这与代码样式,缩进或变量名长度无关。 这是关于可理解性。 弗雷迪(Freddie)是否能够查看您的功能,弄清它的意图并能够在不花大量时间的情况下进行修改?

归结为代码的可维护性,可维护代码构成了可维护软件的主要骨干。 我知道还有其他一些属性可以用来定义主观的干净代码,这是您和您的团队可以决定的。

功能应该简单

我的技术负责人经常对我说:“如果(功能)需要很多努力,您就停下来并重新思考您的解决方案”。 在我们的领域中,努力不应该总是被称赞,因为努力常常会产生复杂的事情。

“在软件开发中,工作量并不会随着复杂度线性增长,而是呈指数增长。 因此,管理两组四个方案比一组一组管理六个方案要容易得多。” — 亚伯拉罕·马林·佩雷斯

如果我们可以基于模块化解决方案编写函数,并减少该函数具有的执行路径,那么弄清它们应该做的事情会容易得多。 如果不简单地编写代码,则很难理解,而这些误解通常会导致错误。

这是一个检查接收到的参数是否为字符串数组的函数示例:

函数应该有一份工作(没有副作用)

罗伯特·马丁(Robert Martin)在“干净代码”中说得最好,“您的功能有望做一件事……”,因此应该这样做。 产生副作用只会使我们的代码可读性差,因为代码块中的变体不能满足特定的目的。 我们的函数应该基于确定性算法 ,给定一定的输入,它总是返回相同的输出。

以下面的示例为例,该函数用于接收特定日期并以带有日期对象的数组的形式返回该日期发生的星期。

可以说该功能通常具有单一目的。 但是,您可能已经注意到,在某个时候,我们基于两个参数生成一个星期,一个对象(在这种情况下为Moment对象)和一周中的某天(即星期日,星期一,星期二等)。 因此,我们实际上可以从此函数创建一个新函数来简化事物,并使我们的方法的目的更加线性。

当我们将函数拆分为两个时,我们具有以下内容:

结果,现在随机程序员可以更轻松地掌握我们函数的意图,为其编写测试用例并在必要时进行修改。

话虽如此…

这些准则不是唯一要遵循的准则,但是在我们编写函数时,它们无疑为帮助我们产生高质量代码奠定了足够好的基础。 此外,编写良好的功能将需要练习,故意进行重构以及另一套方法(同行评审)。 产生这种代码似乎是额外的工作,但这样做的回报很好。 编程教父Edsger Dijkstra说:

“在编程中,优雅并不是必不可少的奢侈品,而是决定成功与失败之间的一种品质。”

不要成为那个家伙,编写更好的功能。

参考文献:

罗伯特·马丁的干净代码

现实世界中可维护的软件

From: https://hackernoon.com/dont-be-that-guy-write-better-functions-f5423aa01c1f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值