Windows程序设计读书笔记(谈函数接口的简化)
[size=large]这本大块头终于看完第六章了,由于翻译的很多词不达意,很多时候还必须找出原文来对比对比,再加上理解,思考,速度比较慢.不过这样也好,慢慢来,小火炖一炖.
今天还想接着上次讨论的话题,谈谈自己对API理解的感悟.
先看一个很常见的API回调函数定义:
如果仔细分析一下这几个数据的具体数据结构实现,就会发现他们全部都是32位的数据,含义虽然不同,但存储起来,却都是32bit,或者说都是4个字节.(此结论经过程序验证).也就是说这个函数要求的四个参数,其长度是一致的,用不同的类型是为了方便进行类型验证和处理.
这种设计方法,使用一个统一的底层数据存储,却可以代表很多的实际含义,其实是很高明的.简单来说,在未来编译器的实现上,可以统一知道每种句炳都占据了同样长度的物理空间,就可以直接进行同样的取地址操作,而不必考虑不同的类型,长度不同而额外判断产生时间的开销.
同样的事情发生在消息传递时,由于限制传入的消息参数只能有两个32bit的数据,因此在设计时就是基于位来进行设计,在某种情况下,每个位分别代表何种含义.用0,1来代表不同的状态信息.
这样的结果是:简化了系统的对外接口,一个window对外的响应接口,严格来说只有一个,通过message,wParam,lParam的不同来组合响应多种不同消息类型.
这一点和Java的设计思路是完全不同的.
在Java里面,采取的是一种罗列可能接口的操作方式,因此随便一个类,都可能会有上百个方法对外提供,如何理解和使用这么庞大的函数集合,是一件很头疼的事情.
究其原因,还是和Java抛弃了指针的概念有关系,例如要传入一个字符串作为参数,在C里面,这很好理解,只要传入数组的首地址就可以了.而在java里面,传入字符串名字以后,由于字符串是不能被修改的,如果需要对原来的进行修改,只能重新再创建一个出来,而新的地址又会不同,如此种种,使得根本没有办法在调用参数中传递返回值地址,而只能放在返回值中.如此一来,返回值又变成了一个字符串.
在C语言的调用中,返回值一般情况下是用来做错误指示判断的,不会具有实质的含义.如果需要返回值,会将返回值作为一个参数传入函数中.
也许正是这种设计思路上的巨大差异,造成了Java的接口非常庞大.
整理的不够好,再仔细想想,再重新整理整理.
抛砖引玉.[/size]
今天还想接着上次讨论的话题,谈谈自己对API理解的感悟.
先看一个很常见的API回调函数定义:
- LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
如果仔细分析一下这几个数据的具体数据结构实现,就会发现他们全部都是32位的数据,含义虽然不同,但存储起来,却都是32bit,或者说都是4个字节.(此结论经过程序验证).也就是说这个函数要求的四个参数,其长度是一致的,用不同的类型是为了方便进行类型验证和处理.
这种设计方法,使用一个统一的底层数据存储,却可以代表很多的实际含义,其实是很高明的.简单来说,在未来编译器的实现上,可以统一知道每种句炳都占据了同样长度的物理空间,就可以直接进行同样的取地址操作,而不必考虑不同的类型,长度不同而额外判断产生时间的开销.
同样的事情发生在消息传递时,由于限制传入的消息参数只能有两个32bit的数据,因此在设计时就是基于位来进行设计,在某种情况下,每个位分别代表何种含义.用0,1来代表不同的状态信息.
这样的结果是:简化了系统的对外接口,一个window对外的响应接口,严格来说只有一个,通过message,wParam,lParam的不同来组合响应多种不同消息类型.
这一点和Java的设计思路是完全不同的.
在Java里面,采取的是一种罗列可能接口的操作方式,因此随便一个类,都可能会有上百个方法对外提供,如何理解和使用这么庞大的函数集合,是一件很头疼的事情.
究其原因,还是和Java抛弃了指针的概念有关系,例如要传入一个字符串作为参数,在C里面,这很好理解,只要传入数组的首地址就可以了.而在java里面,传入字符串名字以后,由于字符串是不能被修改的,如果需要对原来的进行修改,只能重新再创建一个出来,而新的地址又会不同,如此种种,使得根本没有办法在调用参数中传递返回值地址,而只能放在返回值中.如此一来,返回值又变成了一个字符串.
在C语言的调用中,返回值一般情况下是用来做错误指示判断的,不会具有实质的含义.如果需要返回值,会将返回值作为一个参数传入函数中.
也许正是这种设计思路上的巨大差异,造成了Java的接口非常庞大.
整理的不够好,再仔细想想,再重新整理整理.
抛砖引玉.[/size]