您现在的位置是:网站首页>技术百科技术百科
面向对象和面向函数之争
小大寒2024-01-01[技术百科]博学多闻
面向对象和面向函数之争本文讨论了面向对象、面向函数、面向过程、key-value和“attribute”五种编程方式,分析了它们的优缺点。通过引入并行计算的角度,阐述了“attribute”方式在数据分割和计算效率上的优势,特别适用于“pelagia”软件。
面向对象和面向函数之争
大卫说:“服务的调用最终是通过函数实现的。” “但函数要绑定数据以确定并行的粒度”:皮特争辩道。早上,大卫和皮特在花园里争论着我们所开发的软件的结构究竟是面向对象还是面向函数?这个问题猛然听来好像非常矛盾。软件的结构似乎只能在面向对象和面向函数之间进行选择,但其实不然,面向对象和面向函数不过是我们在开发过程中的一种思考方式。
当你从用户的角度来看开发的过程,就是面向对象的。因为用户最终操作的是一个很小的数据集合。这个集合可以抽象地叫做对象。当你换个角度从服务器这边去看时,服务器的数据被各种用户函数所操作。所有函数所拥有的数据的子集的合,构成了服务器的全部数据。并且每个函数的范围都不固定,可能操作很小的数据,也可能操作很大的数据。小到用户状态的更改,大到对几年的数据进行统计分析。那么从服务器的角度来看就叫面向函数的编程。
面向对象的编程和面向函数的编程有着同样悠久的历史。但早期编程大多数是面向函数的。因为早期的计算机主要用于数据分析,是一种分析数据并获得结果的过程。同样的数据集会被不同的函数所使用。在这个时期,面向函数也被称为面向过程。每个函数有着标准的输入、输出和处理。输入和输出的数据并不相同,写在不同的纸带上。所以不用担心数据更改导致的状态错误。
后来,随着内存和硬盘的出现,函数输入和输出的目标统一变成了内存和硬盘。不但要考虑函数执行的过程是否会出现错误,还要考虑输入和输出的结果是否会导致迭代的错误。所谓迭代的错误是指函数重复执行是否会导致内存或硬盘的数据出错。所以在这个时期被称为面向函数编程。
面向对象编程虽然很早就被创造出来,但因为早期的计算机都是大型机,被用于大型数据处理。为普通用户开发的软件非常稀少,也就更谈不上用户操作。直到微型计算机的面市,这种情况才得到了改观。随着微型计算的普及,大量面向普通用户的应用开始出现。这些应用的特点是用户的每个操作的数据范围都较小,数据之间的交集也不多。面向对象的语言非常适合用来开发这些应用。
随着面向普通用户的软件大量诞生,面向对象的语言也开始普及。其中最为出名的就是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数据库的所有数据都散乱地放在一个序列里,导致了索引的混乱。
Attribute方式
除了面向函数、面向对象和key-value数据库,仍然存在一种方式没有被广泛使用,就是“attribute”方式。在“pelagia”中使用的就是“attribute”方式。该方式兼顾了“key-value”的灵活性,又避免了命名混乱。在“pelagia”中,“class”被创建为名为“class”的表,并可以在表中创建key为peter,value为A的数据。例如,在“set(‘class’, ‘peter’, ‘A’)”中。
“attribute”方式兼顾了面向对象隔离数据的需求,又在一定程度上满足了面向函数的需求。但在存储上和key-value一样,需要浪费部分存储空间用于key。
Pelagia选择Attribute存储方式的原因
“pelagia”选择“attribute”的存储方式,另一个非常重要的原因就是在“pelagia”中需要存储的数据都是串行计算需要的。
根据阿姆达定理S=1/(1-a+a/n),在n>1时提高a以提高加速比,其中a为并行计算所占的比例。提高并行计算的比例,就要降低串行计算的比例。降低串行运算的方式就是将数据尽可能小地分割。面向函数将所有数据看作一个整体,而面向对象将数据划分为小块,但对象数量是无穷的,相当于没有分割。同样的道理,key-value也无法作为数据分割的支撑。只有“attribute”的方式能够适当分割数据,在软件运行阶段也不会剧烈地改变分割的效果。
这篇文章介绍了面向过程、面向函数、面向对象、key-value和“attribute”方式。它们都描述了函数和数据之间的关系。“pelagia”在这些关系中加入了并行计算的维度。由于并行计算的原因,选择了“attribute”的方式。因此,“pelagia”既不是面向函数也不是面向对象,而是面向“attribute”。
阅读完毕,很棒哦!