面向对象编程思想的理解

面向对象

  • 什么是面向对象编程
  1. (一:了解)
    面向对象编程(OOP)是一种编程思想,这里借助面向过程和面向对象对比进行理解。比如你打算吃蛋炒饭,可以自己做或者去饭店吃。
    在这里插入图片描述
    可以看出 面向对象面向过程 的区别,面向过程关注的是每一个功能实现的具体步骤,面向对象关注的是对象,然后由对象去调用功能。这里的饭店就是一个对象,把一类事情交给一个对象去处理

    来段故事

    一个老板,接了一个300万的软件开发的项目,但是呢?这位老板本身并不具备软件开发的能力,他要怎么做呢?他可不可以自己做?现学?可以,因为项目就是人做出来的嘛!于是乎,这个老板现学软件开发,终于,5年时间,他把那个项目做出来了,可事实是那个给钱的公司早就黄了!这是不是不靠谱啊?那这个老板该怎么做?他聘请了一批程序员,说这有个项目,你们给我做出来,程序员是不是专业啊?那这没那个老板什么事了,他就去喝茶,玩去了!对这个老板来说,开发软件这个事情是不是从复杂变得简单了?他是不是从一个执行者转换成了指挥者?这些专业程序员对老板来说就是对象,老板面向这些对象,调用这些对象本身具有的功能来实现了自己的目的!这就是面向对象!

  2. (二:举例)
    例一:洗衣机里面放有脏衣服,怎么洗干净?

    面向过程的解决方法:
    1、执行加洗衣粉方法;
    2、执行加水方法;
    3、执行洗衣服方法;
    4、执行清洗方法;
    5、 执行烘干方法;

    将解决这个问题的过程拆成一个个方法(是没有对象去调用的),通过一个个方法的执行来解决问题。

    面向对象的解决方法:
    1、我先弄出两个对象:“洗衣机” 对象和 “人” 对象
    2、针对对象 “洗衣机” 加入一些属性和方法:“洗衣服方法”、“清洗方法”、“烘干方法”
    3、针对对象 “人” 加入属性和方法:“加洗衣粉方法”、“加水方法”
    4、然后执行
    人.加洗衣粉
    人.加水
    洗衣机.洗衣服
    洗衣机.清洗
    洗衣机.烘干

    面向对象编程就是先抽象出对象,然后用对象执行方法的方式解决问题。

    例二:五子棋游戏

    面向过程的设计思路就是首先分析问题的步骤:
    1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。

    面向对象的设计则是从共性和功能的思路来解决问题:
    整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

    可以明显地看出,面向对象是以功能来划分问题,而不是步骤。

  3. (三:总结)
    ①、面向对象是一种思考问题的方式,是一种思想。
    ②、面向对象将复杂的事情变简单了。面向过程需要关注每一步的实现,而面向对象只需要关注一个对象就可以了。
    ③、面向对象让我们的角色发生了转变,从原来的执行者过渡到了指挥者。
    ④、面向对象基于面向过程。


面向对象的五大基本原则

  1. 单一职责原则 (Single Responsibility Principle SRP)
    是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。

  2. 开放封闭原则 (Open-Close Principle OCP)
    一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。

  3. 里式替换原则 (the Liskov Substitution Principle LSP)
    子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

  4. 依赖倒置原则(the Dependency Inversion Principle DIP)
    具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类: 而应当由B定义一个抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。

  5. 接口分离原则(the Interface Segregation Principle ISP)
    模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值