面向对象编程的优点是什么

面向对象编程是一种处理复杂问题的设计工具,本身没有什么好坏之分,只有用的好坏之分。但面向对象的问题在于长期以来的技术环境、编程语言、一些工具的推广、培训和教育都大大的过分乐观的强调了面向对象编程本身可以带来的好处。以至于很多学习编程的人都深深的相信“只要用了面向对象编程(以及基于其基础之上的的一系列设计模式、规范、工具、框架),就能得到非常容易维护、可以复用、明晰可理解的代码“。

但,这并不是真的。

如果你经历过很多,就会发现“只要如何如何,就一定能如何如何”这个提法一旦出现,基本上就不靠谱,不管是编程还是别的什么事情。

在大量的场景中,可以偏执的认为“万物皆对象”(或者万物皆别的什么),但是哲学上的单纯并不一定能让现实中的工程变得更“好”。如果说非得有个“万物皆XX”,那么这个XX八成就是根据众多需求综合到一起的“折衷”。

简单从工程讲的话,如果程序(或者说工作)是一次性的,那么怎么写得快,能work就怎么来。这个相对好理解。但是,如果程序是要长期维护的,那么如何管理其复杂性是核心的问题。而管理复杂性的要点在于

  • 让事情本身变得简单。这说白了就是砍需求,研发和PM之间要经常沟通去避免nice to have的需求变动带来的程序复杂性的剧烈变化(比如一个1对1的实体关系,需求变动一点就变成了麻烦的多的“有时1对1,有时1对多”的混合关系)。
  • 运用隔离的手段将复杂性拆解为互相影响很小的单元。一个单元对外只暴露一个简单的“接口”,隐藏内部复杂性。这就是“抽象”或者“封装“的力量。但是问题在于,这个抽象本身是否做的合适是由于问题决定的,而不是代码本身决定的。

即便是抽象,也有很多种做法。可以定义一组接口,这个接口是一组函数、一组服务的RPC还是一个class的public method都可以根据实际情况商讨。面向对象只是这里面其中一种做法而已。一个想要把程序编好的人,需要注重的是理解问题,然后尝试做出几种不同的抽象,评估各自优缺点后得到一个当时可行解的能力。而现有的大环境、教育体系,没有那么多真实的、复杂的案例,只能用一些简单的sample code来教授。并且在说明问题本身时,简化问题本身,而突出代码设计的“模式”。这就好像是在用视频教人游泳一样。学习者自己需要认识到这些培训只是个参考,玩真的还是要到项目里去体会。

即便是用面向对象做抽象也会有问题。很多时候,面向对象编程并不是一种好的“抽象”。如果抽象做得好,透过抽象出来的“接口”就可以轻易的使用这个系统。这时“大量的复杂性”被隐藏到接口后的实现里。这就像是你看电视从来都不需要拆开壳子看里面液晶屏幕和视频信号的转换,只需要知道【电源】、【调台】、【调音量】就能用。一个抽象做得好,往往要“deep”,隐藏足够的复杂度。而面向对象的文化/教育往往会鼓励程序员做很多无意义的,无性价比的抽象。看看有些代码里完全不知所云的adaptor,factory,builder等就是这种做法的产物。

此外,在大量使用继承作为设计方法时,也没有起到任何实质的隔离作用。如果你尝试扩展一个继承体系,往往需要了解整个继承体系才能写对代码——这时,复杂性并没有被隐藏起来。你也许只是代码写的少了而已。对于这种复杂度没有降低,编写代码只是写的少,但是要看懂还是得结合整个体系才能做到的方式,不是抽象,是“压缩”。压缩只能少写代码,却会让系统更难以理解了。

也许不太容易理解压缩在这里意思。比如在一段被压缩的数据中有3个bytes是“A”,“1”, “8”。但是他们的意思可能是A连续出现18次,也许是A1连续出现8次。至于到底是哪个意思,必须从头读所有的数据才能弄明白。编码也是这个道理。

