1. 什么是面向对象编程?
定义:
面向对象编程(Object Oriented Programming,OOP)一般指面向对象程序设计,是一种计算机编程架构。
OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。
OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。
优点:
1)数据抽象的概念可以在保持外部接口不变的情况下改变内部实现,从而减少甚至避免对外界的干扰;
2)通过继承大幅减少冗余的代码,并可以方便地扩展现有代码,提高编码效率,也减低了出错概率,降低软件维护的难度;
3)结合面向对象分析、面向对象设计,允许将问题域中的对象直接映射到程序中,减少软件开发过程中中间环节的转换过程;
4)通过对对象的辨别、划分可以将软件系统分割为若干相对为独立的部分,在一定程度上更便于控制软件复杂度;
5)以对象为中心的设计可以帮助开发人员从静态(属性)和动态(方法)两个方面把握问题,从而更好地实现系统;
6)通过对象的聚合、联合可以在保证封装与抽象的原则下实现对象在内在结构以及外在功能上的扩充,从而实现对象由低到高的升级。
2. 怎么去设计面向对象的编程?
根据需求设计类,包括属性、方法等,然后选择合适的设计模式,比如工厂模式、策略模式等,在设计的过程中遵循一些原则,比如单一职责原则、接口隔离原则等。
3. 讲讲面向对象设计的五大原则。
单一职责原则:就是一个类只有一个或极少的功能,这样可以减少类与类之间的耦合,一个类的变化不会影响另一个类。
接口隔离原则:不要给接口添加不必要的功能,比如为了少实现一个类,而在接口中增加一个功能。那对其他的类来说,也得实现这个不必要的方法了。即多个专用接口优于一个单一的通用接口。
开放-封闭原则:在不修改系统中现有功能代码(源代码或二进制代码)的前提下,实现对应用系统的软件功能的扩展。即一个模块在扩展性方面应该是开放的,在更改性方面应该是封闭的。
替换原则:子类必须能够替换掉它们的父类、并出现在父类能够出现的任何地方。
依赖倒置原则:依赖倒置就是将依赖关系倒置为依赖接口。上层模块不应该依赖于下层模块,它们共同依赖于一个抽象(父类不能依赖子类,它们都要依赖抽象类)。
4. 怎么应用这些原则?举例体现这些思想。
比如学校里有校长、老师、学生三个角色,校长负责安排任务、讲课,老师负责讲课、判作业,学生负责听课。
分别创建校长类、老师类和学生类分别实现其职责,这是单一原则。
分别创建校长和老师的接口,前者包括安排任务、讲课的方法,后者包括讲课、判作业的方法,而不是校长和老师共用一个接口。因为二者虽然都讲课,但校长不需要判作业,而老师不能安排任务。如果共用一个接口,老师类就得实现没用的安排任务的方法,校长就得实现没用的判作业的方法,因此应该分别为校长和老师创建接口,这是接口隔离原则。
当定义了校长、老师、学生的三个父类后,可以有其他类继承这些父类,并定义更多的方法,然后这些子类可以被继承甚至替代父类,这是替换原则、开放-封闭原则的综合运用。
5. 如果让你设计一个缓存,你怎么以面向对象来设计呢?
提示:
1、缓存用来做什么的;
2、缓存你用那种数据结构;
3、缓存具体有哪些算法
什么是缓存?
缓存就是数据交换的缓冲区(称作Cache),是存贮数据(使用频繁的数据)的临时地方。当用户查询数据,首先在缓存中寻找,如果找到了则直接执行。如果找不到,则去数据库中查找。缓存的本质就是用空间换时间,牺牲数据的实时性,以服务器内存中的数据暂时代替从数据库读取最新的数据,减少数据库IO,减轻服务器压力,减少网络延迟,加快页面打开速度。
缓存的特点
被缓存的数据一般具有以下特点:
1、经常被访问
不经常被访问的数据,即使缓存了对系统的性能吞吐也没太大的改善,没什么必要做缓存,直接访问DB、File、其他系统即可。
2、改动不频繁
如果一个数据改动很频繁,缓存的数据很容易就过期或者失效,保证数据一致性成本很高,命中率也很难上去,缓存的效果也不会好。
3、时效性不强
业务上要能容忍缓存失效前数据的不准确性。
缓存的类型
对于优化网站速度,缓存有:CDN,js及静态资源文件缓存,数据库缓存,数据映射层缓存(mybatis),以及业务层缓存。
缓存的数据结构及算法
FIFO-先进先出(First Input First Output)
特点:先进先出,符合公平性,实现简单。
数据结构:队列
淘汰原则:如果一个数据最先进入缓存中,则应该最早淘汰掉。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。
LRU-最近最久未使用(Least Recently Used)
特点:按照时间长短,最不经常使用的缓存数据先被淘汰。
数据结构:链表和hashmap
淘汰原则:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。
LFU-最近最少使用(Least Frequently Used)
特点:按照访问次数,最近最少使用的缓存数据先被淘汰。
数据结构:数组、hashmap、堆
淘汰原则:如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小。