什么是面向对象编程和面向对象编程语言?什么是面向对象分析和面向对象设计?
面向对象编程(OOP) 面向对象分析(OOA) 面向对象设计(OOD)
面向对象编程的英文缩写是OOP,全称是Object Oriented Programming。对应地,面向对象编程语言的英文缩写是OOPL,全称是Object Oriented Programming Language
面向对象分析英文缩写是OOA,全称是Object Oriented Analysis
面向对象设计的英文缩写是OOD,全称是Object Oriented Design。
OOA、OOD、OOP三个连在一起就是面向对象分析、设计、编程(实现),正好是面向对象软件开发要经历的三个阶段。
面向对象中的继承、多态能让我们写出可复用的代码;编码规范能让我们写出可读性好的代码;设计原则中的单一职责、DRY、基于接口而非实现、里式替换原则等,可以让我们写出可复用、灵活、可读性好、易扩展、易维护的代码;设计模式可以让我们写出易扩展的代码;持续重构可以时刻保持代码的可维护性
最常用到几个评判代码质量的标准是:可维护性、可读性、可扩展性、灵活性、简洁性、可复用性、可测试性。其中,可维护性、可读性、可扩展性又是提到最多的、最重要的三个评价标准。
思从深而行从简
DRY(Don’t Repeat Yourself)
- 你熟悉的编程语言是否支持多重继承?如果不支持,请说一下为什么不支持。如果支持,请说一下它是如何避免多重继承的副作用的。
- JavaScript 不支持多继承,多继承理论上都存在“菱形问题”,也就是说如果 class D 继承了 class B 和 class C,class B 和 class C 都继承了 class A,class A 中有一个方法 add,B 和 C 都重写了 add 方法,当 D 去调用 add 方法时 就会出问题,不知道调用哪个方法了。
- 理论上是可以通过 Mixin 的方式来实现多继承。
- 通过一些 合并 算法来“部分”解决“菱形问题”
- 参考 JavaScript中的“多继承” https://juejin.im/entry/5ac46b6c5188255570063b71
- 你熟悉的编程语言对于四大特性是否都有现成的语法支持?对于支持的特性,是通过什么语法机制实现的?对于不支持的特性,又是基于什么原因做的取舍?
- JavaScript 支持封装,抽象,继承,多态
- 封装 ES6的话,通过 public protected private 等关键字来实现,ES5 的话通过 “函数作用域”,this,原型链来实现,ES6 的 class 本质上也是 function 的语法糖。
- 抽象 可以通过 this指针 和 原型链 的形式来实现
- 继承 通过 原型链 来实现,或者说基于封装的特性来实现
- 多态 通过原型链 的方式,子类覆写父类的方法来实现
几个常用的设计原则:
SOLID原则-SRP单一职责原则 SOLID原则-OCP开闭原则 SOLID原则-LSP里式替换原则 SOLID原则-ISP接口隔离原则 SOLID原则-DIP依赖倒置原则 DRY原则、KISS原则、YAGNI原则、LOD法则
按照类型和是否常用,设计模式可分类为:
1.创建型 常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式。
不常用的有:原型模式。
2.结构型 常用的有:代理模式、桥接模式、装饰者模式、适配器模式。
不常用的有:门面模式、组合模式、享元模式。
3.行为型 常用的有:观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式。
不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
总结:提高代码质量的方法论,包含面向对象(基础),设计原则(指导方针),设计模式(三大类,提高扩展性),编程规范(提高可读性),重构(保证代码质量)。 [13赞]
我看到设计原则中还有迪米特法则(Law of Demeter, LoD),这个也是解决God类的一种方式。另外这个法则,好像跟组合复用相背呢。帮忙解释一下。 [4赞]
最经典的设计模式书籍是GoF的《设计模式》,它的中文全称是《设计模式:可复用面向对象软件的基础》,英文全称是“Design Patterns: Elements of Reusable Object-Oriented Software”。
在技术圈里,封装、抽象、继承、多态也并不是固定地被叫作“四大特性”(features),也有人称它们为面向对象编程的四大概念(concepts)、四大基石(cornerstones)、四大基础(fundamentals)、四大支柱(pillars)等等。
对于重构这部分内容,你需要掌握以下几个知识点:
重构的目的(why)、对象(what)、时机(when)、方法(how); 保证重构不出错的技术手段:单元测试和代码的可测试性; 两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)。
UML
- 团队内统一用platuml来画图
- 关于 UML 推荐一本书《Java Modeling In Color With UML》和一个神器:
https://github.com/gdhucoder/Algorithms4/blob/master/designpattern/pic/umlcheatsheet.jpg
- Uml类图是不用记的。用的时候看一下cheat sheet就行。
https://github.com/gdhucoder/Algorithms4/blob/master/designpattern/pic/umlcheatsheet.jpg
理解 泳道图、时序图、流程图、状态图、协作图 - TinyMark - 博客园 https://www.cnblogs.com/Mark-blog/p/10435351.html
抽象作为一个非常宽泛的设计思想,在代码设计中,起到非常重要的指导作用。很多设计原则都体现了抽象这种设计思想,比如基于接口而非实现编程、开闭原则(对扩展开放、对修改关闭)、代码解耦(降低代码的耦合性)等。
python支持多继承因为它通过MRO解决的
一个RPC框架可以使用到什么设计模式?
工厂模式 策略模式 。。面试官指引了我一下 你服务调用的时候 只有接口方法,没有实际方法实现。
反射机制,还会用到代理模式
有服务监听 有观察者模式
单例模式 单例有几种? 注册表 内部静态类 双检锁
单例模式常见的实现方式有三种。
第一种是静态初始化方式,也叫作饿汉方式。实现的思路就是在类初始化时完成单例实例的创建,因此不会产生并发问题,在这种方式下不管是否会使用到这个单例,都会创建这个单例。
第二种实现方式是双重检查,也叫作懒汉方式,只有在真正用到这个单例实例的时候才会去创建,如果没有使用就不会创建。这个方式必然会面对多个线程同时使用实例时的并发问题。为了解决并发访问问题,通过 synchronized 或者 lock 进行双重检查,保证只有一个线程能够创建实例。这里要注意内存可见性引起的并发问题,必须使用 volatile 关键字修饰单例变量。
第三种是单例注册表方式,Spring 中 Bean 的单例模式就是通过单例注册表方式实现的。