捍卫巴解组织。 对手的7个站不住脚的论点

可以这么说,当我走到互联网上时,我注意到了一个有趣的功能。 人们在其他方面讨论的所有编程范例都相当冷静。 例如,如果他们谈论过程编程,那么他们绝对会冷静地谈论它。 关于模块化编程也是如此。 声明式编程-无暴风雨,骚乱或holivarov。 函数式编程是相同的。

而且只有在OOP周围才能使风暴平静下来。 有些人高兴地尖叫着他,另一些人则反驳光的基础。 老实说,我完全无法理解为什么整个世界都在OOP中融合在一起。

您可能只是认为我比OOP的拥护者更多。 绝对不是这样(但是,您可以从标题中理解它)。 不行 我是银弹,炒作,某种方法论或人物的登台以及各种圆舞的反对者。 请勿在扳手或割草机周围打转。 我希望不要写出版物,为什么钻头或锤子很烂。
但是今天,整个Internet上充斥着关于OOP的浮夸,情绪激动,激进的文章-如果有人说OOP是“小肠”,并且通常对所有肠子来说,那么另一种广播肯定是OOP需要紧急扔进垃圾桶(如果仅他不同意第一个观点。 没有第三名。

我只想引入第三个要素。 坦率地说,OOP并非不是所有疾病的灵丹妙药,而且像PP,AF或PL一样都有生存的权利。

因此,在为OOP辩护时要保持冷静。 在这篇文章中,我将尝试考虑反对巴解组织的主要论点,并为他们的失败辩护。

1. OOP中存在的一切早已属于其他范式


除标记语言(例如HTML,XML,CSS等)外,几乎所有编程语言都是图灵完整的。 用一种农民语言讲,图灵是一种完整的语言,您可以在其中编写任何可能的程序。 由此得出一个相当笼统的论点:在任何选择的随机语言中,所有其他语言中都存在。 关于范式也可以这样说。 语言(和范例)上的所有差异都是执行某些命令的不同方式,不包括单个词法功能。

顺便说一句,可以将相同的命题(N,M,K,R中的所有内容等)表述为:锤子已经由铁和木头组成,为什么我们还需要钳子? 但没人会这么说。

2. OOP将数据和操作混合在一起。 不好


争论从手指中抽了出来。 首先,OOP在哪里混合数据和功能? 其次,这是不好的说法也是从灯笼上摘下来的,是从桶里拿出来的,“一个真正的男人不会那样做”,以及为什么-因为唐。蒲。 OOP以某种方式模拟了对象固有数据的真实世界-没有人会说椅子缺少颜色并且没有四只脚。 而且这里没有数据和操作的混合,对象不是函数或运算符。 这是一个抽象。

3.继承控制程序,使更改困难


在这里您可以放慢一点。 继承丝毫不意味着要建造一公里长的树木以减慢发展速度。 发明了继承是为了将公共属性和方法区分为超类,并且必须使用表示相同类型对象的类来实现。 例如,创建两个类(其中一个是另一个类的继承者)将是错误的,因为仅由于没有任何共同点 ,就没有将公共代码分配给超类。

如果不打算将父类扩展到第三类,则这种继承就毫无意义。 如果您要创建一家酒品店,那么Beer,Vodka和Vine类可以从Alcohol类继承而来,但是您根本不需要创建Drinks类,除非您想出售巴拉圭茶。

同样,创建类彼此不相关的层次结构也是错误的。 好吧,为什么告诉我,建造一个塔,其中Fly和Cutlet类是从超类Cheese继承而来,而后者又是从超类Friday继承的? 但这不再是OOP的缺陷,而是构成它的人的歪曲之手。

4.封装没有意义


在这里我部分同意。 从程序的角度来看,封装实际上不会影响任何东西。 如果我使用private关闭变量-这样,我仍然可以通过简单地删除private来打开它,然后在其中更改我喜欢的所有内容。

但这仅在技术上是正确的。 OOP的哲学是将正确组织和封装的类视为黑盒子。 想象一下一个盒子,在盒子的一侧有各种按钮,用于提供数据的插槽,在另一侧有一个返回信息的输出插槽。 以一个堆栈为例。 想象一下,一个盒子的一侧有一个用于插入数据的插槽,旁边是一个按钮。 背面是弹出按钮。 您提交带有数字8的便笺,然后按按钮。 然后再拿一张纸,然后再按一次推。 如此N次,然后按pop。 一张纸从抽屉里飞出,编号为76(或另一张通常是您提交的纸)。 需要其他号码吗? 再按一次弹出键。 以此类推,直到胡萝卜金的阴谋,直到盒子被清空为止。 而且,如果您继续按下弹出键,那么包装盒中的机械装置将被征服:堆栈为空! 这正是对象的外观。

但是,在创建并配置了该类之后,它对您来说在那里已经是紫罗兰色了-它可以正常工作,但是您不需要更多。 封装所有这些结构,您不会将所有内容保留在内存中。 他们(许多盒子)只是以您的设置方式互相交谈。

封装是一种拐杖,它在您构建第一百个程序时支持程序的数百个支柱。 在大型项目中(即为了创建它们,发明了OOP)就没有了,可惜,没有。

虽然,这在这里通常不太适合“ alas”。

5.现实世界中没有关系层次结构,到处都只有包含层次结构


真的是这样吗 但是,没有人愿意创建这样一个层次结构,在该层次结构中,世界上所有河流(刚果,塞纳河,泰晤士河,亚马逊河,科利马河等)都是一个“包罗万象”的“河流”的对象,该河流具有固有属性(例如,由水组成)和动作(例如水流),它已经从“池塘”继承而来,“池塘”也由水组成,从“池塘”也可以继承“湖”,其对象将是独立的湖泊(贝加尔湖,里海,喀喀湖等)。 .d。)。 该计划很粗糙。 但是关系层次结构也是抽象的 。 如果需要的话,可以说是柏拉图式的想法。 在现实世界中,它们不存在,它们仅存在于思想中,这是一种概括,仅此而已。 但这恰恰是一个人经常思考的方式。 我们可以说“袜子”而不指定颜色是什么,它是用什么材料编织的,等等,但是这种“袜子”真的存在吗?

