告别自相残杀!面向对象和函数式编程并存

 2024-03-05 01:07:58  阅读 0

出品| CSDN(ID:)

简而言之,函数式编程(“FP”)和面向对象编程(“OOP”)具有相似的表达和封装能力,因为它们将程序封装成可以自由组合的更小的部分。

但这两个“学派”之间仍然存在许多差异。 最大的区别在于对数据之间的关系和数据操作的不同处理。

FP 和 OOP 的区别

面向对象编程的核心思想是将数据和数据操作紧密耦合:对象除了拥有自己的数据之外,还拥有数据操作的实现。 这些对象向外界隐藏了这些特定信息。 它们通过接口、响应方法或消息与其他对象交互。 因此,在面向对象编程中,抽象的核心是数据,通过接口等API对外展示。

在面向对象编程中,人们所做的主要工作是创建新对象或通过添加新方法来扩展现有对象。

函数式编程的核心原则是数据仅与功能松散耦合。 您可以对同一数据结构定义不同的操作。 这里,抽象的核心是函数,而不是数据结构。 函数隐藏了它们的具体实现、编程语言的抽象以及函数相互组合或表达的方式,例如泛型函数或复合函数。

在函数式编程中,人们的主要工作是编写新函数。

在自然界中,如果熊和鳄鱼之间爆发冲突,地形可以决定战斗的结果。

对于函数式编程和面向对象编程,什么情况下哪个更适合另一个呢? 因为这是一篇实用的博客,所以我会忽略所有理论上的考虑,例如机械推理代码的能力以及实现项目时的限制,例如缺乏资源、缺乏时间等。

在现实世界中,您认为这两者中的任何一个会成为压倒性的“赢家”吗? 您可能需要花一些时间思考这个问题。 当你思考的时候,我会享受一杯浓咖啡......

面向对象编程的五大原则_面向对象编程的原则是什么_面向对象编程的基本原则

什么时候使用FP? 什么时候使用面向对象编程?

答案当然是,业务编程主要受功能模型控制,而不是面向对象模型。 这个答案让你感到惊讶吗? 如果您只考虑 Java、C++、C# 和 Ruby,这个答案对您来说可能会很奇怪。

要知道,一切面向对象通常都是模拟访问各种支持SQL的数据库。 SQL是一种非常实用的数据库操作脚本语言。 您可以设置数据库,以便通过 PL/SQL 存储过程完成对其所有表的访问,但由于这会导致严重的编程问题,因此在实践中很少这样做。

关系数据库的主要好处是它是面向未来的。 如果您需要新报告,您可以随时创建它们。 许多不同的应用程序可以与同一个数据库进行通信。 这些程序之间的数据一致性可以通过数据库约束来强制执行。

如果你仔细研究的话,你会发现数据库本身其实就是一个大的数据结构,应用程序对数据库中的数据进行操作。 几乎每个业务应用的核心都是一个大型的功能数据库,它是一个数据结构以及对数据的一系列操作。

面向对象编程的使用场景

但是我们在应用程序中包含对象只是为了顺应趋势吗? 或者我们在编写应用程序时所做的事情和我们在创建数据库时所做的事情之间有什么根本区别吗?

这个问题的答案在于面向对象和使用数据库的优点。

设计良好的面向对象架构可以轻松改变对象的组合方式。 隐藏实现和解耦使您可以轻松更改对象之间的关系。 使用面向对象本身并不会使添加新操作变得更容易。 如果您在代码中发现双重调度和访问问题,您就能真正感受到这一点。

但是,如果你有一个订单处理系统,如果你的业务规则发生变化,需要相应修改订单处理流程,你就会发现面向对象的优势。 不受这些更改影响的对象和受影响的对象是相互隔离的。

另一方面,设计良好的数据库可以轻松添加新的查询和操作。 如果您需要以新的方式查看现有数据或者需要向数据添加新的更新类型,它可以很好地处理。 客户端应用程序在逻辑上与索引等问题隔离,以提高性能。

这样做并不会让改变关系变得更容易。 如果改变管理结构,使报表和管理者的关系从一对一变成多对多的矩阵管理结构,这种改变会破坏很多应用。

因此,如果我们记录了业务软件中需要实现的所有内容,那么我们需要在数据库中保存那些代表长期的、相对不变的关系的东西,以及那些代表随着时间的推移而发展的短期操作的东西。 并更改内容,在应用程序中实施。

应用程序的堆栈通常比数据库的堆栈高四倍,这是正常的。 事情确实会发生变化,企业应该不断学习、成长和发展。

FP应用场景

那么,我们如何进行通常所说的函数式编程,即用多范式语言以函数式术语编写的代码呢? 我们能否简单地将面向对象的程序重写为相对静态数据结构上的操作集合?

一般来说,这是可以的。 但与此同时,必须优先考虑关系的相对寿命。 那些本身不太可能改变、但被频繁改变的实体所操纵的事物应该以函数式编程风格来实现,而相对频繁变化的事物则可以以面向对象的风格来实现。

如果每个经理都有一个或多个报表,并且每个报表只有一个经理,那么通过 API 隐藏这种关系几乎没有什么好处,因为在 API 中,经理对象是隐式委托操作的方式。 对于这种关系,最好的处理方式是先对数据进行结构化,然后对数据进行操作。

但是有关运输成本的规则可能会发生变化,因此最好将其封装起来,以便程序的其他部分不会受到未来可能发生的变化的影响。

因为好的软件可以满足不止一种需求,所以它们通常包含两种风格。

原来的:

关于作者: ,其兴趣包括构造超现实数字、破坏空值以及庆祝编程的乐趣。 他是《é》、《and》的作者。 他正在开发用户体验。

本文为CSDN翻译。 如需转载,请注明出处。

热门文章推荐

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

面向对象编程的基本原则_面向对象编程的五大原则_面向对象编程的原则是什么

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码