首页新闻招聘找找看知识库
  • 回复:2 浏览:2321 2009-02-18 14:11 来自 任力

      当你面对一个需要解决的问题时(坦白地说,谁没面对过呢?),我们搞计算机的人通常采用的基本策略就是“分而治之”(divide and conquer)。它的基本过程是这样的:
        *    将待解决问题概念化,使之分成一系列更小的子问题;
        *    解决每一个子问题;
        *    将结果组合起来,使之成为原问题的解决方案。

      将复杂的问题逐步分解,一直分解到只需操作几十亿比特的状态值,这是我们每天都在做的事情。但是,“分而治之”并非唯一可行的策略。我们还可以采取更加泛化的方法。
        *    将待解决的问题概念化,使之成为某个更一般的问题的特例;
        *    采用某种方式来解决那个更一般的问题;
        *    将一般问题的解决方案做适当调整,以解决这个特殊问题。

      对喜欢泛化方法的人来说,设计模式是他们的主要工具。如果你能从大量的、不同领域的软件解决方案中挑出一些例子进行比较,你就会发现,尽管涉及的业务细节千差万别,它们却往往有着相似的基础结构(从某种意义上,以下两种行为的结构是类似的:1、在文件系统中查找拥有特定属性的文件,2、从分析树上查找特定类型的符号)。设计模式就是从这些一般问题的通用解法中整理出来的。

      将泛化方法运用到极致的例子莫过于编程语言本身的设计与实现。就解决问题的工具而言,很难找到比C#语言更通用的了。当设计新的编程语言(或者旧编程语言的新版本)时,我们会考虑开发者们每天都要面对的一般问题,并确定如何创建出一种新的语言,能够以通用、优雅、强大的方式来解决它们,并且提供广泛的可用性。

      我们想把那些最有用、是强大的抽象机制深深植入到语言的基础设施中,使你的意识里甚至忘记了这些抽象的存在。诸如“局部变量”、“过程调用”和“while循环”这样的模式已经成为我们所呼吸的空气的一部分,以致于我们现在都不觉得它们是模式了。

      进一步,我们想使那些有用,但并不那么基础的模式,在我们的语言中也能以相对直接的方式来实现,并且不失清晰和优雅。C#中的类可被标记为“static”,“abstract”或“sealed”,但不可以标记为“singleton”。这是语言设计者们的有意安排。尽管如此,用C#实现一个单例模式还是相对容易的。

      在“必要基础”和“偶尔有用”之间的灰色区域就是考验设计的有趣地带了。我们观察了实际开发者在C#(及其它语言中)对设计模式的使用,而这有力的驱动了我们新版本语言的设计过程。

      考虑这样一个例子:在C# 1.0中你怎样在链表上实现迭代器(Iterator)模式。你可能会定义一个枚举器类型来表示一个链表中的位置,这个链表类中包含大量令人厌烦的、影响可读性的样板代码,这样一个方案的可复用性并不怎么好。“枚举集合中的东西”,这种观念在大量的问题中都非常适用,所以有必要把它包含进语言中,成为语言概念中的一等公民。在C#2.0中,通过使用yield return语句,所有那些烦冗的代码都可以由编译器帮你产生出来,而泛型则为集合元素的迭代提供了类型安全性,不管集合中的“东西”到底是什么。

      所有这些长篇大论都解释了为什么我对C# 3.0的语言级集成查询(Language Integrated Query,LINQ)感到如此激动的原因。我们相信,迭代集合中的东西是一个意义重大的开端,但我们还可以做更多。数据的排序、过滤、分组、连接、投影和转换也都是很多领域中的基本操作。不管你是在实现一个射线追踪器、编译器、XML阅读器、抑或在线银行安全系统,你都可能通过多种方式操纵元素的集合。

      将这些概念从领域特定的对象模型中提取出来并融入到通用的编程语言中,我们就有希望解决更一般的问题。然而,我们更希望通过C# 1.0,2.0中已有的丰富特性,再加上C# 3.0中的查询表达式、lambda表达式、扩展方法、初始化表达式、表达式树等,我们便可以更加轻松地实现出其它各种有用的设计模式,而且不失优雅。

      而这也是我为这本书而感到激动的原因。《C# 3.0设计模式》为那些充满奥秘的设计模式提供了实效性的C# 3.0实现。我非常希望了解开发者能在何种场合利用好这些工具和这门语言,以及哪种有用的模式可能融入到将来语言的基础设施中。

    ——C#编译器开发组资深开发者Eric Lippert 2007年11月30日于华盛顿州西雅图市。

    图书专题:C# 3.0设计模式

  • 包建强
    2009-02-18 14:41 包建强
    这是本好书,我在书店翻过。
    第1楼 回到顶楼
  • 麒麟.NET
    2009-02-18 17:10 麒麟.NET
    这是本好书,我正在读。
    第2楼 回到顶楼
登录后才能评论,请先登录注册