热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(!feof(fp))_糟糕,我又要FP了!

(!feof(fp))我有一个梦想:面向对象和功能的开发人员携手走向未来。每个人都喜欢并使用这两种范式。有人在论坛上开始讨论FP为什么比OOP好得多的话题。人类沉迷于

(!feof(fp))

我有一个梦想:面向对象和功能的开发人员携手走向未来。 每个人都喜欢并使用这两种范式。

有人在论坛上开始讨论FP为什么比OOP好得多的话题。

人类沉迷于二元选择

尽管世界变得比以往任何时候都更加复杂,而且我们面临的挑战绝非二元化,但这是我们在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 , ClojureSwift ,可以显式地实现这两种范例的功能。

其他诸如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将保持不变,直到被垃圾收集器处置为止。

不变性带来两个巨大的优势:

  1. 无忧分享
    您可以通过引用共享任何Value Object,因为它是不可变的,不会在代码的另一部分中进行修改。
    这大大降低了避免引入任何错误所需的意外复杂性和认知负担。
  2. 改进的语义
    将不变性与另一条规则结合: 默认情况下,请勿将任何吸气剂添加到Value Object中
    您的初始类定义应仅具有构造函数和一堆私有属性。
    这使您可以在以后考虑数据的转换。 这意味着当您了解Value Object的确切用例时,就可以决定方法的语义。
    这样做可以避免无意义的接口,并为Value Object定义有意义的名称和行为,从而改善模型。

这些只是我如何结合这两种范例以实现更健壮和更具表现力的代码的三个示例。

我确信在功能编程语言中还有很多其他示例可以有效地使用面向对象的功能。 随时在评论中添加一些。

编写代码,而不是战争。

我希望您现在了解了为什么这种方法毫无意义。

我希望您能加入“爱编码大篷车”,并以学习者的热情开始使用这两种范例。

我希望您能与其他开发人员分享您的热情,以便他们也能加入进来。

对于每个人来说,这将是一个更好的编程世界。

翻译自: https://hackernoon.com/oops-i-fpd-again-14a3aecbbb98

(!feof(fp))



推荐阅读
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 标题: ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 《树莓派开发实战(第2版)》——2.2 创建模型和运行推理:重回Hello World
    本节书摘来异步社区《概率编程实战》一书中的第2章,第2.2节,作者:【美】AviPfeffer(艾维费弗)&# ... [详细]
  • PreparedStatement防止SQL注入
    添加数据:packagecom.hyc.study03;importcom.hyc.study02.utils.JDBCUtils;importjava.sql ... [详细]
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
  • http头_http头部注入
    1、http头部注入分析1、原理 ... [详细]
author-avatar
huanghxn
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有