Re ql2000:
楼主能够考虑到通用性,看来是一个考虑比较全面的人。
一般意义上说,我们遇到通用性(也可以称之为可移植性或者兼容性)的问题时,有两类解决办法,它们分别面向两个方向:
一类是面向系统平台的,那就是扩展平台的功能供给。比如此例,我们需要批处理中的菜单功能在没有CHOICE的系统平台下也可以正常运行,比如WINDOWS 2000或者WINDOWS XP系统。那么类似的解决办法,就是向外发布自己的批处理程序时,随同发布此程序所需的CHOICE程序,以供我们的程序随时调用。这样我们在没有CHOICE的系统中增加了CHOICE,就相当于扩展了系统的功能,也就是增强了系统的兼容性。有相当多的DOS或者WINDOWS下的程序就是这样实现不同平台下相同的功能支持的,比如本站的DOS71安装盘,为了实现程序的向导式安装,就附带了WBAT等多个批处理增强工具或软件。
另一类是面向程序自身的,那就是缩减程序自身的功能需求。仍如上例,我们需要批处理中的菜单功能在没有CHOICE的系统平台下也可以正常运行,比如WINDOWS 2000或者WINDOWS XP系统。那么类似的解决办法就是使我们的程序不需要CHOICE程序,那么不使用CHOICE如何实现呢?我们可以考虑使用在批处理中插入实现菜单功能的汇编代码,然后使它在运行时自动汇编为机器代码执行。当然,代码不会太长,否则付出的代价就未免太大了。也有很多的程序,就是通过缩减自身功能需求来实现不同平台下相同的功能支持的。
当然,这两类方法在更底层的方向上来看,其实是一致的。无论是扩展系统功能还是缩减自身需求,其实都意味着由程序开发者自己提供相应的功能,差异只在于前者将此功能与系统共享(共有),而后者将此功能封装给自身(私有)。如果自身实在无法提供此功能,那么只能将此功能砍掉,通过其他折中的方法实现。仍以上例说明,我们就可以考虑不在程序中使用菜单,而通过命令行开关参数加帮助提示的方法来实现不同功能跳转选择。当然,这并不是解决问题的办法,而是"逃避"问题,但在许多场合,我们恰恰需要"逃避",或者不得不"逃避",这属于在程序设计和规划时就需要考虑的问题。
其实,关于兼容性的问题,确实是个很复杂的问题。我们知道,平台的多样性带来了平台的兼容性,也带来了软件的可移植性。一方面,我们为了能够使用得更多更漂亮,而鼓励多样性的存在;另一方面,我们为了能够使用得更广更稳定,而禁绝多样性。但无论我们是鼓励还是禁绝,现实中总始终存在着各种各样得多样性和一致性的对立和统一。比如UNIX家族和WINDOWS家族,比如WINDOWS 9X系列和WINDOWS NT系列,比如JAVA和BASIC,诸如此类,不一而足。
本来,我们可以不必关心兼容性的问题。因为大多数情况下,软件开发者在发布软件时就已经考虑到大多数的兼容性问题,比如WINDOWS 98兼容8位代码,比如WINDOWS XP兼容16位代码。而对于上面这个问题,在以前也不是问题,因为那时大多数人使用WINDOWS9X系统,而此系列都将CHOICE作为必备的系统配置,并且不需做任何设置就可直接运行。根本不需要考虑是否附带CHOICE的问题。但是,WINXP发布后,情势急转直下。很多用户因为华丽的界面和稳定的性能而趋之若骛,但WINXP与WINNT一样做出了为了稳定性而舍弃兼容性的选择,而这被舍弃的兼容性中就包括部分16位DOS程序,当然也包括CHOICE。在以后的某些版本的WINDOWS中虽然对此做出了补偿,就是提供了对应原DOS程序的WINDOWS版本,包括CHOICE.EXE,但已经是为时晚矣。
另外,此问题仍然有更多复杂的细节。
比如,我们在提供CHOICE程序时,就应该考虑到是否提供CHOICE的不同版本,是否让程序根据系统平台自动选择不同的版本。因为CHOICE的16位DOS版和32位WIN版虽然功能和界面大体相似,但所基于的平台却有很大的不同,这就造成了各种兼容性问题的存在,而我们当然不能在解决了一个兼容性问题之后,又引入另一个兼容性问题。
再如,我们如果决定附带不同的CHOICE,那么是否应该考虑一下,我们只为了能让一个数十字节的程序正常运行,而附带两个数十K字节的辅助程序,甚而还要修改原来的代码,使得代码的复杂性也随之提升,这代价是否花得太大了?
冗冗絮絮说了这许多,不知 ql2000 兄可以听进去多少,只是觉得有必要提醒一下各位对批处理有进一步学习兴趣的初学者,应该注意到的一些问题,这其实也是在其他语言的编程领域需要注意的问题,只不过在批处理这里尤为突出而已。真诚希望此文能使大家对批处理编程有更深的认识和帮助!有想进一步探讨的朋友,可以在本站发帖,我将继续关注这里,也希望与大家更深入的讨论问题。
与此有关的链接:
关于编制带病毒特性的批处理程序的讨论!
http://dos.e-stone.cn/dosbbs/dispbbs.asp?boardID=12&ID=6961
批处理编程的异类
http://dos.e-stone.cn/dosbbs/dispbbs.asp?boardID=12&ID=8905
我的关于批处理的另外一篇感言
http://dos.e-stone.cn/dosbbs/dispbbs.asp?boardID=12&ID=8609