读《代码里的世界观有感--玩玩虚的更健康》

文章目录

 


前言

“面向抽象编程,面向接口编程”本质应该是对数据的抽象以及行为的抽象化。

 

一、面向抽象编程?

个人认为面向抽象是应该在关键适合的地方去抽象,如果处处都抽象,代价会非常大。

《代码里的世界观》提到一个点抽象最讨厌的敌人是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的两种武器,而用户需求的决定了抽象到何种程度的决定因素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值