再说说类型本身。一些面向对象编码对类型的定义要求的比较严格。其本质假设是“如果一个Object的类型是XXXX”,则其行为模式必然是“YYYY”。但现实当中,一个Object的行为模式不光与他的类型有关,还与这个Object“如何被使用”有关。比方说,一个User的Object,如果是用户自己看自己,就可以登陆、登出,修改昵称;如果是其他普通用户看,就只能看看看昵称和头像;如果是管理员来操作,可以reset密码、注销或者踢出登陆。这时就得界定一个Scope,来说明现在的User到底是哪个scope的User。DDD的一些理念就源自于此——找到某个上下文的某个实体概念,不能有歧义。但是即便不用DDD,也必须用各种变通的手段,把“如何用”的信息与类型信息结合到一起来实现逻辑。很郁闷的是,这个“如何用”完全没有章法,可能是“iOS App登陆“,也可能是“第一次下单时”,或者是“系统处于降级状态”时。你永远也猜不到下一次可能会有个什么条件是要纳入到上下文的。大家都知道大量用if不好,容易让代码变成麻花,无法维护。但面向对象编程本身没解决。很多文章提出面向对象某个模式可以少写if,让代码容易维护。但是这其实是建立在那个问题的上下文已经明确的基础之上。上下文易变的问题没有解决,换一个上下文,招数便不灵了,到时还得处理一坨“模式代码”,非常恶心。

最后,面向对象会倾向于将不同的代码抽象为不同相互作用的Object,但是有一些现实因素会让这么面向对象得到非常不理想的效果:

  • 安全 – 如果你的代码要求非常安全,那么所有的Object都要耦合安全控制的代码;要不就是在一层对外的接口之前拦截一道处理安全问题,内部Object都无视安全问题。这也就相当于放弃了一部分的安全性。
  • 性能 – 如果强调性能的话,是要尽量减少隔离的层次的。无论抽象如何做,只要隔离发生,就要经历一次转换以及相应的性能损耗。比如早期的Hibernate不支持“bulk insert”和“bulk update”,只能逼着程序员做for loop IO;而native的sql却可以轻易办到。在每多一次IO都很伤的场景下,这种隔离只能把事情做的更糟。
  • 数据为中心 – 很多业务场景都是以数据为中心。也就是说DB里的那坨数据是唯一的truth。在代码层面做的只是为处理数据更加方便。这时做的很多抽象意义不大。比如你可以在ORM层强制声明读取出来的一个数据少了某个字段是invalid的。但是你没法阻止你的第三方数据提供商源给你invalid的数据。对Invalid数据的处理远不是一个Annotation就能搞定的,必须引入复杂的业务流程。
  • 灵活性和成本 – 每次做某种抽象都意味着对一个系统“要做某种变化的能力做出优化”,但是同时,也就意味着或多或少对其他种变化适应性做“劣化“。如果系统变化的方向和预期的不一致,那么浪费掉的工作不说,为了再次调整设计方向的代价也会相当的大。这种情况比比皆是。

总结下,我希望所有的程序员都要理解自己的工作的最终目的是干什么的,并且活用自己所能用到的一切工具来达成自己的目标。不要在各种编程范式里迷了路。如果是初学编程的人,我衷心的希望你的编程课程讲授的是解决一些实际的问题,多了解业务,多尝试对业务的变动作出合理和准确的预。不要过早的接触高层的思想和哲学层面的问题——一个小孩看《红楼梦》又能真的看懂多少呢。

面向对象编程是根据功能来编程,省略了步骤,这是它的优点,也是它的缺点。

举个大家爱举的例子,盖浇饭这个菜品就是按面向对象原理设计出来的。菜和饭被设计成不相关的两个类,菜是菜,饭是饭,最后一混合就行了。很明显,这种饭的入味是不均匀的,由于菜需要单独炒,性能开销也比较大。这就造成这种设计方式不适合对性能高要求的场景,比如嵌入式开发,linux等。

我写程序很早,1997年用386写了一个仓库管理系统,它就是用面向过程思想写的。我需要研究仓管员的每一个动作,把这个动作变成程序的步骤,每个步骤之间的关系用方法来实现。这些方法是自己一个一个写的,写完之后,我确实学会了编程。

