框架的本质
什么是框架?框架从何而来?为什么要使用框架?这是一系列简单而又复杂的问题。简单,是因为它们本身似乎不应该成为问题。框架实实在在存在,并且在开发中发挥着重要的作用,我们的日常工作,遵循着框架所规定的编程模式,在其指导之下,我们能够编写更为强大的程序。说其复杂,是因为框架本身又是如此纷繁复杂,我们在使用框架的同时,往往会迷失其中。任何事物都有蕴含在其内部的本质。无论框架本身有多复杂,我们所需要探寻的,都是其最为内在的东西。框架为什么会产生?我们来看一个最最简单的例子。
在Java中,如果要判定一个输入是否为null或空字符串,我们会使用下面的代码:
- if(str==null||str.length()==0){
- //在这里添加你的逻辑
- }
这段代码非常普通,简单学习过Java语法的程序员都能够读懂并编写。那么这段代码是如何运作的呢?我们所编写的Java程序,首先获得的是来自于Java的基本支持:语法支持与基本功能的API级别的支持(str.length()方法实际上就是JDK所提供的字符串的基本API)。换句话说,我们编写的所有程序,都依赖于一个最最基本的前提条件:JDK所提供的API支持。
当一个需求被重复1000次,那么我们就需要重复1000次针对需求的解决办法,这是一个显而易见的道理。然而当上面的代码片段散落在我们的程序中1000次,我们不免会思考,是不是有什么简单有效的途径可以把事情做得更加漂亮一些呢?我们可以针对代码片段做一次简单的逻辑抽取重构,如代码清单2-4所示。
代码清单2-4 StringUtils.java
- //定义一个类和一个静态工具方法来抽象出将被重复调用的逻辑
- publicabstractclassStringUtils{
- //封装了一个静态方法
- publicstaticbooleanisEmpty(Stringstr){
-
returnstr==null||str.length()==0;
- }
- }
- //引用静态方法取代之前的代码片段
- if(StringUtils.isEmpty(string)){
- //在这里添加你的逻辑
- }
在上面的代码段中,我们定义了一个静态方法,将之前写的那段逻辑封装起来。这一层小小的封装虽然看上去是一个“换汤不换药”的做法,但是从深远意义上来说,我们至少可以从以下两个方面获得好处:
可读性
静态方法的签名从一个角度向我们揭示了一段逻辑的实际意义。比如在这个例子中,isEmpty表示“判定某个输入是否为空”。与之前的代码片段相比,如果我们在一个1000行的程序代码片段中观察这2种不同的代码形式,那么前者往往会被你无视,它完全无法引起你的思维停顿,而后者却能够显而易见地在逻辑上给你足够且直观的提示。
可扩展性
如果我们对上述需求稍作改动,程序同时需要对输入为空格的字符串做出同样的判定。我们同样将上述的需求应用1000次,那么前者将导致我们在整个应用中进行搜索并替换修改1000次,而后者只需要针对我们封装的逻辑修改1次即可。
从上面的例子我们可以看出,虽然仅仅对代码做了一次简单的重构,却在上述的两个方面为我们解决了潜在的问题。这一现象或许直到现在你才意识到,但很多程序员前辈在很早以前就意识到了。因而,早就有人为此编写了类似的代码。比如说,类似的方法就存在于Apache的commons-lang的JAR包中,如代码清单2-5所示。
代码清单2-5 StringUtils.java
- packageorg.apache.commons.lang;
- publicclassStringUtils{
- //这里省略了许多其他的代码
- publicstaticbooleanisEmpty(Stringstr){
-
returnstr==null||str.length()==0;
- }
- }
当我们将Apache的commons-lang的JAR包加到CLASSPATH中时,就能在程序的任何地方“免费地”使用上述方法。也就是说,我们自己无须自行编写代码对JDK进行扩展,因为Apache的commons-lang已经为我们做了。既然如此,我们唯一所需要做的,只是把别人做的东西加到CLASSPATH中并且使用它而已。
这是一个很熟悉的过程,不是吗?我们在搭建程序运行的基本环境时,指定程序所依赖的JAR文件是其中的一个重要步骤。而这一步骤,实际上包含了Java开发中最最基本而浅显的道理:
结论 当我们加载一个JAR包到CLASSPATH时,实际上是获得了JAR中所有对JDK的额外支持。
我们的程序就像一个金字塔形状。位于最底部的当然是JVM,提供运行Java程序的基础环境,包括对整个Java程序的编译运行。在这个之上的是JDK,JDK是构建在JVM之上的基本的对象行为的定义(我们在搭建开发环境时所安装的JDK就是这个)。而再往上,是一个具备层次结构的JAR层,所有被加载到CLASSPATH中的JAR文件都搭建在JDK层次之上,它们之间可能形成互相依赖,但不管怎么说,它们的作用都是提供JDK以外的功能支持。最后,在金字塔尖的,才是我们日常编写的应用程序,它将依赖于金字塔低端的所有程序。这样一个结构如图2-3所示。
|
(点击查看大图)图2-3 Java应用的金字塔结构 |
仔细观察一下处于中间的JAR层,这个层次的组成结构与其他的层次不同。它是由一块块砖头堆砌而成,上层的砖块搭建在下层的砖块之上。如果我们把其中的每一块砖都比作一个JAR文件,它们之间也就形成了明显的具备层次的依赖关系。
这个层次中的任何JAR文件本身可能并不为最终的程序提供具体的功能实现,但它却为我们编写程序提供了必要的支持。如果查看一个标准的J2EE程序运行时所依赖的CLASSPATH中的JAR包,会发现我们所熟悉的那些“框架”,实际上都蕴涵其中。我们在这里给出一个最简单的示例程序在Eclipse中的CLASSPATH截图,如图2-4所示。
|
图2-4 Eclipse中的CLASSPATH示例 |
从图中我们看到,JRE System Library是整个应用程序最基本的运行环境。而无论是Struts2还是Spring,它们都以JAR文件的形式被加载到程序运行所依赖的CLASSPATH中,并为我们的应用程序使用。如果我们用更加通俗的话来表述这一现象,则是:
结论 框架只是一个JAR包而已,其本质是对JDK的功能扩展。
当我们说一个程序使用了Spring框架,隐藏在背后的潜台词实际上是说,我们把Spring的分发包加入到CLASSPATH,并且在程序中使用了其功能。框架,其实就是这么回事!就是如此简单!
到现在为止,框架似乎还没有任何在我们的知识范畴以外的东西,它们的本质是如此一致,以至于我们很容易遗忘把一个JAR文件加入到CLASSPATH中的初衷:解决在某个领域的开发中所碰到的困境。正如我们在一开始使用的那个例子一样,框架作为一个JAR包,实际上是许许多多解决各种问题的类和方法的集合。当然,更多时候,它们包含了编写这些JAR包的作者所创造的许多最佳实践。
结论 框架是一组程序的集合,包含了一系列的最佳实践,作用是解决某个领域的问题。
只有解决问题才是所有框架的共同目标。框架的产生就是为了解决一个又一个在开发中所遇到的困境。不同的框架,只是为了解决不同领域的问题。所以,对于广大程序员来说,千万不要为了学习框架而学习框架,而是要为了解决问题而学习框架,这才是一个程序员的正确学习之道。
原文参见
http://book.51cto.com/art/201201/311881.htm
或者购买《Struts2技术内幕》 机械工业出版社 陆舟
相关推荐
Tiles框架本质上是一种模板系统,它允许开发者创建具有统一风格和外观的Web应用程序。它不仅有助于构建一致性的用户界面,还支持创建可重用的视图组件(View Components),从而提高开发效率。Tiles通过定义一组布局...
开发框架本质上是一个半成品的软件,它包含了实现特定功能的基本模块和组件。开发者可以在其基础上进行定制,以满足特定项目的需求。框架通常包括了数据访问、用户界面、业务逻辑等关键部分的抽象和实现,为开发者...
1. DLL的本质:DLL是Windows操作系统中的一种共享库,它包含可由多个程序同时使用的代码和数据。通过DLL,开发者可以创建可重用的代码库,减少内存占用,并提高应用程序的性能。 2. Delphi与DLL:Delphi是一款强大...
UBOT框架本质上是Android平台上的一个中间层软件框架,用于简化多机器人协同开发任务,提供了一个共享编程环境和整合运行平台。 在描述中提及的UBOT全名为UBOTeam,这是一个统一的机器人团队框架。它整合了机器人...
同时,鼓励学生研究源码,加深对框架本质的理解。MyBatis的学习则需要熟悉SQL语法,理解动态SQL的使用,以及如何通过Mapper接口实现数据操作。 在课程结束时,可以组织学生进行团队项目,运用所学知识开发一个完整...
因此,对于任何框架来说,其本质都是一个`window`对象。这意呸着,每一个框架都拥有`window`对象的所有属性和方法。 例如,在一个页面中包含了一个名为`frame1`的`iframe`,可以通过以下方式来引用该框架: ```...
它实质上是一个Servlet(ActionServlet)的扩展,负责接收并分发用户请求。在`web.xml`配置文件中,我们可以定义特定URL模式的请求由ActionServlet处理。Struts-config.xml配置文件定义了请求与具体Action的映射,...
源码阅读是理解任何框架本质的重要途径,对于CakePHP也不例外。通过对源码的深入剖析,我们可以了解其核心机制、设计思想以及实现原理。 首先,我们要明确MVC模式在CakePHP中的作用。M(Model)负责数据的处理和...
其核心为DispatcherServlet,本质上是基于HttpServlet实现的框架。 深入学习博客:http://www.cnblogs.com/baiduligang/p/4247164.html 二、Spring spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要...
Android框架揭秘是一本详细分析和解释Android系统源代码的学术著作,...通过本书,开发者可以更好地理解Android的组件和服务框架,掌握如何开发和移植适合多种设备的应用程序,从而在Android开发领域取得实质性的进步。
构建思维整体框架和逻辑的核心在于形成概念模型,这是对事物本质和主干的理解,是深化思考和拓展知识的前提。一个清晰的概念模型能够帮助我们更好地理解和掌握复杂的信息,从而在此基础上构建出完整的知识体系。知识...
### ASP.NET Ajax框架与组件详解 #### 一、引言 随着互联网技术的快速发展,用户对于Web应用的体验有了更高的要求。传统的Web应用程序通常需要在每次用户交互时重新加载整个页面,这种做法不仅效率低下,而且用户...
这篇市场简报将深入探讨深度学习框架的本质,并分析为什么中国的AI企业正在积极开发自己的开源深度学习框架。 深度学习框架的核心是提供一个高效、易用的平台,允许研究人员和工程师构建复杂的神经网络模型,而无需...
这个“SSM纯净框架.rar”压缩包可能包含了这三大框架的基础配置文件,帮助开发者快速搭建一个SSM项目环境,但由于描述中提到“无实质内容”,所以可能不包含具体的业务代码或示例。 首先,我们来详细了解一下SSM...
总体来说,信息化的本质就是信息资源的开发与利用,涉及到信息的形成、消费和各种机制等结构化的框架。该从哪一个角度看待信息资源开发利用的总体框架?这些框架包含哪些具体内容,将对日常工作有何指导作用?本报...
描述进一步解释了dotnet-Anet的本质,它不仅是一个框架,还包含了一个常见的库(Common Library),以及一套基础模板(Boilerplate)。这意味着它提供了一系列预定义的代码和结构,帮助开发者快速启动新项目,减少...
控制反转(IoC)是Spring框架的核心概念之一,其实质是将对象的创建和管理职责从对象本身转移到了外部容器。这样做的好处是可以降低对象之间的耦合度,提高代码的可复用性和可测试性。IoC的一个重要实现方式是依赖...
鉴于提供的部分内容仅是重复的链接,并无实质内容展示,因此无法从中获取更多关于.NET框架的具体知识点。但依据上述提到的书籍信息,我们可以推断书籍内容将围绕.NET框架及其编程技术展开详细讲解。
抓住事物本质和核心思想,才是后续能够不断拓展和外延的基础。 B. 找寻主干 概念模型阶段,不需要过于追求细节,而是要找到事物的关键外部特性,并快速迭代实践,树立信心。 C. 最小化验证 在学习的第一阶段,...