2020-09-19

面向对象的思维

一直在思考究竟什么是面向对象,如何用面向对象的思维来思考问题,来设计我们的系统?

我们在做设计时,很多时候往往很自然的想到的就是,第一步做什么、第二步做什么、……,注意到了没,这其实是一种流程化的思维,也就是面向过程的思维。这时我们看到的往往只是某个特定场景下的特定问题的解决步骤,顺着这样的思路,我们去设计我们的代码,最终很可能就是按照流程一步步地实现每个步骤的逻辑,然后再通过函数调用的方式将每个步骤串联起来,最终实现业务功能。当然这种方式,我们是完全可以开发出满足需求的、可运行的系统的。

举个例子吧,我们现在要写一个包饺子的程序,要求是包若干个小麦面皮的青菜猪肉馅的饺子,按照过程化的思维,我们包饺子的程序很可能是这样的第一步和面、第二步擀小麦面皮、第三步做青菜猪肉馅、第四步用皮把馅包起来、第五步放锅里煮,最后香喷喷的饺子做好了,感觉很完美!

现在新的需求又来了,需求方希望我们的程序能够包出玉米面皮的青菜猪肉馅的饺子、小麦面皮的芹菜猪肉馅的饺子、玉米面皮的白菜牛肉馅的饺子、杂面皮的荠菜馅饺子……,是不是快要晕了,估计你的代码中已经充斥了各种让人眼花缭乱的if……else……判断了吧,更糟糕的是,很可能在实现新的需求时,还会一不留神就引入bug,导致原本正常的功能变得不正常了。问题出在哪里呢?面向过程的思维方式不正确吗?

其实用面向过程的方式思考、解决问题的方式并没有错,它能够清晰地向我们展示问题的具体解决步骤,但是当问题变得越来越复杂时,它就显得越来越力不从心了。问题出在哪里呢?我认为这种思维方式,让我们过早地陷入到了过程细节,它缺少了一个重要的过程,那就是抽象,对就是抽象,抽象是面向对象设计中最重要的过程,也是面向对象的精髓所在,通过建模、概念化、设计等阶段最终实现了现实世界向对象世界的转化,也就是说我们最终目地是为了抽象出能够帮助我们干活的对象,这不由让我想起面向对象那句人尽皆知的一句名言“万物皆对象”。

再次回到刚才包饺子的例子,采用面向对象的思维时,我们可以想象成我们拥有一组和面的对象,它们专门负责和面,有的和小麦面、有的和玉米面、有的和杂面面……,有专门负责擀面皮的对象,有专门负责做各种饺子馅的对象,有专门负责煮饺子的对象……,你需要做什么饺子只需要指挥不同的对象去干活就可以了,将不同的对象搭配在一起干活,就能够随心所欲的做出不同品种的饺子,这样是不是完美地实现了复用;如果业务又提出要能够生产海带馅饺子的需求,这时你只要在那组做饺子馅的对象中再扩展一个新的实现就可以了,不用修改原有的实现,这不就是开闭原则吗!

到这里我们是不是对面向对象的思维是不是有了一个认识了呢?用面向对象的思维思考问题时,你不觉得自己更像一个领导者吗,原来一步步的都要自己去干,现在不用什么都亲力亲为了,可以指挥着我们的对象帮我们去干,是不是感觉很爽啊!

既然面向对象如此优秀,那么面向过程是不是就没用了呢?是不是该被抛弃了呢?非也,其实两种思想只是认识论的不同,在很多时候它们并不是互斥的,而是相辅相成的,面向过程适合解决小的、简单的问题,面向对象思维方式适合解决大的、复杂的问题,复杂问题本身就是由很多简单问题组成的,而面向对象实际上是把复杂的问题分解成很多的小问题,在分析每个小问题的具体实现时、在分析对象间的相互作用时我们不可避免的也会采用流程化、过程化的思维方式。因此我认为它们是相辅相成的,在宏观上采用面向对象的思维方式,在处理具体细节时采用过程化的思维方式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值