Object Oriented Design
应届毕业生
Useable 实用性
Design Elevator
System Design:
有经验的面试者
需要处理大量数据,提供service的部门
Scalability
Design Twitter
OOA 面向对象分析
OOD面向对象设计
OOP面向对象编程
出题问法:
Can you design an elevator system?
Little Amount of coding
Can you design scheduler for elevator system?
Need Implementation
起手式陷阱
Desgin A Parking Lot
忌:自说自话,混淆算法结构
宜:先通过与面试官交流获得有效信息
进行中陷阱
忌:思路混乱,反复修改
宜:先给面试官呈现一个Usable的成果
收尾式陷阱
忌:虎头蛇尾,
宜:检查你的设计,是否支持所需功能
如何评判一轮OOD面试
Communication 充分了解需求
Thinking Process 不要思维跳跃
Correctness 实现功能,场景
Reasonable:Elegant,Maintainable, Extendable, 封装,继承,多态,SOLID
(Bonus) Good practice
(Bonus) Design Pattern
SOLID:
1.Single Responsibility Principle 单一责任原则
一个雷应该有且只有一个改变它的理由, 即一个类只有一个工作。
public class AreaCalculator{
private float result;
public float calculateArea(Shape s){
//calculate Area
}
//Not Recommend: name too long and only apply to specific bit
//Need change when apply to two bit
public String printAreaAccurateToOneDecimalPlace(){
}
}
2.Open Close principle 开闭原则
对象或实体应对扩展开放,对修改封闭(Open to Extension, Close to Modification)
public class AreaCalculator{
//扩展性很差,
public float calculateArea(Triangle t){
}
public float calculateArea(Rectangle r){
}
}
3.Liskov Principle 里氏替换原则
任何一个自雷或者派生类可以替换它们的父类或者基类
//这里矩形就无法替换 Shape,因为无法计算容量。
public class Shape{
abstract public float calculateVolumn();
abstract public float calculateArea();
}
public class Rectangle extends Shape{
}
public class Cube extends Shape{
}
4.Interface Segregation Principle 接口分离原则
不应该强迫一个类实现它用不上的接口。
public class Shape{
abstract public float calculateVolumn();
abstract public float calculateArea();
}
public class Rectangle extends Shape{
}
public class Cube extends Shape{
}
5.Dependency inversion principle 依赖反转原则
抽象不应该依赖于具体实现, 具体实现应该依赖于抽象。
public class AreaCalculator{
public float calculateArea(ShapeInterface s){
}
}
interface ShapeInterface{
public float area();
}
public class Rectangle implements ShapeInterface{
private float length;
private float width;
public float area(){
return length * width;
}
}
public class Triangle implements ShapeInterface{
private float height;
private float width;
public float area(){
return (height*width)/2;
}
}
5C解题法
Clarify: 通过和面试官交流,去除题目中歧义,确定答题范围。
Core objects: 确定题目所涉及的类,以及类之间的映射关系。
Cases: 确定题目中所需要实现的场景和功能。
Classes: 通过类图的方式,具体填充题目中设计的类。
Correctness:检查自己的设计,是否满足关键点。