程序员不管学习什么,有条重要的途径都是看书。我在项目并用不上.NET时,只好先比看书起,陆陆续续开始看相关的书。国人写的<你必须知道的.NET>,老外写的
我计划写这篇笔记很久了,我的计划是首先谈为什么要有.NET,结果刚开始看<.NET本质论>时,就发现Don Box非常清楚和深刻地讲了这个问题。Don Box提到.NET Framework从根本上讲提供了两个核心的集成技术:CLR和XML Web Service,后者我不大了解,没有接触。对于CLR,他则指出,CLR is better COM.
就我个人的理解,.NET的出现,是给机器与程序员之间增加了一层抽象形。原来的层次是 机器->操作系统API->程序员。Windows的API这个集合极大,是不可能完全掌握的怪物,作为补救,微软推出了MFC啊,WinInet啊之类库,但是这些都只是一层薄薄的封装,谈不上抽象层。而.NET,则是插入操作系统API和程序员之间的一个巨大的抽象层。从概念到编程语言,都是全新的。
另一个来源的支柱就是COM,在.NET之前,COM是Windows平台上支柱型的编程模型。但是COM的问题和它的好处一样多。首先就是复杂,COM是一种二进制接口,基于C++的二进制模型,要求使用者至少得非常熟悉C++。即使如此,在学习COM的过程中,依然会有无数的障碍。Joe甚至认为,COM让微软失去了整整一代程序员。
再者,COM没有实现继承,虽然微软认为,COM强制接口与实现分离,且只提供接口继承,是为了程序员好,但是它又提供了包容与聚合两种所谓的对象复用的方法,结果
COM对象的生命期依赖于引用计数,而非真正的垃圾收集。我个人觉得引用计数总会给人一种资源管理就安全了的错误感觉,从而忽略了循环计数这种常见却难于发现的情况。而对于复杂一点的系统(如果还经常改变的话),想避免这个问题真的很难。
COM的套间,则是一个典型的提供策略非而机制的例子。STA吧,初看起来感觉是很好很强大,但是实际使用中,发现它简直是死锁之源(至少是假死)。
Don Box书中还提到了其它COM的弱点,比如tlb和IDL没有什么关系,COM不能定义依赖关系。其实,COM设计的时候,考虑的效率,而非易用,采取最小原则,需要最少的统一的 C++ 实现方式。这种方式,当时是必须的,现在看起来却不大合适。
总的来讲,CLR出现之前,的确是个洪荒年代,等我再看阵书,再接着谈感想。
没有评论:
发表评论