文章目录
前言
“面向抽象编程,面向接口编程”本质应该是对数据的抽象以及行为的抽象化。
一、面向抽象编程?
个人认为面向抽象是应该在关键适合的地方去抽象,如果处处都抽象,代价会非常大。
《代码里的世界观》提到一个点抽象最讨厌的敌人是new。
我们先来看下下边的代码:
Animal animal = new Tigger(); // Animal 是抽象类。
也就是我们常说的左边抽象,右边具体。
假设:在一个类中 存在一个私有变量 animal. 实例化有以下几种方式:
1: private Animal animal = new Tigger();
2: C++ 中可在构造函数中传参方式进行初始化创建。
3、通过某个函数内部中对变量进行定义
void setAnimal(){
Animal animal = new Tigger();
}
通过第三种方式,将实例化交给外不,这种延后的调用恰恰是最好的。
另外又有人会问如果 使用 Tigger tigger = new Tigger() 不是更好。
个人认为当 左值不需要调用具体类的特殊方法时,便可使用抽象Animal作为左值。
单需要具体类的方式便需要使用左值为Tigger类。 所以在适当的地方抽象,某些地方具体往往是根据实际情况决定的。
再一个例子:
Tigger类 存在一个方法狩猎。和Animal动物类 可能不存狩猎的具体方法。因此实例与抽象中需要代码具体决定,如果以Animal animal = new Tigger ()
下边需要对 Tigger t = (Tigger)animal 进行强制类型转换。何不用直接使用实例化类的作为左值呢?
二、消灭new的两件武器
1.工厂模式
当存在需要new多种动物时如老虎、狮子、狼等。
便需要一个工程模式进行内部处理将 new的操作统一进行new 这样便将创建实例的操作交给了工厂类。
简单例子
Animal ProvidaAnimal(String name) {
aAnimal animal;
if(name == "Tigger")
animal = new Tigger;
else if (name == "Lion")
animal = new Lion;
...}
void show (String name){
Animal = ProvidaAnimal(name)
}
2.抽象程度
个人认为不是越抽象越好,JAVA 存在一个根对象类Object 同样 QT 中存在QObject 类,如果将 Object obj = new Tigger 则需要对 obj进行强制类型转换为实例化类的类型,并调用其特有的方法
有一句古话叫做魔鬼身材“该瘦的地方瘦,该肥的地方肥”。把这句话套到抽象编程里则是“该实的地方实,该虚的地方虚”,抽象与具体之间应该存在一个平衡点,这个平衡点正是应该时刻存在程序员的大脑的
一件东西:用户需求!!
总结
抽象可以让相互间的依赖更少,架构更灵活。
参数化和工厂模式是消灭或者隔离new的两种武器,而用户需求的决定了抽象到何种程度的决定因素。