面向对象和面向函数之争

大卫说:“服务的调用最终是通过函数实现的”。“但函数要绑定数据以确定并行的粒度”:皮特争辩道。早上大卫和皮特在花园里争论着,我们所开发的软件的结构究竟是面向对象还是面向函数?这个问题猛然听来好像非常矛盾。软件的结构似乎只能在面向对象和面向函数之间进行选择。但其实不然,面向对象和面向函数不过是我们在开发过程中的一种思考方式。当你从用户的角度来看开发的过程,就是面向对象的。因为用户最终操作的是一个很小的数据集合。这个集合可以抽象的叫做对象。当你换个角度从服务器这边去看时。服务器的数据被各种用户函数所操作。所有函数所拥有的数据的子集的合,构成了服务器的全部数据。并且每个函数的范围都不固定。可能操作很小的数据,也可能操作很大的数据。小到用户状态的更改。大到对几年的数据进行统计分析。哪么从服务器的角度来看就叫面向函数的编程。

面向对象的编程和面向函数的编程有着同样悠久的历史。但早期编程大都是面向函数的。因为早期的计算机都是用来做数据分析使用。是一种分析数据并获得结果的过程。同样的数据集会被不同的函数所使用。在这个时期里面向函数也被称为面向过程。每个函数有着标准的输入,输出和处理。输入和输出的数据并不相同,写在不同的纸带上。所以不用担心数据更改导致的状态错误。后来因为内存和硬盘的出现。函数输入和输出的目标统一变成了内存和硬盘。不但要考虑函数执行的过程是否会出现错误。还要考虑输入和输出的结果是否会导致迭代的错误。所谓迭代的错误是指函数重复执行是否会导致内存或硬盘的数据出错。所以在这个时期被叫做面向函数编程

面向对象编程虽然很早就被创造出来。但因为早期的计算机都是大型机,被用于大型数据处理。为普通用户开发的软件非常稀少。也就更谈不上用户操作。直到微型计算机的面市这种情况才得到了改观。随着微型计算的普及,大量面向普通用户的应用开始出现。这些应用的特点是用户的每个操作的数据范围都较小。数据之间的交集也不多。面向对象的语言非常适合用来开发这些应用。随着面向普通用户的软件大量诞生。面向对象的语言也开始普及。其中最为出名的就是C++。做为C语言的改良版本,即有C语言性能优势,又有着面向对象的语法特征。但C和C++都有着明显的缺陷就是指针。不可否认指针在性能上有着不能比拟的优势。但容易导致崩溃和难以理解都是指针的劣势。Pascal以及后来的java等语言填补了C++的空缺。随着90年代互联网的普及,用户开始通过网页操控服务器上的数据。应用在服务器上的面向对象语言java,取代了面向函数的C成为应用最广泛的语言。

面向对象的语言因为贴近用户习惯被应用于用户直接操控的场景。面向函数的语言因为灵活的数据使用方式被应用于操控数据的场景。他们都是开发语言的一种,被限定在某个范围,以实现更专注的功能。有优势就必然会有劣势。面向对象的优点就是数据集被划分为多个小块。添加新的功能较为容易。对已经存在的部分影响较少。也适合大规模的多人协同开发。它缺点也非常的明显,因为数据被分割成多个小块。跨数据集合的功能开发非常困难。当多个子集有多种交叉关系时处理更加困难。也就是我们所说的跨对象的关系。这种关系在关系型数据库中却非常的常见。例如用户之间的社交或交易。所以通常会把这种关系的处理交给关系型数据库或服务器来完成。

相对于面向对象,面向函数也有着它的优势。面向函数的方式适合多变的数据关系。在开发新功能时,对使用数据的限制较少。可以在各种纬度和时间尺度下使用数据。但它的灵活性也带来了它的劣势。就是添加新功能时可能会对现有的功能带来伤害。因为没有面向对象哪样严格的保护。这种伤害不会被人轻易发现。为了避免出现难以察觉的伤害。面向函数的开发需要非常小心谨慎。这使得添加和修改功能变得困难。也很难通过协同开发来提高效率。适合对速度要求较高且小巧的软件。

面向对象和面向函数可以简单理解为对函数使用数据的限制。除了这两种方式外还有一种,就是通过key-value的形式使用数据。key-value数据库是最近几年开始流行的存储方式。他的优点是使用数据非常便捷。可以做为面向对象的补充。这种key-value是不是就完美了呢?显然不会。例如图中”class”在key-value数据库中会以”peter_class:A”的形式存放。其中”peter_class”为key,”A”为value 。哪么就需要为上述20个value数据额外付出20个key的存储空间。并且key-value数据库的所有数据都散乱的放在一个序列里。导致了索引的混乱。

在讨论了面向函数,面向对象以及key-value数据库这三种方式后。还存在一种方式,之前没有被使用就是“attribute”的方式。在“pelagia”中使用的就是“attribute”的方式。这种方式兼顾了“key-value”的灵活,又没有命名方式的混乱。同样上图的”class”在“pelagia”中被创建为名称叫”class”的表。在表中可以创建key为peter,value为A的数据。例如在“set(‘class’, ‘peter’, ‘A’)”。“attribute”的方式也兼顾了面向对象隔离数据需求。又在一定程度满足了面向函数的需求。但在存储上和key-value一样要浪费部分的存储空间用于key。

只所以“pelagia”选择“attribute”的存储方式,另一个非常重要的原因就是。在“pelagia”中需要存储的数据都是串行计算需要的。

根据阿姆达定理S=1/(1-a+a/n)

在n>1时提高a以提高加速比,其中a为并行计算所占的比例。提高并行计算的比例,就要降低串行计算的比例。降低串行运算的方式就是将数据尽可能小的分割。面向函数将所有数据看作是一个整体。一个整体自然是无法分割的。面向对象虽然将数据划分为小块使得数据足够的分散。但对象数量是无穷的,无穷大的数据相当于没有分割。同样的道理key-value也是无穷大的,无法作为数据分割的支撑。只有“attribute”的方式能够对数据进行适当的分割,在软件运行阶段也不会剧烈的改变分割的效果。

这篇文章介绍了面向过程,面向函数,面向对象,key-value和“attribute”。他们都描述的是函数和数据之间的关系。“pelagia”在这些关系中又加入了并行计算的纬度。因为并行计算的原因选择了“attribute”的方式。所以“pelagia”既不是面向函数也不是面向对象。而是面向“attribute”。

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: 面向对象和面向函数之争

FavoriteLoading添加本文到我的收藏
  • 1,441 人阅读
  • JAVA
  • 并发译文
  • 面向对象和面向函数之争已关闭评论
评论关闭

return top