(!feof(fp))
我有一个梦想:面向对象和功能的开发人员携手走向未来。 每个人都喜欢并使用这两种范式。
![](https://i-blog.csdnimg.cn/blog_migrate/a899efd4c235f70d3e2108bbda6d14ab.png)
人类沉迷于二元选择 。
尽管世界变得比以往任何时候都更加复杂,而且我们面临的挑战绝非二元化,但这是我们在21世纪与我们一起遭受的灾难之一。
在现实世界和互联网上,已经进行了许多战斗,有些仍在进行。 我相信您已经听过其中一些:
- iOS与Android
- PC与Mac
- Internet Explorer与Netscape Navigator
- SQL与NoSQL
- Playstation与XBOX
- 可乐与百事可乐
- 卑鄙的夏威夷披萨爱好者与世界上其他明智而健康的人群
但是还有另一场战斗。 作为我们的软件开发人员,这场斗争比其他人更接近我们。
我说的是面向对象的编程与函数式编程之间的无休止的战争。
每个人都想通过消灭对手最终解决的问题是:哪个更好? OOP还是FP?
每天都有成群的面向对象的动手开发人员与功能性编程的纯粹主义者大战,这场永无休止的争夺谁拥有最好的范例。
“ 我们使用PHP构建了Facebook! 维基百科! WordPress的! 我们拥有99%的网络! ” —尖叫着。
“ 我们的软件不会因设计而失败! 您拒绝FP是因为您无法理解它! Endofunctors是新的黑人! ”-吼了一声。
然后有我。 在战场中央。 试图用很少的兄弟姐妹们武装起来制止所有这些胡说八道。
我的目标是使两军都了解,存在面向对象的技术可以最好地解决问题,而功能性的则可以解决其他问题。 在大多数情况下,两者是混合的。
通过功能构造和其他以面向对象的方式有效传达的模式可以最好地表达模式。
除了战争隐喻之外,这种情况还存在一些实际问题 。 它们直接影响您作为软件开发人员的工作。
因为站在一边往下看,却错失了很多机会 ,却忽视了一个基本的真理 。
“我错过了哪些机会?”
您会错过编写更好,更强大和更具表现力的软件的机会。
您错过了发展专业社区的机会。
您会错失结合两个世界的知识来利用巨大灵活性的机会。
您会错过机会,使观点相互授粉并创建新的开发模式。
您错过了成为顶级软件开发人员 *的机会。
*离题:自从我使用Top而不是Senior以来,后者已经失去了任何意义。 拥有3-5年工作经验的开发人员默认情况下会成为“长者”,无论他们是否可以向低年级教授,具有必要的纪律或负责任的行为。
我也考虑过MacGyver软件开发人员,但可能太多了。
“我忽略了哪个基本真理?”
您忽略了编程语言的发展,因此对分类的任何尝试都是模糊且不切实际的。
只要考虑一下您最喜欢的OO语言中已经使用的功能,也许甚至都不会注意到它:
- 匿名函数
- 模式匹配
- 不变性
- 高阶函数
- 懒惰评估
- 单音
- 纯函数
完整列表更长。
有很多出色的语言,例如Scala , Clojure和Swift ,可以显式地实现这两种范例的功能。
其他诸如Java之类的工具正在Swift收敛到同一点 。 不相信我,相信文档。
例如,Java 8引入了Optional类。 它是一个容器, 可以容纳某种类型的值,或者什么都不容纳。 换句话说,这是Monad的特例,在Haskell中称为Maybe Monad 。
您现在可以停止在Java中使用null 。
您现在可以告别NullPointerException了 。
这要归功于功能编程功能实现了面向对象的语言。
毕竟,使语言具有功能性所需要的就是对功能作为值类型的支持。 而已。
在战trench的另一边,有人用Haskell表达面向对象的概念。
类和方法已在F#中实现。
OCaml还支持面向对象的编程(O代表Objective)。
融合已经无处不在。
编程语言已经发展到足够多的程度,以至于任何分类尝试都是模糊且不切实际的。
“好的,我进来了。我如何开始学习另一面?”
我来自OOP背景,因此我可以分享自己的经验。
创建出色的软件时,许多OOP功能和模式都非常有用:组合,消息传递,封装,SOLID,多态。 相同的对象概念非常接近我们的现实世界心理模型,因此很容易掌握。
为了更接近函数式编程,我要做的是寻找 OOP 中痛苦或脆弱的事物 。 我不完全满意的事情。
我已经提到了空的 “值”。
虽然编码PHP,而不是如果 FING上的返回值,比方说,一个仓库,或者在没有发现什么情况下抛出一个异常,我返回一个也许并绑定到它。
是的,也许 在PHP中。 谷歌一下。
与我的服务类相同。 作为模块的封装端点(有人称它们为“聚合根”),我不希望它们引发任何内部异常。
我从他们那里想要的是一个返回值,该值可以是Success ,可以选择包含命令结果,也可以是Error 。
与Either Monad非常相似。
另一个示例: Value Objects 。
值对象是不可变的。
这意味着创建后无法更改其内部值。 不允许二传手 。
不变性是从功能编程中借用的另一个概念。
将一个或多个参数注入构造函数后,就没有回头路了。 您的VO将保持不变,直到被垃圾收集器处置为止。
不变性带来两个巨大的优势:
- 无忧分享
您可以通过引用共享任何Value Object,因为它是不可变的,不会在代码的另一部分中进行修改。
这大大降低了避免引入任何错误所需的意外复杂性和认知负担。 - 改进的语义
将不变性与另一条规则结合: 默认情况下,请勿将任何吸气剂添加到Value Object中 。
您的初始类定义应仅具有构造函数和一堆私有属性。
这使您可以在以后考虑数据的转换。 这意味着当您了解Value Object的确切用例时,就可以决定方法的语义。
这样做可以避免无意义的接口,并为Value Object定义有意义的名称和行为,从而改善模型。
这些只是我如何结合这两种范例以实现更健壮和更具表现力的代码的三个示例。
我确信在功能编程语言中还有很多其他示例可以有效地使用面向对象的功能。 随时在评论中添加一些。
编写代码,而不是战争。
我希望您现在了解了为什么这种方法毫无意义。
我希望您能加入“爱编码大篷车”,并以学习者的热情开始使用这两种范例。
我希望您能与其他开发人员分享您的热情,以便他们也能加入进来。
对于每个人来说,这将是一个更好的编程世界。
(!feof(fp))