关于抽象
我理解的抽象
记得是去年8月份。第一次听到抽象这个词语,觉得它很很神秘。所以花了很大的力气去理解它,期间包括看了很多的书籍也查了很多的资料。但是当我真的触摸到它的时候,才发现它真的是比我想象中的要难很多。
所有的编程语言都提供抽象机制。可以认为,人们所能够解决的问题的复杂性直接取决于抽象的类型和质量。所谓的“类型”是指“所抽象的是什么?”汇编语言是对底层机器的轻微抽象。接着出现的许多所谓“命令式”语言(如FORTRAN.BASIC.C等)都是对汇编语言的抽象。这些语言在汇编的基础上有了大幅的改进。但是它们所做的主要抽象仍要求在解决问题时要基于计算机的结构,而不是基于所要解决问题的结构来考虑。程序员必须建立起在机器模型(位于"解空间"内,这是对问题建模的地方,例如计算机)和实际待解问题的的模型(位于“问题空间”内,这是问题存在的地方,例如一项业务)之间的关联 ---<<thinking in java>>
抽象
我目前所理解的抽象,就是一个建模的过程。这里的模不单单只是模型的意思。举个例子
比如java Socket就是对TCP/IP的一种抽象。我们在操作的时候不用直接操作TCP/IP各种底层协议,也不用去了解它的底层的具体实现。编程的时候我们只需要关注Socket这个对象,操作这个对象就行了。
正确的抽象
抽象其实并不难,但是如何正确的抽象才是抽象过程的难点。举个例子开放平台商品上传的例子
商品上传,包括商品属性的上传和商品图片的上传。那么在这个抽象过程中,我们赋予这个对象的接口是只单单是上传接口:
public interface ItemTransUploadService {
void uploadItem(GoodUploadBO goodsUploadBO);
}
还是分为上传商品接口和上传图片接口呢?
public interface ItemTransUploadService {
void uploadItem(GoodUploadBO goodsUploadBO);
void uploadPic(PicBO pic);
}
这个就需要根据实际的需求来考量了。如果外部需要区分ItemTransUploadService的这两个行为,那么就需要把两个接口独立出来。如果不需要那么写在一起也是可以的。
而根据抽象的维度不同,我们抽象出来的对象接口数量也会不同。如何正确的抽象是抽象中的难点。
抽象的误区
在刚接触抽象那会儿,特别是看了几个设计模式以后。觉得抽象就是,把一些有共同行为的对象,一抽抽成一个父类,然后由这个父类派生出各个子类。
包括网上很多资料中,搜索抽象的时候。避免不了会涉提及到interface和abstract。
其实interface和abstract只是抽象的一个结果。当我们利用interface和abstract往往是想利用其多态性质来进行程序的解耦。