评论:重构到集合
发布时间:作者: Diaa Fares
“永远不要再写循环。”Adam Wathan 用这句话强烈宣传他的 **重构到集合** 一书,但这本书真的能做到吗?我们一起探索一下这个承诺与现实之间的差距。
如果您是一位 Laravel 开发者,您可能已经听说过集合管道。虽然我在我的项目中偶尔会使用它,但我并没有意识到这种方法的可能性,直到我阅读了重构到集合。它让我对利用函数式编程的力量和能力有了新的认识。
命令式编程与声明式编程
在本书的开头,Wathan 讨论了命令式编程和声明式编程的区别,以及为什么他更喜欢声明式编程。Adam 建议,与其用命令式方式(使用中间变量、循环、条件语句,并关注实现细节)编写代码,不如尝试一下相反的风格,它专注于告诉计算机我们需要它完成什么,而不是关注实现细节。
请看下面的例子
// Imperative Programmingfunction getUserEmails($users){ $emails = []; foreach ($users as $user) { $emails[] = $user->email; } return $emails;}
// Declarative Programmingfunction getUserEmails($users){ return $users->map(function ($user) { return $user->email; });}
您会注意到,在声明式编程方式中,我们不需要使用循环或中间变量?当然,这是一个非常简单的例子,只是为了向您展示基本概念;本书涵盖了更复杂、更有用的例子。
旅程
重构到集合概述了高阶函数及其用途。它还涵盖了一些基本的高阶函数,如 Each、Map、Filter、Reduce 等及其实现。Wathan 也很好地解释了何时使用一个高阶函数而不是另一个。他提供了一些很好的指标,帮助您选择最适合您需求的高阶函数。
接下来,本书讨论了“内向外”代码的问题,以及阅读它的困难,并向您介绍了解决方案:**集合管道**,它从左到右读取。
在本书我最喜欢的部分之一中,Wathan 实现了简单的 Collection 类,并使其能够用集合代替数组,使其可计数。
本书的最后一部分是许多实际案例的演练。Wathan 在选择您在应用程序中可能遇到的现实世界问题方面做得非常出色,并展示了如何使用命令式编程来解决这些问题,然后将解决方案重构为声明式编程,向您展示声明式编程将如何使您的代码更简单、更易于阅读。
此外,所有示例都以屏幕录像的形式提供,因此您可以看到 Wathan 一步一步地重构和解决示例问题,这是我的偏好。
坦白地说,当我浏览本书的示例时,我惊讶于 Wathan 发明用来解决这些问题的过程,我相信您也会对示例的高级性质和复杂性感到惊讶。
有很多东西要学
这本书的好处在于,您将学到很多东西,不仅仅是关于集合。就我个人而言,我学到了一些很棒的重构技巧,甚至还有一些 PHP 技巧,比如使用 forEach 迭代对象公有属性。
即使你不是 PHP 开发者,你也可以从这本书中学到东西,因为它的概念可以很容易地应用到其他语言中。
与任何编程技能一样,您必须练习这些新的方法和技巧,并将它们纳入日常工作流程,才能让它们变得更清晰、更容易掌握。幸运的是,本书附带了分为三个类别(初学者、中级和专业)的练习,可以用来练习您学到的知识。这些练习的解决方案也被包含在内,因此您可以将它们与您的解决方案进行比较,并从中获益。我的建议是不要在尝试自己解决练习之前就阅读解决方案,因为练习是学习新编程技能不可或缺的一部分。
努力
本书另一个很棒的方面是 Wathan 在各个方面所付出的努力,从易于理解的写作风格,到将问题分解成步骤,一个接一个地解决问题,直到最终解决。屏幕录像的质量,以及看到 Wathan 实时进行重构,会让您获得愉快的学习体验。
此外,在许多例子中,我赞赏 Wathan 在搜索其他语言的集合管道方法以达到最佳解决方案,并在 PHP 中实现这些方法(就像他在 chunkBy 和 sliceBefore 方法中做的那样)所付出的努力。
即使是本书的整体风格——字体和代码块的语法高亮配色方案——都是很棒的选择。
他还创建了自己的 Markdown 语法和处理层,用于在代码块中语法高亮显示行,并指出特定代码块以引起注意,并将其余行灰显。
这是本书中的一个例子,请注意语法高亮和灰显的行
再看看他用来显示代码块中发生变化的漂亮差异
我喜欢它!
希望
第一个希望是 PHP 接受 箭头函数 RFC,这将使使用集合管道风格变得更容易、更漂亮。请看这个例子
// Beforefunction getUserEmails($users){ return $users->map(function ($user) { return $user->email; });} // Afterfunction getUserEmails($users){ return $users->map(fn($user) => $user->email);}
另一个希望是重构到集合能够更新,以反映本书出版后 Laravel 框架引入的新变化。例如,本书讨论了如何实现名为 **pipe** 的集合管道方法,但该方法的拉取请求已在 Laravel 中合并,因此最好反映这一更新,并在书中提及它。
本书还可以更新,以反映 Laravel 5.4 版本中引入的 Collections 功能的新高阶消息传递;这将使本书的代码示例看起来更直观、更漂亮。
请看这个例子
// Before$employees->reject(function($employee) { return $employee->retired;})->each(function($employee){ $employee->sendPayment();}); // After using Higher Order Messaging for Collections$employees->reject->retired->each->sendPayment();
好多了!
此外,如果至少在本书的前两个套餐中降低价格,可能会鼓励更多开发者购买它。
重构到集合 有三个定价层级。**基本要素** 包含本书和练习,售价 39 美元。**高级培训** 包含屏幕录像,售价 79 美元。**完整参考** 包含名为 Nitpick CI 的示例 Laravel 应用程序的源代码,售价 179 美元。
就是这样;如果您想学习一种新的、更易于阅读、更具表现力的编程方法,请看看 重构到集合。