然而,我们不应该为没有“物体”或“袜子”感到尴尬。

6. OOP方法最初是错误的


绝对没有根据的论点。 创建OOP是为了模拟一种由对象组成的虚拟世界,例如我们的世界。 例如:一个人是现实世界中的一个物体。 他会走路,跑步,吃饭, 拉屎 ,踢足球,看足球,但不幸的是,我无法在这里列出所有内容,老实说,列出所有内容实在令人厌恶。 同一个人具有以下属性:头发的存在/不存在,头发的颜色(如果有),眼睛的颜色( 如果是皮肤的颜色),手指的数量等。 如果您正确构造了所有字段和方法,如我上面所写,则程序对象将能够对真实对象的某些属性进行建模。 一个人在这样的类别中思考得很好-这就是为什么OOP变得很普遍的原因。 在编写大型项目时,它很有用,因为它引入了模块化,并允许您将软件包分解为相互交互的独立组件。

7.但是,即使数百万只苍蝇也无法说服我们粪肥美味。


反对OOP的最流行论点。 就像,大多数人都是愚蠢的(但我也不认为这也适用于程序员),绕着“时髦的衣服”并欣赏它们。
但是,请考虑一下,如果不是PLO(例如LP)已经进入基座? 您认为会有所不同吗? 没什么! 将会有球迷和恶意的对手,他们会把巴解组织视为一种工具(我实际上称之为),而不是上帝自己创造的,因此不可替代的药丸。



为什么这篇文章捍卫巴解组织?


正如我所看到的,关于编程范例的所有现代讨论都归结为两个截然不同的前提:我们将离开OOP并扔掉其余的东西,或者扔掉OOP,然后……嗯,您了解我。

我不希望将完全合适的范例视为值得的转储,但我不想绕着它跳舞,却忘记了其他所有内容。 我认为第二个更容易实现,但是本文针对的是第一个。

如果你不喜欢OOP


对谁-OOP,对谁-FP,对谁-PP。 对于某人来说,一般来说,猪软骨最甜。 如果您不喜欢猫,则可能不知道如何煮猫。

Source: https://habr.com/ru/post/zh-CN418133/


All Articles