matlab 习题.docx
《matlab 习题.docx》由会员分享,可在线阅读,更多相关《matlab 习题.docx(37页珍藏版)》请在冰豆网上搜索。
matlab习题
这篇文章写的很棒(我是在一个小网站上无意找到的,时间是2001年),感慨之余很想知道原作者是谁,哪位大侠知道请告诉我
世上一直有一个神话:
设计可以并且应该独立于实现的细节,设计通常被看作是一个抽
象的概念而实现是一个代码的具体实例。
如果我们坚信"设计是一个富有创造性和目的性
的活动:
为某一个目标而精心制定的结构的概念,",一个结构如果不能够说明它的环境
,或者不能与环境协作,那么这个结构就不适合这一目标。
环境中包括目标平台--语言
、工具、库、中间件(middleware),等。
还有它的功能性和非功能性的单元。
我们会认为在不知道地形布局的时候设计房屋,或者在不清楚使用的道材料的时候
建造摩天大厦是不合理的事情。
我们将线程、分布这类概念看作为小的编码的细节的看
法无疑是在设计中导致浪费精力(时间和金钱)的导火索,最终我们发现的是理论与实
践的差距在实践中要比在理论中还大。
虽然在一些情况下一个高层次设计的某部分可以
在许多技术下保持不变,但是更多的情况是我们需要亲自来补足这个圆圈,允许(甚至
鼓励)细节和实际的信息来影响并告知系统的结构。
模式(Patterns)的作用就是获取这些结构上的信息。
它们可以描述--预见性的或回
顾性的--设计和设计的原理,讲述从问题到解决,说明环境,获取工作的动力以及应此
产生的结果。
这里,我将集中讲述两个模式--Command-QuerySeparation和CommandMe
thod--为一个类接口中的方法分配任务,考察他们如何互相作用并影响并发的、分布的
和有序的环境以及本地执行。
接口设计。
顾名思义,接口提供了不同系统之间或者系统不同组件之间的界定。
在
软件中,接口提供了一个屏障,从而从实现中分离了目标,从具体中分离了概念,从作
者中分离了用户。
在Java中,有许多接口的概念:
public部分为潜在的用户提供了类和
方法的接口,protected部分为它的子类(subclass)以及周围的包提供了一个接口;一
个包有一个公用的部分;反射(Reflection)是另外一种提供、使用对象方法接口的机
制。
约束及供给。
站在用户对作者的角度,一个接口建立并命名了一个目的模型的使用
方法。
类接口中的方法提供了一种特殊的使用方法。
是这些约束--编译时的类型系统,
运行是的异常机制及返回值--使得类作者的目的得以体现和加强。
在这方面最简单的例
子是对封装的意义的理解:
私有化可以保证类用户只可以通过类的公用方法接口来操作
信息和行为。
然而,对于封装来说,远不止数据私有那么简单。
在设计中,封装往往会涉及到自
我包含(self-containment)。
一个需要你知道如何调用一个方法(e.g."在一个线程的
环境中,在一个方法调用后调用另一个方法,你必须明确地同步对象")的类的封装就不
如将所有这些全部包含并隐藏的类(e.g."这个类是thread-safe的")好。
前一个设计存
在着设计的漏洞,它的许多限定条件是模糊的而不是经过加强的。
这就把责任推给了用
户而不是让类提供者做这些工作来完成类的设计,并且,这是不可避免的漏洞百出。
在这种情况下,供给(affordances)描述了使用的可行性和不可行性。
术语供给(affordances)指事物的被感知的真实的属性,首先,这些属性可以决定
事物的使用的可能方法。
一个椅子可以用来支撑其他东西,所以,可以坐人。
一个椅子
照样可以搬运(carried)。
玻璃可以透光,也可以被打碎……
供给提供了对事物操作的线索,板状物可以压、柄状物可以旋转,沟状物可以插入
东西。
球状物可以扔或者反弹。
当使用了供给的优势后,用户可以只通过看便确定该做
什么:
没有图、没有标签也没有说明。
复杂的事物可能会需要一些解释,但是简单的事
物不应该这样。
当简单的东西也需要用图片、标签来说明的时候,设计就是失败的。
类设计者的一个职责便是在接口中减小约束与供给之间的隔阂(gap),匹配目标以
及一定程度上的自由度,尽可能减小错误使用的可能。
对环境敏感的设计。
在空间或者时间上分离方法的执行--例如,线程,远程方法调
用,消息队列--能够对设计的正确性和效率产生意义深远的影响。
这种分离带来的结果
是不可忽视的:
并发引入了不确定性和环境选择的开销;分布引入了错误的和不断增加
的回程的调用开销。
这些是设计的问题,而不是修改bug那样简单。
无论是在何种情况下,结果都是将会阻碍所有权风格的程序设计(Property-Style
Programming)--当一个接口主要由set和get方法组成的时候,每个方法都相应的直接
指向私有区域。
这样的类的封装很差(意思是毫无遮掩)。
接口中的域访问器(Field
accessors)通常是不会提供信息的:
他们在对象的使用中不能通讯、简单化和抽象化,
这通常会导致冗长并易出现错误的代码。
所有权风格的程序设计在短时间内不是一个大
的活动。
分布和并行通过引入了正确性和严重的性能开销放大了这些格式上实践的问题
。
透明度和bug灾难。
抽象允许我们在必要的时候可以忽略细节,所以我们的设计思想
可以平衡环境的因素而不是受制于它们。
决定什么样的细节可以忽略便成为一个挑战。
问题的严重性在重要的细节别忽略的情况下上升了。
设计往往会尽量使环境因素尽可能的透明。
透明能够成为一个诱人的主意:
也许它可以
让线程和远程对象通讯完全透明,这样用户在进行对象通讯的时候什么也不会觉察到。
Proxy模式支持一定程度上的透明度。
这加强了RMI和COBRA的基础。
本地的代理的对象和
使用远程的对象在使用中具有相同的接口,并且编组上的细节允许调用着使用熟悉的方
法来调用模型。
然而,这种分布透明并不完全:
失误和潜在的影响,不能被完全隐藏并
且需要考虑。
毕竟透明不是毛巾。
Command-QuerySeparation
保证一个方法是不命令(Command)就是查询(Query)
问题。
方法,当它们返回一个值来回应一个问题的时候,具有查询的性质,当它们
采取强制行动来的改变对象的状态的时候,具有命令的属性。
所以一个方法可以是纯的
Command模式或者是纯的Query模式,或者是这两者的混合体。
例如,在java.util.Iterator中,hasNext可以被看作一种查询,remove是一种命令,n
ext和awkward合并了命令和查询:
publicinterfaceIterator
{
booleanhasNext();
Objectnext();
voidremove();
}
如果不将一个Iterator对象的当前值向前到下一个的话,就不能够查询一个Iterator对
象。
这导致了一个初始化(initialization)、增加(continuation)、访问(access)和
前进(advance)分离而清晰定义的循环结构的错位:
for(initialization;continuationcondition;advance)
{
...accessforuse...
}
将Command和Query功能合并入一个方法的的结果是降低了清晰性。
这可能阻碍基于断言
的程序设计并且需要一个变量来保存查询结果:
for(Iteratoriterator=collection.iterator();
iterator.hasNext();)
{
Objectcurrent=iterator.next();
...usecurrent...
...againusecurrent...
}
解决方案。
保证方法的行为严格的是命令或者是查询,这样可以返回值的方法是纯的函
数而没有复效应(sideeffects),有负效应的方法不可能有返回值。
"另一个表述这点
的方法是问一个问题而不影响到答案。
"
CombinedMethod
组合方法经常一起被使用在线程和分布环境中来保证正确性并改善效率。
问题。
一些主要提供密集的方法的接口,起初,看来是最小化和附着性强的--都是
吸引人的特点。
然而,在使用的过程中,一些接口显现得过于原始。
它们过于简单化,
从而迫使类用户用更多的工作来实现普通的的任并操纵方法之间的依赖性(暂时耦合)
。
这是非常麻烦并且容易出错的,导致了代码重复--代码中应当避免的--并且为bug提供
了很好的滋生条件。
一些需要同时执行成功的方法,在执行的时候在多线程、异常、和分布的地方遇到
了麻烦。
如果两个动作需要同时执行,它们必须遵守协作或反转(commit-or-rollback
)语义学--它们必须都完全成功的执行或者一个动作的失败会反转另一个动作的执行--
它们由两个独立的方法进行描述。
线程的引入使不确定程度大大增加。
一系列方法调用一个易变的(mutable)对象并不
会确保结果是料想中的,如果这个对象在线程之间共享,即使我们假设单独的方法是线
程安全的。
看下面的对EventSource的接口,它允许安置句柄和对事件的查询:
interfaceEventSource
{
HandlergetHandler(Eventevent);
voidinstallHandler(Eventevent,HandlernewHandler);
...
}
线程之间的交叉调用可能会引起意想不到的结果。
假设source域引用一个线程共享的对
象,很可能在1、2之间对象被另一个线程安装了一个句柄:
classEventSourceExample
{
...
publicvoidexample(Eventevent,HandlernewHandler)
{
oldHandler=eventSource.getHandler(event);//1
eventSource.installHandler(event,newHandler);//2
}
privateEventSourceeventSource;
privateHandleroldHandler;
}
同样的,这次也是类使用者而不是类设计者来关注这些,制定约束:
classEventSourceExample
{
...
publicvoidexample(Eventevent,HandlernewHandler)
{
synchronized(eventSource)
{
oldHandler=eventSource.getHandler(event);
eventSource.installHandler(event,newHandler);
}
}
privateEventSourceeventSource;
privateHandleroldHandler;
}
如果目标对象是远程的,回程增加的开销和对方法调用失败并发的交织在一起成为
环境的一部分。
在上一个例子中,我们可以假设执行每一个方法体的时间和通讯的延迟
相比是很短的。
在这个例子中,开销被重复了两次,并可能在其他的实例中重复多次。
此外还有一个问题是对外部(extern)的synchronized同步块的使用需求。
Synchr
onized块很明显在分布的环境中使用但是也可以在本地的线程环境中应用的很好:
在调
用者和目标之间的代理对象的使用。
简而言之,对synchronized块的使用因为代理对象
而不是目标对象的同步而失败。
保守的说法是,这对系统的真确性可以有一个基本的影
响。
因为代理使用是在接口后透明的,调用者不能对行为做太多的保证。
解决方案。
CombinedMethod必须在分布,线程环境中同时执行。
联合应当反映出普
通的使用方法。
这样,一个CombinedMethod才可能比原有的方法要清晰,因为它反映了
直接的应用。
恢复策略和一些笨拙的方法被封装到CombinedMethod中,并简化了类用户
角度的接口。
这改善的封装降低了接口中不需要的累赘。
CombinedMethod的全部效果是
支持一种更像事务处理风格的设计。
在一个联合的Command-Query中提供一个单独的Query方法通常是合理的。
然而,这
需要按照需要而制定,而不是强制的执行。
提供分离的Command方法是不太常见的,因为
CombinedMethod可以完成这一工作:
调用者简单的忽略结果。
如果返回一个结果招致一
个开销的话,才可能会体统一个单独的Command方法。
回到前一个例子中,如果installHandlermethod返回上一个句柄设计变得更加简单和独
立:
classEventSourceExample
{
...
publicvoidexample(Eventevent,HandlernewHandler)
{
oldHandler=eventSource.installHandler(event,newHandler);
}
privateEventSourceeventSource;
privateHandleroldHandler;
}
调用者提供了一个更加安全接口,并且不再需要解决线程的问题。
这降低了风险和
代码的大小,将类设计的职责全部给了类设计者而不是推给用户。
代理对象的出现没有
影响到正确性。
一个CombinedMethod可以是许多Query的集合,许多Command的集合,或者两者兼有
。
这样,它可能补充或者抵触Command-Query分离的方法。
当冲突发生的时候,优先选择
CombinedMethod会产生一个不同的正确性和适用性。
在另一个例子中,考虑获得资源的情况。
假设,在下面的接口中,获得的方法在资源可
用前一直起到阻碍作用:
interfaceResource
{
booleanisAcquired();
voidacquire();
voidrelease();
...
}
类似于下面的代码会在一个线程系统中推荐使用:
classResourceExample
{
...
publicvoidexample()
{
booleanacquired=true;
synchronized(resource)
{
if(!
resource.isAcquired())
resource.acquire();
else
acquired=false;
}
if(!
acquired)
...
}
privateResourceresource;
}
然而,即使放弃可读性和易用性,这样的设计不是一个Command-Query分离设计的应用。
如果引入了代理,它就会失败:
classActualResourceimplementsResource{...}
classResourceProxyimplementsResource{...}
一个CombinedMethod解决了这个问题,它使并发和间接性更加透明。
interfaceResource
{
...
booleantryAcquire();
...
}
下面的代码清晰、简单并且正确:
classResourceExample
{
...
publicvoidexample()
{
if(!
resource.tryAcquire())
...
}
privateResourceresource;
}
CombinedMethod带来的一个结果是使一些测试和基于断言的程序设计变得十分笨拙
。
然而,和原来的设计相比较,原有的方法在解决线程和分布问题上不是一个合适的途
径。
在这一情况下,单元测试提供较好的分级和分离。
CombinedMethod能够使一个方法
接口模糊并使类用户的代码更加冗长,笨拙。
在一些条件下ExecuteAroundMethod提供
了一个可以保证自动和灵活的另一个CombinedMethod。
结论
环境决定实践的方法。
XX首页|登录
新闻网页贴吧知道MP3图片视频百科文库
窗体顶端
窗体底端
帮助设置
首页
自然
文化
地理
历史
生活
社会
艺术
人物
经济
科技
体育
核心用户
五周年
NBA
拆分词条
java开源
百科名片
开源不是开放编译器的源代码.通俗点说,就是你写了一个软件,然后把这个软件的源代码发布到网上,让大家都可以学习,改进.就是开源。
专业点说,就是要符合一定的规范,比如GPL等.在codeproject等你可以找到很多这样的开源软件.
目录
java开源——框架篇
java开源——门户篇
java开源——插件篇
java开源——组件篇
java开源——未分类开源项目
java开源——工具篇
java开源——系统篇
java开源——其它篇
编辑本段java开源——框架篇
SpringFramework【Java开源J2EE框架】
Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。
Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。
Spring的架构基础是基于使用JavaBean属性的InversionofControl容器。
然而,这仅仅是完整图景中的一部分:
Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。
Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。
Spring的数据访问架构还集成了Hibernate和其他O/Rmapping解决方案。
Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。
Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务--如果你需要--还能实现你自己的aspects。
这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。
Spring还提供了可以和IoC容器集成的强大而灵活的MVCWeb框架。
【SpringIDE:
Eclipse平台下一个辅助开发插件】.
WebWork【Java开源Web框架】
WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EEWeb框架。
WebWork目前最新版本是2.1,现在的WebWork2.x前身是RickardOberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目。
Xwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。
Xwork提供了很多核心功能:
前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL–theObjectGraphNotationLanguage),IoC(InversionofControl倒置控制)容器等。
WebWork2建立在Xwork之上,处理HTTP的响应和请求。
WebWork2使用ServletDispatcher将HTTP请求的变成Action(业务层Action类),session(会话)application(应用程序)范围的映射,request请求参数映射。
WebWork2支持多视图表示,视图部分可以使用JSP,Velocity,FreeMarker,JasperReports,XML等。
在WebWork2.2中添加了对AJAX的支持,这支持是构建在DWR与Dojo这两个框架的基础之上.【EclipseWork:
用于WebWork辅助开发的一个Eclipse插件】
ApusicJSF【Java开源Web框架】
ApusicJSF-基于Ajax技术的JSF开源引擎。
通过ApusicJSF的Ajax特性,我们能够只把发生变化的数据打包成Ajax请求发送给服务器端,而服务器端也只会将发生变化的数据打包成Ajax应答,从而大大提升系统的运行效率。
并且,传统的JSF请求应答将刷新整个页面,而ApusicJSF将只更新发生变化的客户端组件,从而给客户带来更好的人机体验......
Struts【Java开源Web框架】
Struts是一个基于SunJ2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。
由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。
Struts把Servlet、JSP、自定义标签和信息资源(messageresources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。
【StrutsIDE:
用于Struts辅助开发的一个Eclipse插件】
Strecks【Java开源Web框架】
针对Java5.0开发人员设计,扩展自Struts的一个Web框架。
它的特点包括:
POJOaction,注释式校验,数据绑定和转换,依赖注入,拦截器等。
jxyz【Java开源Web框架】
pojo的mvc框架,使用java注解,使用ognl传输上下文,使用hivemind做ioc容器,使用spring简化hibernate操作,使用泛型来减少重复代码。
有以下几个特点。
1.Pojo。
任何一个java类都可以做Action(logic),为了改造现在常用的ssh,tsh,wsh框架成sh,支持springbean做Action(logic)
2.0配置,根据命名规范来查找Action类和view
3.和web环境松耦合,从理论上讲可以用在swing里
4.支持tdd开发,框架本身就是以tdd开发方式开发
5.代码少,一般mvc需要5个类,xyz只要3个,还可以通过GenericDAO,GenericLogic来减少重复代码
6.对开发者来说,一切实现都可以自己定制,由于hivemind支持迭代开
Hibernate【Java开源持久层框架】
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java