<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>冒号空间 &#187; 设计模式</title>
	<atom:link href="http://blog.zhenghui.org/tag/design-pattern/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zhenghui.org</link>
	<description>自然、人类、机器</description>
	<lastBuildDate>Fri, 16 Jul 2010 18:33:48 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>冒号课堂§4.3：汇总范式</title>
		<link>http://blog.zhenghui.org/2009/09/17/colon-class-4_3/</link>
		<comments>http://blog.zhenghui.org/2009/09/17/colon-class-4_3/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 01:33:15 +0000</pubDate>
		<dc:creator>hui</dc:creator>
				<category><![CDATA[冒号课堂]]></category>
		<category><![CDATA[编程范式]]></category>
		<category><![CDATA[编程语言]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://blog.zhenghui.org/?p=428</guid>
		<description><![CDATA[<b>汇总范式</b>——一张五味俱全的大烙饼（<em>总结编程范式</em>）<br/>
•	设计模式好比组合套路，能在一些特定场合下克敌制胜；编程范式则好比武功门派，博大精深且自成体系<br/>
•	一种编程范式之所以能独树一帜，关键在于它突破了原有的编程方式的某些限制，带来革命性的新思维和新方法，进一步解放了程序员的劳动力<br/>
•	因其长而容己，因其短而容他，此万物之理也<br/>
•	语言为形，范式为神。若能以神导形、以形传神，则看似平白无趣的程序也能写出诗画般的意境]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: center"><span style="font-family: 宋体">冒号课堂</span></h1>
<strong><span style="font-size: 13pt; font-family: 宋体">第四课 重温范式(3)</span></strong>

<!-- below comes from generated html -->
<head><link rel="stylesheet" href="http://blog.zhenghui.org/css/colonclass.css" type="text/css"></head>

<div lang="zh-CN" class="article" title="汇总范式"><div class="titlepage"><div><div><h1 class="title"><a name="id599705"></a>4.3 汇总范式——一张五味俱全的大烙饼</h1></div><div><div class="author"><h3 class="author">郑晖</h3></div></div><div><div class="abstract" title="摘要"><p class="title"><b>摘要</b></p><p>总结编程范式</p></div></div></div><hr /></div><div class="toc"><p><b>目录</b></p><dl><dt><span class="section"><a href="#preview">！预览</a></span></dt><dt><span class="section"><a href="#question">？提问</a></span></dt><dt><span class="section"><a href="#explaination">：讲解</a></span></dt><dt><span class="section"><a href="#note">，插语</a></span></dt><dt><span class="section"><a href="#summary">。总结</a></span></dt><dt><span class="section"><a href="#reference">“”参考</a></span></dt></dl></div><div class="epigraph"><div class="literallayout"><p>形者神之质，神者形之用 </p></div><div class="attribution"><span>—<span class="attribution">《范缜•神灭论》</span></span></div></div><div class="section" title="！预览"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="preview"></a>！预览</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
                    设计模式好比组合套路，能在一些特定场合下克敌制胜；编程范式则好比武功门派，博大精深且自成体系
                </p></li><li class="listitem"><p>
                    一种编程范式之所以能独树一帜，关键在于它突破了原有的编程方式的某些限制，带来革命性的新思维和新方法，进一步解放了程序员的劳动力
                </p></li><li class="listitem"><p>
                    因其长而容己，因其短而容他，此万物之理也
                </p></li><li class="listitem"><p> 语言为形，范式为神。若能以神导形、以形传神，则看似平白无趣的程序也能写出诗画般的意境                    
                </p></li></ul></div></div><div class="section" title="？提问"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="question"></a>？提问</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>编程范式与设计模式有什么区别？</p></li><li class="listitem"><p>编程范式的核心价值是什么？</p></li><li class="listitem"><p>
                    总结前面介绍的编程范式，它们各自有哪些代表语言？核心概念和运行机制是什么？针对的问题和主要的目的是什么？实现原理是什么？常见的应用有哪些？有什么不足之处？
                </p></li></ul></div></div><div class="section" title="：讲解"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="explaination"></a>：讲解</h2></div></div></div><p>
            稍事休整后，大家重新团结在以冒号为中心的周围。
        </p><p>
            问号再度发问：“编程范式与设计模式都是一种抽象的软件思想，都有一套具体的实现方法。单从字面上看，‘编程’与‘设计’、‘范式’与‘模式’的区别似乎也不太大。它们究竟有什么不同呢？”
        </p><p>
            “这个问题有点意思。”冒号颔言，“设计模式一般针对某一特定场景的问题，而编程范式针对的是广泛得多的问题领域，通常有一整套的思想和理论体系，具有全局性、系统性和渗透性，这一点在五大重要范式中显得尤为突出。因此，编程范式更普适更抽象，涉及的深度和广度也是设计模式难以比拟的。”
        </p><p>
            引号不免有些疑问：“但事件驱动式不是也能作为设计模式吗？”
        </p><p>
            冒号解疑：“这倒并不矛盾。同样的思想用在<span class="emphasis"><em>整体系统</em></span>的结构设计上，则称为架构模式；用在<span class="emphasis"><em>局部模块</em></span>的细节实现上，则称为设计模式<a class="link" href="#note1"><sup>[1]</sup></a>；用在引导编程实践上，则称为编程范式。”
        </p><p>
            句号的武侠瘾又犯了：“设计模式好比组合套路，能在一些特定场合下克敌制胜；编程范式则好比武功门派，博大精深且自成体系。”
        </p><p>
            “很形象的比喻。”冒号赞赏道，“设计模式是遵循<span class="emphasis"><em>设计原则</em></span>的一些具体技巧，以保证代码的可维护性、可扩展性和可重用性为目的。它重在设计，对编程语言一般没有要求<a class="link" href="#note2"><sup>[2]</sup></a>。编程范式则不同，对编程语言往往有专门的要求。通常所说的某某范式的语言，即指该语言对该范式在语法上有明确充分的支持，不需要借助其他的范式或工具。事实上，语言本来就是围绕其所倡导的核心范式来设计的<a class="link" href="#note3"><sup>[3]</sup></a>。”
        </p><p>
            逗号询问：“如果一种语言不支持某种范式，那么还能用这种范式编程吗？”
        </p><p>
            “语言不直接支持范式，只是说明它不属于该范式的语言，但还是可能求助工具来应用该范式。比如元编程可以借助Yacc或ANTLR来完成，AOP可以借助一些库或框架来实现。”冒号道，“正是依靠语言和工具的支持，编程范式得以建立起一套独特而完善的抽象机制和方法体系，从而为所倡导的世界观与方法论奠定基石。”
        </p><p>
            叹号请求：“能不能帮我们理清一下思路，把学过的范式一并汇总比较？”
        </p><p>
            不一会儿，众人面前呈现出一张表格，地毯似的覆盖了整个投影屏（如表4-1所示）——
        </p><div class="table"><a name="id571450"></a><p class="title"><b>表4-1. 常见的编程范式</b></p><div class="table-contents"><table summary="常见的编程范式" border="1"><colgroup><col><col><col><col></colgroup><thead><tr><th>编程范式</th><th>核心概念</th><th>关键突破</th><th>主要目的</th></tr><tr><th>代表语言</th><th>运行机制</th><th>实现原理</th><th>常见应用</th></tr></thead><tbody><tr><td>
                            命令式/过程式（Imperative/Procedural）
                        </td><td>
                            命令/过程（Command /Procedure）
                        </td><td>突破单一主程序和非结构化程序的限制</td><td>模拟机器思维，实现自顶向下的模块设计</td></tr><tr><td>Fortran/Pascal/C</td><td>命令执行</td><td>引入逻辑控制和子程序</td><td>交互式、事件驱动型系统；数值计算等</td></tr><tr><td>
                            函数式/应用式（Functional/Applicative）
                        </td><td>
                            函数（Function）
                        </td><td>突破机器思维的限制</td><td>模拟数学思维，简化代码，减少副作用</td></tr><tr><td>Scheme/Haskell</td><td>表达式计算</td><td>引入高阶函数，将函数作为数据处理</td><td>微积分计算；数学逻辑；博弈等</td></tr><tr><td>
                            逻辑式（Logic）
                        </td><td>
                            断言（Predicate）
                        </td><td>突破逻辑与控制粘合的限制</td><td>专注逻辑分析，减少控制代码</td></tr><tr><td>Prolog/Mercury</td><td>逻辑推理</td><td>利用推理引擎在已知的事实和规则的基础上进行逻辑推断</td><td>
                            机器证明；专家系统；自然语言处理；语义网（semantic web）；决策分析；业务规则管理等
                        </td></tr><tr><td>
                            对象式（Object-Oriented）                            
                        </td><td>
                            对象（Object）                            
                        </td><td>突破数据与代码分离的限制</td><td>迎合人类认知模式，提高软件的易用性、重用性和可维护性</td></tr><tr><td>Smalltalk/Java</td><td>对象间信息交换</td><td>引入封装、继承和多态机制</td><td>大型复杂交互式系统等</td></tr><tr><td>
                            并发式/并行式（Concurrent/Parallel）
                        </td><td>
                            进程/线程（Process/Thread）                            
                        </td><td>突破串行的限制</td><td>充分利用资源、提高运行效率、提高软件的响应能力、保证公平竞争</td></tr><tr><td>Erlang/Oz</td><td>进程/线程间通讯与同步</td><td>引入并行的线程模块以及模块间的通讯与同步机制</td><td>图形用户界面；I/O处理；多任务系统如操作系统、网络服务器等；实时系统；嵌入式系统；计算密集型系统如科学计算、人工智能等</td></tr><tr><td>
                            泛型式（Generic）
                        </td><td>
                            算法（Algorithm）                            
                        </td><td>突破静态类型语言的限制</td><td>提高算法的普适性</td></tr><tr><td>Ada/Eiffel/C++</td><td> 算法实例化（多发生于编译期）</td><td>利用模板推迟类型指定</td><td>普适性算法如排序、搜索等；集合类容器等</td></tr><tr><td>
                            元编程（Metaprogramming）                            
                        </td><td>
                            元程序（Metaprogram）                            
                        </td><td>突破语言的常规语法限制</td><td>减少手工编码，提升语言级别</td></tr><tr><td>Lisp/Ruby/JavaScript</td><td>动态生成代码或自动修改执行指令</td><td>利用代码生成或语言内建的反射（reflection）、动态等机制，将程序语言作为数据来处理</td><td>自动代码生成；定义结构化配置文件；IDE；编译器；解释器；人工智能；模型驱动架构（MDA）；领域特定语言（DSL）等</td></tr><tr><td>
                            切面式（Aspect-Oriented）                            
                        </td><td>
                            切面（Aspect）                            
                        </td><td>突破横切关注点无法模块化的限制</td><td>实现横切关注点分离</td></tr><tr><td>AspectJ/AspectC++</td><td>在接入点处执行建议</td><td>通过编织（weaving）将附加行为嵌入主体程序</td><td>日志输出；代码跟踪；性能监控；异常处理；安全检查；事务管理等</td></tr><tr><td>
                            事件驱动（Event-Driven）                            
                        </td><td>
                            事件（Event）                            
                        </td><td>突破顺序、同步的流程限制</td><td>调用者与被调用者在代码和时间上双重解耦</td></tr><tr><td>C#/VB.NET</td><td>监听器收到事件通知后做出响应</td><td>引入控制反转和异步机制</td><td>图形用户界面；网络应用；服务器；操作系统；IoC框架；异步输入；DOM等</td></tr></tbody></table></div></div><br class="table-break"><p>
            叹号怔了怔，好似被一张巨大的烙饼给噎住了。
        </p><p>
            冒号并不急于讲解，欲以静制动。
        </p><p>
            果然，逗号沉不住气了，问道：“在第一栏的编程范式及其代表语言中，为什么并发式的代表语言没有Java和C#，只有Erlang和Oz？”
        </p><p>
            “Java和C#虽然在语法和核心库中为并发编程提供了不少支持，但真正将并发范式融入基本设计理念的语言还得数Erlang、Oz这些较为冷门的语言。”冒号解释，“类似地，比起Java、JavaScript等语言来，C#和VB.NET在语言设计上对事件驱动式编程给予了更多的关注<a class="link" href="#note4"><sup>[4]</sup></a>，因而更具代表性。”
        </p><p>
            问号发现：“第三栏‘关键突破’的提法很特别啊。”
        </p><p>
            冒号轻捶桌面以示强调：“一种编程范式之所以能独树一帜，关键在于它突破了原有的编程方式的某些限制，带来革命性的新思维和新方法，进一步解放了程序员的劳动力。这便是范式的<span class="strong"><strong>核心价值</strong></span>所在。”
        </p><p>
            引号如获至宝：“这张表格浓缩了范式的精华，既是对此前知识的总结，也是对今后编程的指导，实在太有用了！”
        </p><p>
            句号显得更为冷静：“有其长必有其短。我们了解了每种范式的长处，是不是还应该了解它们各自的短处？”
        </p><p>
            冒号开始对各个范式逐一数落：“过程式编程的数据与代码脱节，不方便维护；函数式和逻辑式的开发效率一般比过程式高，但运行效率和语言表现力则有所不如；对象式编程用于数学计算、符号处理等对象特征淡薄的领域，在心理上缺乏认知基础，在运行效率上不如纯过程式，在开发效率上不如函数式；并发式编程增加了代码的复杂度，加重了程序员的负担；泛型式编程影响了代码的可读性，过度使用模块还可能造成代码膨胀（code bloat）<a class="link" href="#note5"><sup>[5]</sup></a>；元编程过于强大，运用不当会超出程序员的控制，宜谨慎使用；切面式编程减少了程序的可预测性和可控性，同时给代码的跟踪调试带来一定困难，还可能造成性能上的损失；事件驱动式编程虽然也能用于同步的流程应用，但毕竟机制更复杂，没有普通的流程式编程那么自然易懂。”
        </p><p>
            叹号看上去有点泄气：“您可真够绝的，先把这些编程范式一个个捧到天上，又几杆子它们一个个打下云端。”
        </p><p>
            “<span class="strong"><strong>因其长而容己，因其短而容他</strong></span>，此万物之理也。”冒号忽然惜言如金，一番之乎者也地予以回应。
        </p><p>
            句号借用了一句俗话：“不怕有缺点，就怕没特点。”
        </p><p>
            冒号本欲多言，却恐众人食多伤胃，遂作结案陈词：“尽管只是管中窥豹，相信大家多少见识了编程范式的魅力之处。它们各擅胜场，有风格之别而无高下之分。作文绘画讲究形神兼备，编程也不例外。<span class="strong"><strong>语言为形，范式为神</strong></span>。若能以神导形、以形传神，则看似平白无趣的程序也能写出诗画般的意境。”
        </p><p>
            一席话说得众人皆觉虽不能至，然心向往之。
        </p></div><div class="section" title="，插语"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="note"></a>，插语</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p><a name="note1"></a>
                    因此设计模式有时被称为微架构（microarchitecture）模式。
                </p></li><li class="listitem"><p><a name="note2"></a>
                    设计模式的应用范围主要集中于静态的OOP语言，但也不排斥动态的或非OOP的语言。
                </p></li><li class="listitem"><p><a name="note3"></a>
                    当然随着语言的演进，也可能支持新的范式。比如，C++、Java和C#一开始都不支持泛型编程，C#对函数范式的支持也是逐渐加大的。
                </p></li><li class="listitem"><p><a name="note4"></a>
                    C#和VB.NET专门为事件驱动式设计了event、delegate等关键字以及一些配套的便利机制。
                </p></li><li class="listitem"><p><a name="note5"></a>
                    这里的代码不是指程序员写的源代码，而是指编译器生成的代码。
                </p></li></ol></div></div><div class="section" title="。总结"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="summary"></a>。总结</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
                    相比设计模式，编程范式针对的问题领域更广泛，提出的思想和方法更普适、更抽象、更系统。此外，设计模式重在设计，对语言和工具的要求不高，而编程范式需要建立一套抽象机制和方法体系，离不开语言或工具的支持。
                </p></li><li class="listitem"><p>
                    编程范式的核心价值在于：突破原有的编程方式的某些限制，带来新思维和新方法，从而进一步解放程序员的劳动力。
                </p></li><li class="listitem"><p>
                    正文中编程范式的汇总表格既是对此前知识的总结，也是对今后编程的指导。
                </p></li><li class="listitem"><p>
                    既要了解编程范式的长处，也要了解它们的短处。
                </p></li><li class="listitem"><p>
                    编程范式为神，编程语言为形，应以神导形、以形传神。
                </p></li></ul></div></div><div class="section" title="“”参考"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="reference"></a>“”参考</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
                    Elena Bolshakova．PROGRAMMING PARADIGMS IN COMPUTER SCIENCE EDUCATION．International Journal &#8220;Information Theories &amp; Applications&#8221;，2005，Vol.12：285-290
                </p></li><li class="listitem"><p>
                    Amnon H. Eden，Rick Kazman．Architecture, design, implementation．Proceedings of the 25th International Conference on Software engineering，2003：149–159
                </p></li></ol></div></div></div><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zhenghui.org%2F2009%2F09%2F17%2Fcolon-class-4_3%2F&amp;linkname=%E5%86%92%E5%8F%B7%E8%AF%BE%E5%A0%82%C2%A74.3%EF%BC%9A%E6%B1%87%E6%80%BB%E8%8C%83%E5%BC%8F">分享/保存</a>]]></content:encoded>
			<wfw:commentRss>http://blog.zhenghui.org/2009/09/17/colon-class-4_3/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>冒号课堂§1.5：开发技术</title>
		<link>http://blog.zhenghui.org/2009/08/31/colon-class-1_5/</link>
		<comments>http://blog.zhenghui.org/2009/08/31/colon-class-1_5/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 02:58:29 +0000</pubDate>
		<dc:creator>hui</dc:creator>
				<category><![CDATA[冒号课堂]]></category>
		<category><![CDATA[工具包]]></category>
		<category><![CDATA[开发技术]]></category>
		<category><![CDATA[惯用法]]></category>
		<category><![CDATA[架构]]></category>
		<category><![CDATA[框架]]></category>
		<category><![CDATA[编程范式]]></category>
		<category><![CDATA[设计模式]]></category>

		<guid isPermaLink="false">http://blog.zhenghui.org/?p=308</guid>
		<description><![CDATA[<b>开发技术</b>——实用还是时髦？（<em>关于框架、设计模式、架构和编程范式等开发技术的讨论</em>）<br/>
•	任何概念和技术都不是孤立的，如果不能在纵向的时间和横向的联系中找准坐标，便似那群摸象的盲人，各执一端却又自以为是<br/>
•	库和工具包是为程序员带来自由的，框架是为程序员带来约束的<br/>
•	设计模式是软件的战术思想，架构是软件的战略决策<br/>
•	知识的学习有几种方式：一种靠记忆，一种靠练习，一种靠培养<br/>
•	学习编程范式能增强编程语言的语感]]></description>
			<content:encoded><![CDATA[<h1 style="text-align: center"><span style="font-family: 宋体">冒号课堂</span></h1>
<strong><span style="font-size: 13pt; font-family: 宋体">第一课 开班导言(5)</span></strong>

<!-- below comes from generated html -->
<head><link rel="stylesheet" href="http://blog.zhenghui.org/css/colonclass.css" type="text/css"></head>

<div lang="zh-CN" class="article" title="开发技术"><div class="titlepage"><div><div><h1 class="title"><a name="id627012"></a>1.5 开发技术——实用还是时髦？</h1></div><div><div class="author"><h3 class="author">郑晖</h3></div></div><div><div class="abstract" title="摘要"><p class="title"><b>摘要</b></p><p>关于框架、设计模式、架构和编程范式等开发技术的讨论</p></div></div></div><hr /></div><div class="toc"><p><b>目录</b></p><dl><dt><span class="section"><a href="#preview">！预览</a></span></dt><dt><span class="section"><a href="#question">？提问</a></span></dt><dt><span class="section"><a href="#explaination">：讲解</a></span></dt><dt><span class="section"><a href="#note">，插语</a></span></dt><dt><span class="section"><a href="#summary">。总结</a></span></dt><dt><span class="section"><a href="#reference">“”参考</a></span></dt></dl></div><div class="epigraph"><div class="literallayout"><p>借我借我一双慧眼吧，让我把这纷扰看得清清楚楚明明白白真真切切</p></div><div class="attribution"><span>—<span class="attribution">《雾里看花》</span></span></div></div><div class="section" title="！预览"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="preview"></a>！预览</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
                    任何概念和技术都不是孤立的，如果不能在纵向的时间和横向的联系中找准坐标，便似那群摸象的盲人，各执一端却又自以为是
                </p></li><li class="listitem"><p>
                    库和工具包是为程序员带来自由的，框架是为程序员带来约束的
                </p></li><li class="listitem"><p>
                    设计模式是软件的战术思想，架构是软件的战略决策
                </p></li><li class="listitem"><p>
                    知识的学习有几种方式：一种靠记忆，一种靠练习，一种靠培养
                </p></li><li class="listitem"><p>
                    学习编程范式能增强编程语言的语感
                </p></li></ul></div></div><div class="section" title="？提问"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="question"></a>？提问</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>库和工具包与框架有何不同？</p></li><li class="listitem"><p>什么是设计模式、惯用法和架构？</p></li><li class="listitem"><p>为什么要谈编程范式，而不是框架、设计模式或者架构？</p></li></ul></div></div><div class="section" title="：讲解"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="explaination"></a>：讲解</h2></div></div></div><p>
            “现在我们具体介绍一下编程范式。”冒号忽然顿住，隐觉一抹失望从众人脸上掠过，问号更是欲言又止，便鼓励他开口。
        </p><p>
            问号略显迟疑：“您说编程范式是一种心法，那框架、设计模式还有架构呢？”
        </p><p>
             “原来如此！”冒号心下了然，“让我说说你们最想听些什么吧。”
        </p><p>
            众现不信之色。
        </p><p>
            冒号说道：“一种是具体而实用的，最好能立马解决学习和工作中的问题；一种是时髦而花哨的，管它有用没用，不学点心里就是不踏实。”
        </p><p>
            众人虽觉此话有些尖刻，细想起来也有几分道理，但老冒明知而不为，不走群众路线，偏去扯什么劳什子的范式——当然，直接谈OOP倒是不错的。
        </p><p>
            “<span class="strong"><strong>自以为懂的未必真的懂，自以为不懂的未必真的不懂</strong></span>。” 冒号玩起了玄学，“有些概念和技术即使背得烂熟，甚至用得烂熟，那也不代表真正掌握；有些概念和技术看起来很新奇，却不过是新瓶装旧酒。”
        </p><p>
            叹号颇不服气：“用得烂熟都不算掌握，难不成只有发明概念和技术才算掌握？”
        </p><p>
            “哈哈，那倒不必。”冒号笑道，“用得烂熟不等于用得恰到好处，能解决问题不等于没有后顾之忧。”
        </p><p>
            逗号问道：“那掌握的标准是什么？”
        </p><p>
             “许多应聘者喜欢在简历中言必称精通某某语言、某某技术云云，大多不必面试即知其大言炎炎——倘若真的精通，他自当应聘更高的职位。”冒号有感而发却又似不着边际，“任何概念和技术都不是孤立的，如果不能在纵向的时间和横向的联系中找准坐标，便似那群摸象的盲人，各执一端却又自以为是。”
        </p><p>
            众人心想，老冒虽言辞旦旦却有凿空之嫌，一节课下来，天马行空的扯了不少，真刀真枪的一个也无，该不是只会纸上谈兵吧？
        </p><p>
            句号紧扣主题：“您为何选择谈编程范式，而不是框架、设计模式还有架构呢？难道它们真如您所说只是时髦而花哨的东西吗？”
        </p><p>
            “我可没这么说。”冒号矢口否认，“但在弄清一样东西存在的意义之前就随众跟风，早晚会跟丢的。我先问问你们：什么是<span class="term">框架</span>（framework）？它与一般的<span class="term">库</span>（library）和<span class="term">工具包</span>（toolkit）有何不同？”
        </p><p>
            引号应答：“框架就是一组协同工作的类，它们为特定类型的软件构筑了一个可重用的设计。与库和工具包不同之处在于前者侧重<span class="emphasis"><em>设计重用</em></span>而后两者侧重<span class="emphasis"><em>代码重用</em></span>。”
        </p><p>
            “嗯，有点标准答案的味道。”冒号夸道，“如果吹毛求疵的话，框架并不限于OOP，可以是协同工作的<span class="emphasis"><em>类</em></span>，也可以是协同工作的<span class="emphasis"><em>函数</em></span>。一个足够复杂的应用软件开发，为确保快速有效，通常采取的方式是：在<span class="emphasis"><em>宏观管理</em></span>上选取一些框架以控制整体的结构和流程；在<span class="emphasis"><em>微观实现</em></span>上利用库和工具包来解决具体的细节问题。框架的意义在于使<span class="emphasis"><em>设计者</em></span>在特定领域的整体设计上不必重新发明轮子；库和工具包的意义在于使<span class="emphasis"><em>开发者</em></span>摆脱底层编码，专注特定问题和业务逻辑。”
        </p><p>
            问号提出问题：“框架与库和工具包看起来很相似——都是一些代码集合，都提供一些API（应用编程接口），是什么使得它们不同呢？”
        </p><p>
            “问得好！”冒号赞言，“框架与工具包最大的差别在截然相反的设计理念上：<span class="strong"><strong>库和工具包是为程序员带来自由的，框架是为程序员带来约束的</strong></span>。具体地说，库和工具包是为程序员提供武器装备的，框架则利用<span class="emphasis"><em>控制反转</em></span>（IoC）<a class="link" href="#note1"><sup>[1]</sup></a>机制实现对各模块的统一调度从而剥夺了程序员对全局的掌控权，使他们成为手执编程武器、随时听候调遣的士兵。”
        </p><p>
            叹号苦着脸：“程序员原来就是一小卒子啊！”
        </p><p>
             “哪个将军不是从小卒做起的？”冒号反问道，“不错，框架是在语言的语法规则之外施加于程序员的又一层枷锁，但没有规矩不成方圆。正如行军打仗，讲究排兵布阵，程序员就是那兵，框架就是那阵。”
        </p><p>
            句号说：“可不可以这么理解，框架就是一些人——也就是框架设计者，把一个软件开发中最甜的部分啃掉了，剩下部分留给下面的人？”
        </p><p>
             “从某种意义上说，是这样。”冒号点点头。
        </p><p>
            逗号很不甘心：“我就想啃最甜的部分。”
        </p><p>
             “当心别把牙给崩掉。”冒号笑道，“不是打击你，首先你还没那本事；其次即使你有本事也未必有机会；最后即使有本事也有机会，重新设计框架也未必是好的选择。就说大名鼎鼎的Struts吧，哪怕你设计出比它更高明的框架也难以被采用，因为前者早已成为Java平台上网络开发的事实（de facto）标准，公司很容易从市场上招到懂Struts的程序员，不必培训即可上手，成本低见效快。过去许多公司都有自己的网络框架，但最后大多都放弃了，并不是因为Struts更优秀，而是因为它更普及。毕竟大多数软件开发是以金钱而不是技术为中心的。”
        </p><p>
            问号提议：“您能谈谈设计模式和架构吗？”
        </p><p>
            冒号侃侃而谈：“与框架与库和工具包不同，<span class="term">设计模式</span>（design pattern）和<span class="term">架构</span>（architecture）不是<span class="emphasis"><em>软件产品</em></span>，而是<span class="emphasis"><em>软件思想</em></span>。<span class="strong"><strong>设计模式是软件的战术思想，架构是软件的战略决策</strong></span>。设计模式是针对某些经常出现的问题而提出的行之有效的设计解决方案，它侧重<span class="emphasis"><em>思想重用</em></span>，因此比框架更抽象、更普适，但多限于局部解决方案，没有框架的整体性。与之相似的还有<span class="term">惯用法</span>（idiom），也是针对常发问题的解决方案，但偏重实现而非设计，与实现语言密切相关，是一种更底层更具体的编程技巧。至于架构，一般指一个软件系统的最高层次的整体结构和规划，一个架构可能包含多个框架，而一个框架可能包含多个设计模式。”
        </p><p>
            引号愈发疑惑：“这些不是都很重要吗？”
        </p><p>
            “当然都很重要。不过——”冒号话锋一转，“在没有打好基础前，架构只是空中楼阁，因此不可能现在谈它。至于框架，不同的应用领域有不同的框架，如表现层的Struts、业务层的Spring、持久层的Hibernate等等，即使相同领域的框架也有多个选择，更不用说不同的语言框架还不一样，从何谈起？再说框架其实一点也不高深，完全可以无师自通，关键是领会思想，多学习多实践。说到设计模式，一共就那么几十个，一本‘四人帮’（GoF）<a class="link" href="#note2"><sup>[2]</sup></a>的书足矣，自己慢慢去啃，又何须多谈？简言之，一个谈之过早，一个无从谈起，一个不必多谈。”
        </p><p>
            下面开始交头接耳窃窃私语起来。
        </p><p>
            “知识的学习有几种方式：一种靠<span class="emphasis"><em>记忆</em></span>，一种靠<span class="emphasis"><em>练习</em></span>，一种靠<span class="emphasis"><em>培养</em></span>。就拿英语学习来说吧，学单词，单靠记忆即可；学句型、语法，光记忆是不够的，需要勤加练习方可熟能生巧；而要讲出地道的英语，光记忆和练习是远远不够的。从小学到大学，甚至博士毕业，除了英语类专业的学生外，大多数人英语练了一二十年，水平如何？不客气但很客观地说：一个字，烂；两个字，很烂；三个字，相当烂！口语甚至连一个英语国家的三岁小孩都不如。”冒号越说越激动，“原因只有一个，那就是国内的英语教学方式严重失策。教学总是围绕单词、词组、句型、语法转，缺乏对<span class="strong"><strong>语感</strong></span>的重视和培养，导致学生只会‘中式英语’。同样道理，一个惯用C语言编程的人也许很快就能写一些C++程序，但如果他只注重C++的<span class="emphasis"><em>语法</em></span>而不注重培养OOP的<span class="emphasis"><em>语感</em></span>，那么写出的程序一定是‘C式C++’。与其如此，倒不如直接用C呢。”
        </p><p>
            句号悟道：“您是想告诉我们，<span class="strong"><strong>学习编程范式能增强编程语言的语感</strong></span>？”
        </p><p>
            “一语中的！”冒号庆幸总算没有白费口舌，“语感是一个人对语言的敏锐感知力，反映了他在语言方面的整体上的直觉把握能力。语感强者，能听弦外之音，能说双关之语，能读隽永之作，能写晓畅之文。这是一种综合的素质和修养，其重要性是不言而喻的。那么如何培养语感呢？普通的学习和训练固不可少，但如果忽视语言背后的文化背景和思维方式，终究只是缘木求鱼。编程范式正体现了编程的思维方式，因而是培养编程语言的语感的关键。现在如果我开始介绍范式，你们还有意见吗？”
        </p><p>
            众人受了鼓动，个个把头摇得跟拨浪鼓似的。
        </p><p>
            冒号语重心长地说：“既然范式关乎语感，就需要慢慢的培养和渗透，不可能一蹴而就，因此有些地方不太明白也没关系。现在只是撒下一些种子，慢慢的会生根发芽，直至长成大树。那些设计模式、框架甚至架构等等看似神秘高深的东西，都会自然而然地在这棵大树上结出果实。到那时，你们个顶个的都是内外兼修的武林高手了。怎么样？大家准备好了吗？”
        </p><p>
             “准备好了！”众人齐声道，求知的目光再度点燃。
        </p><p>
             “准备好了就下课吧。”冒号狡笑着，“下节课，下节课我们再谈。”
        </p></div><div class="section" title="，插语"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="note"></a>，插语</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p><a name="note1"></a>
                    控制反转（Inversion of Control）是一种软件设计原则。与通常的用户代码调用可重用的库（library）代码不同，IoC倒转了控制流方向：由库代码调用用户代码。有人将此比作好莱坞法则：“不要打电话给我们，我们会打给你的”。
                </p></li><li class="listitem"><p><a name="note2"></a>
                    设计模式最经典书籍《Design Patterns: Elements of Reusable Object-Oriented Software》的四位作者常被称为GoF或Gang of Four。
                </p></li></ol></div></div><div class="section" title="。总结"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="summary"></a>。总结</h2></div></div></div><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem"><p>
                    库和工具包侧重代码重用，框架侧重设计重用。库和工具包从微观上解决具体问题，是为程序员带来自由的；框架从宏观上控制软件整体的结构和流程，是为程序员带来约束的。框架是通过控制反转（IoC）机制反客为主的。
                </p></li><li class="listitem"><p>
                    设计模式是软件的战术思想，架构是软件的战略决策。与框架、库和工具包不同，它们不是软件产品，而是软件思想。
                </p></li><li class="listitem"><p>
                    设计模式与惯用法都是针对常发问题的解决方案，但前者偏重设计，后者偏重实现。
                </p></li><li class="listitem"><p>
                    架构太高，谈之过早；框架太多，无从谈起；设计模式太少，不必多谈。至于编程范式，对培养编程语言的语感至关重要，需要充分的重视和长期的积累，方能悟其精髓。
                </p></li></ul></div></div><div class="section" title="“”参考"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="reference"></a>“”参考</h2></div></div></div><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>
                    Erich Gamma，Richard Helm，Ralph Johnson，John Vlissides．Design Patterns: Elements of Reusable Object-Oriented Software．Boston, MA：Addison-Wesley，1994．26-28
                </p></li></ol></div></div></div>

<!-- below is edited manually -->
<strong><span style="font-family: 宋体">课后思考</span></strong>
<ul style="margin-top: 0cm; list-style-type: none">
    <li>01-01 作为一个软件开发者，你现在处于哪个阶段？你未来的目标是什么？</li>
    <li>01-02 传统的学习方式的弊端在哪里？你是否有切肤之痛？</li>
    <li>01-03 你认为一个优秀的程序员需要具备什么素质和精神？</li>
    <li>01-04 你了解哪些计算机语言？你对一门语言的取舍与喜恶的根据是什么？</li>
    <li>01-05 你认为计算机语言未来的发展方向是什么？</li>
    <li>01-06 你能否在编程中感受到自己的激情和灵性？</li>
    <li>01-07 你了解哪些框架？它们主要解决了哪些问题？应用范围是什么？实现的机理是什么？</li>
    <li>01-08 你了解哪些设计模式？它们为什么能成其为模式？</li>
    <li>01-09 你熟悉的语言中有哪些惯用法？</li>
    <li>01-10 你对编程范式是如何理解的？学习它的意义何在？</li>
</ul><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fblog.zhenghui.org%2F2009%2F08%2F31%2Fcolon-class-1_5%2F&amp;linkname=%E5%86%92%E5%8F%B7%E8%AF%BE%E5%A0%82%C2%A71.5%EF%BC%9A%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF">分享/保存</a>]]></content:encoded>
			<wfw:commentRss>http://blog.zhenghui.org/2009/08/31/colon-class-1_5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