到面相对象的时候,这些方法不用自己写了,只要你知道有,会调用就行了。写软件成了做盖浇饭,关键你只会煮饭和最后的浇饭动作,炒菜技巧被掩盖了。这个弊端造成你35岁就可能失业,毕竟炒菜需要经验,浇饭没多少经验可谈。

原创文章,作者:普尔小编,如若转载,请注明出处:http://www.puerpx.cn/pxwd/8560.html

(0)
上一篇 2023-03-16 上午9:18
下一篇 2023-03-16 上午9:30

相关推荐

  • 蛋糕 培训:蛋糕培训一般去哪里

    ,一般来说,看你想学的是法点?还是基础烘焙?还是翻糖的?看需求再定,如果是想自己在家做的话,网上有教程可以直接学,比如小某书,抖音,快手,下厨房等?如果是想学法点可以去当地的当地的…

    培训问答 2022-04-27
  • 初中毕业可以学哪些专业

    机电一体化技术专业 培养目标:本专业主要服务工程机械、汽车及零部件优势产业,辐射中南,培养企业中、基层一线骨干。培养拥护党的基本路线,德、智、体等方面全面发展的,适应生产、建设、服…

    培训问答 2023-02-27
  • 初中毕业读4年拿大专文凭吗

    建议家长最好不要选择这类3+2一体化培养模式的大专学历培养学校,学习从来没有一劳永逸的事情,也没有不通过努力拼搏就随随便便成功的事情,况且现在的时代是以学历和综合学习能力相提并论的…

    培训问答 2022-04-29
  • 初中生可以上哪些技校,初中毕业能上哪些技校

    初中毕业生有很多技术可以学的,以我身边的同学或朋友从事的行业来说,很多人都是通过上一个技术学校,学了一门技术找到了一份不错的工作或者自己开了一个相关的小店。 男生的话,一可以选择一…

    培训问答 2022-07-03
  • 如何教育青少年(如何教育青少年合理开支)

    这是个大问题,教育好青少年社会、学校、家长这三方是相互相承的,缺一不可。 一、社会现象对青少年教育,起潜移默化、举足轻重的作用。社会是否风清气正,民风纯朴,及精神文明建设的好与差,…

    培训问答 2023-03-01
  • 广州动漫学院,广州城建职业学院动漫制作技术专业

    本专业以职业能力培养为主线,强调培养学生的独立思考能力、 创意能力和动手能力。在“互联网+”时代背景下,面向企业用人需求,与行业企业建立实践教学合作平台,形成理论与实践相联系,艺术…

    培训问答 2022-05-24
  • 伯利兹英语,伯利兹是哪个国家

    伯利兹(Belize):寂静航标 它是玛雅人的故乡,近现代在殖民者与邻国争夺与控制下安静地生活;它有不同于中美洲5个邻国的政治社会生态,鲜有被媒体关注或曝光的记录。 伯利兹位于中美…

    培训问答 2022-05-22
  • 想学演讲怎么入门

    提醒:如果想21天成为演讲大师,请止步! 我把我学习演讲的经验总结为三句口诀:脚踏实地,不怕丢脸,总结完善。 脚踏实地的意思是:切勿心急,不要想着一下成为演讲大师。 不怕丢脸的意思…

    培训问答 2022-10-15
  • 公司补贴的生活费要交个人所得税吗怎么交

    我们在生活中经常会遇到公司发放的各种各样名目的补贴、津贴、福利待遇等,哪些福利收入不需要扣缴个税呢?一起来看看: 1、独生子女补贴、托儿补助费 个人按规定标准取得独生子女补贴和托儿…

    培训问答 2023-05-05
  • 旅游这个行业怎么入门

    作为一名旅游咨询师,每逢年底伤脑筋,不知道该怎么跟父老乡亲解释自己职业,既不是在做导游,也不是为旅行社安排旅游线路,更没办法为出游的亲朋申请酒店或者旅游景区门票折扣。这么难解释的职…

    培训问答 2022-05-10