淮海工学院计算机工程学院外文翻译.docx
《淮海工学院计算机工程学院外文翻译.docx》由会员分享,可在线阅读,更多相关《淮海工学院计算机工程学院外文翻译.docx(28页珍藏版)》请在冰豆网上搜索。
淮海工学院计算机工程学院外文翻译
毕业设计(论文)外文资料翻译
学院:
zxxxx
专业班级:
xxxxxxxxxxxxxxxx
学生姓名:
xxxxxxx
学号:
xxxxxxxxxx
指导教师:
xxxxxxxxxx
外文出处:
ScienceofComputerProgramming
Doi:
10.1016/j.scico.2005.07.009
附件:
1.外文资料翻译译文;2.外文原文
指导教师评语:
签名:
年月日
基于经典问题讲授java的框架设计
抽象
所有的程序员应该明白软件系列的概念,知道软件构建的技巧。
本文认为经典的问题,如众所周知的算法和数据结构,都是很好的例子来研究使用的软件家族设计。
本文介绍的两个案例研究,可以用来向学生介绍在Java软件设计,软件家族使用的软件框架建设。
第一个是家族程序,使用众所周知的分而治之的算法策略。
第二个是对家族项目进行遍历二叉树。
关键词:
软件系列软件框架;热点;设计模式,分而治之;树的遍历
1、介绍
在一篇经典论文中[17]大卫·帕纳斯指出,“应用需求的变化,在硬件配置的变化,以及永远存在的机会改善程序意味着软件将不可避免地存在于许多版本“。
帕纳斯建议:
开发的一个项目应该接近整个家族的发展的相关程序。
他定义了一个程序家族的一套方案“其如此广泛的共同属性,是有利于研究的共同属性分析个别成员前的项目。
”如果程序员可以识别并利用这些“共同的方面和预测的可变性”[24],所得到的软件可以构建重用代码共用部位,启用方便适应为特定的情况下的可变部分。
[18]在2001年的一篇文章中,帕纳斯观察有“成长的学术兴趣和真正的产业成功的一些证据。
应用这样的想法,“尚未”大多数工业程序员似乎忽略了它在他们的急于生成代码“。
他警告说,[18],“如果你正在开发一个家族的项目,你必须自觉地这样做,否则你会招致不必要的长期成本“。
如果软件家族成为普遍的,未来工业的程序员(即学生)需要学习有效设计和建造。
这是一个计算科学和软件工程课程的重要挑战。
我们如何应对这一挑战,在大学课程吗?
软件家族被称为软件产品线。
软件产品线是“集合从一个普通的一套核心系统共享功能构建一个管理集的软件资产“[1]。
这些资产包括共享一个通用的软件架构。
产品的可重用软件组件和一组[10]。
软件产品线全力一般性难教,因为他们在大学课程的设置设计可能需要广泛的知识,应用领域和使用的特殊目的语言和工具[24]。
然而,软件家族的形式被称为软件框架更容易获得。
框架是基本上是一个可重复使用的骨架,软件产品线实现完全的面向对象的编程语言。
通用方面表示由一组抽象的和具体的“合作类相互密切合作,共同体现了可重复使用的解决方案“[2]中的问题应用程序域。
该框架可以进行定制,以一个特定的家庭成员“堵在”适当的子类支持的可变点。
框架学生更容易,因为技术建立在标准的面向对象学生在本科课程中讲授的概念。
我们怎么能向学生介绍软件框架的概念?
有的主张介绍计算科学,教学被纳入框架序列。
例如,他们可能被用来引进的泛化排序算法[15]提供了一个新的教学方法的标准入门资料结构材料[23]。
他们也可能提供有趣的编程实例练习以巩固面向对象编程的概念,并引入设计模式成介绍序列[13,14,16]。
有些教科书等使用标准的Java库集合,秋千,和输入/输出框架和案例研究,如绘画垫作为例子来说明的概念和技术[12]。
至少有四个层次的理解软件框架。
学生发展的需要。
首先,由于框架通常在一个面向对象的实现,语言如Java,学生必须了解适用的语言概念,包括继承,多态,封装和代表团。
第二,它们需要理解框架的概念和技术,充分使用框架构建自己的定制应用程序。
三,学生应该能够做详细框架的设计和实施,常见的和可变的方面是已知的。
第四,他们需要学习分析潜在的家庭,确定其可能的共同变量方面,评估替代的框架结构。
在教学的框架概念,教师必须制定适当的案例研究。
他们希望使用一些有趣的和现实的,但重点突出的例子和练习示出的框架技术。
然而,建立一个良好的框架,需要应用领域广泛的理解解决框架。
因为学生具有不同背景和经验,当然,它可能学生需要相当长的时间来足够了解应用程序域设计了一个框架。
本文认为各种经典问题,如标准的算法和数据结构,在引入框架是有用的时域上花一点时间的概念和编程技术的分析。
这种方法可能被用来在一个专门的课程软件系列[5,7]在先进的Java编程或软件设计课程的教学模块。
本文的第2和第3寻求解决的第二级和第三级的方面理解上面提到的教学观念,让学生可以使用现有的框架,使他们能够开发自己的框架分析点在家庭中的共性和可变性。
第2节介绍的技术框架的建设和使用的概念和技术。
第3节说明了这些使用案例研究的概念和技术,为家庭开发的框架分而治之算法,并运用它来开发快速排序的应用[6]。
案例研究假定学生有一个基本的了解面向对象使用Java编程和理解的概念,如继承,多态,代表团,递归和排序。
第4和第5节寻求解决方面的第四个层次的框架理解教授学生如何去分析潜在的家庭,并确定共同变量方面。
第4节介绍的技术,系统地概括应用程式发现的变化点。
第5节说明了这些概念利用二叉树遍历一个家庭的基础[11]。
这个家族的应用成员包括从标准中序遍历,后序,中序遍历到更复杂的计算进行遍历二叉树结构一个定制方式。
第6节讨论相关工作,第7节总结全文,并给出了几个观察大学课程中的技术使用。
2、框架建设与使用
在开始编程班学生被教导要集中在一个特定的问题。
写一个程序来解决这个问题。
这是适当的,因为学生开始特定的编程语言需要学习和掌握特定的,具体的编程技能。
然而,由于学生获得更多的经验,在编程时,他们应该教工作在更高的抽象水平。
导师需要学生的重点转移到技术构建软件系列。
在构建软件系列,它是重要的独立关注.我们必须分开从那些方面的所有家庭成员的共同方面的设计,热点子系统。
具体到一个家庭成员。
此外,我们必须分开,各种常见和变量方面相互独立,并考虑他们,一次一个。
我们使用冻结的条款当场表示一个共同的家庭和热点方面(或共享)表示变量方面,家庭的问题[22]。
一个软件框架是一个通用的应用程序,允许创建不同从一个家庭的具体应用[21]。
在一个可重复使用的,它是一个抽象的设计整个应用程序域。
在一个框架中,表示家庭冷冻斑点。
由一组抽象和具体的基类,在某些结构合作。
A型行为这是所有家庭成员的共同实施一个固定的,具体的模板在基类中的方法。
热点为代表的一组抽象的钩子方法。
一、模板方法调用一个钩子方法来调用一个函数,具体到一个家庭成员。
热点实现在一个框架内作为一个热点子系统。
热点子系统通常由一个抽象基类,该基类的具体子类,也许还有其他相关的类[22]。
钩子方法的抽象基类定义热点的替代实现的接口。
碱的子类类实现钩子方法,适当选择一个特定的热点。
图图1显示了一个UML类图的一个热点子系统。
有两个原则框架建设的统一和分离[8]。
统一的原则使用继承来实现热点子系统。
无论是相同的抽象基类中定义的模板方法和钩子方法。
钩子基类的子类中实现方法。
在图如图1所示,热点子系统由统一方法的抽象基类及其子类。
该分离的原则使用代表团实现热点子系统。
模板方法的实现钩方法定义在一个具体的上下文类;一个单独的抽象类,并在其子类中实现。
模板方法,从而委托工作实现钩子方法的子类的一个实例。
在图1热点子系统的分离方法包括在客户端(上下文)类和抽象基类及其子类。
一个框架是一个系统的设计与心中的一般性和重用;设计模式[9],这是行之有效的程序设计问题的解决方案在实践中通常会发生,是实现所需的知识的工具水平的一般性和重用。
两种设计模式,对应于两个框架建设原则,是有用的框架落实情况。
模板方法模式,使用统一的原则。
在使用这种模式,设计师应该“定义在操作中的算法的骨架,推迟一些步骤的一个子类“,允许程序员”重新定义算法中的步骤,而不改变算法的结构“[9]。
它抓住了在模板中的共性在基类中的方法,而封装差别,实现钩在子类中的方法,从而保证算法的基本结构仍相同的[8]。
策略模式使用分离的原则。
在使用这种模式时,一个设计师应该“定义一系列的算法,一个个封装起来,使他们可以互换的。
战略让算法的变化可独立使用的客户端“[9]。
它扩展了客户端类的行为,通过调用另一个类中的方法。
在混凝土中的方法被捕获(模板方法)的共同方面客户端;抽象策略类中声明的变量方面(钩子方法)其子类实现。
因此,可以改变客户端类的行为提供不同策略子类的实例。
建设的原则,在实践中两者之间的主要区别是什么?
至引入新的行为钩子方法,统一的原则要求程序员实现一个新的子类的基类定义的模板方法。
这种通过覆盖的延伸,往往需要详细了解的基类,但它是否则程序员相对简单地理解和贯彻。
该统一的原则,有效的,但僵化的执行结果。
要引进新的钩法行为的一个框架,使用分离原理,客户端代码需要从一个类实例化一个对象,有钩子方法所需的行为并将其提供给模板的方法的类,包含。
如果需要钩行为先前已经实施,那么程序员必须选择一个合适的实施从组件库。
如果需要挂钩的行为一直没实施,那么程序员必须实施一个适当的新类。
这个类有时更是难以实现比同等的统一解决方案,但其实现通常需要较少的知识类的内部细节包含模板的方法。
一个应用程序的一个框架,它使用的分离原则执行略低于效率比基于一个统一的框架,但分离可能使应用程序能够在运行时适应对象仅仅改变参考文献[8]。
在接下来的部分,我们来看一个简单的软件系列,并考虑根据每个这些设计原则的框架设计。
3、分而治之框架
为了说明一个框架的建设和使用,我们可以使用家庭的鸿沟而治之算法作为一个软件家族的一个例子。
分而治之通过递归地分割成一个或多个的子问题的技术解决了一个问题相同的类型,独立地求解每个子问题,然后合并子问题为原来的已知problem.Well的算法,使用该解决方案,以得到一种溶液技术包括快速排序,归并排序,折半查找。
由于这种算法策略可应用于一整套类型相似的问题,分而治之,除了功能解决(问题P)回报解决方案
{ifisSimple(p)
returnsimplySolve(p);
else
sp[]=decompose(p);
for(i=0;isol[i]=solve(sp[i]);
returncombine(sol);
}
图2分而治之的伪代码。
其算法有意义的影响,提供良好服务的目的审查软件人。
显示的伪代码分而治之技术一个问题p在图2,因为它可能会在本科算法教科书。
在这种伪代码片段,功能解决(),因为它代表一个模板方法在家庭中所有算法的实现是一样的。
然而,功能参量,IsSimple(),simplySolve(),decompose()和combine(),并结合()代表钩子方法因为实现不同的家庭成员之间的不同。
例如,simplySolve()函数的快速排序归并是相当不同的。
对于归并,结合()函数执行的主要工作,同时分解()很简单。
与此相反的持有快速排序和二进制搜索。
本节的其余部分的建设和使用说明的鸿沟征服框架。
首先,我们探讨如何构建一个框架,使用统一原则;然后我们应用这个框架来开发应用程序使用快速排序算法。
最后,我们来看看如何可以实现的框架使用分离的原则。
3.1、使用统一的框架构建
如果的统一原则和TemplateMethod的模式被用来构建鸿沟和征服的框架,那么模板方法解决()是定义具体的方法在抽象类中定义的四个钩子方法被推迟到一个具体的子类,其目的是实现特定的算法。
图3显示了设计一个鸿沟和征服表示作为一个统一的框架建模语言(UML)类图。
该系列包括三个成员:
快速排序,归并排序,二分。
Methodsolve()的方法是final方法基类DivConqTemplate。
之间共享的所有类。
钩子方法参量,IsSimple(),的simplySolve(),deompose(),和combine()抽象方法基类,他们是在每一个具体的子类中重写(快速排序,归并和二分)。
为了推广分而治之“的框架,我们引入两个辅助类型问题和解决方案。
问题是一个类型,它表示所要解决的问题该算法。
解决方案是一个类型代表的算法返回结果。
在Java中,这些类型定义使用标记接口(接口没有任何方法)图3。
模板方法分而治之。
抽象的公共类DivConqTemplate
abstractpublicclassDivConqTemplate
{publicfinalSolutionsolve(Problemp)
{Problem[]pp;
if(isSimple(p)){returnsimplySolve(p);}
else{pp=decompose(p);}
Solution[]ss=newSolution[pp.length];
for(inti=0;i{ss[i]=solve(pp[i]);}
returncombine(p,ss);
}
abstractprotectedbooleanisSimple(Problemp);
abstractprotectedSolutionsimplySolve(Problemp);
abstractprotectedProblem[]decompose(Problemp);
abstractprotectedSolutioncombine(Problemp,Solution[]ss);
}
Fig.4.Templatemethodframeworkimplementation.
asfollows:
publicinterfaceProblem{};
publicinterfaceSolution{};
图5,快速排序的问题和解决方案的实施。
和征服的DivConqTemplate类和问题框架,包括解决方案接口。
我们现在可以考虑使用这个框架构建的应用程序库中。
3.2构建应用程序的框架
在使用传统的程序或类库,一个客户端的程序是在控制的计算代码从文库“调用”.然而,框架通常表现控制反转。
该框架的代码是在控制计算,其模板方法“称之为”客户端提供的钩子方法。
本节说明了如何使用鸿沟和征服框架来构建一个快速排序的应用程序。
快速排序就是排序值序列。
由价值观和代号的顺序开始和结束元素段进行排序。
为了简化演示,我们限制其范围为整数阵列。
因此,它是足够的,以确定由阵列的开始的问题和期末指数的无序段。
同样,一个解决方案可以识别由阵列和指数排序的段的开始和结束的。
此之间的相似性问题和解决方案的描述,使我们能够使用相同的对象来形容既是问题和其相应的解决方案。
因此,我们引入了类QuickSortDesc定义如图所示所需的描述符对象。
5。
给定的基类的定义DivConqTemplate和辅助类QuickSortDesc的,我们可以实现混凝土快速排序的子类,如示于图。
6。
在这种情况下,研究教学模块使用,既框架(即抽象类)和框架应用程序(即,实施快速排序)可呈给学生,使他们能够分辨之间的合作与之间的关系类清楚。
然而,必须明确区分之间的框架和它的应用。
作为一个练习,学生可以分配的任务修改快速排序的应用程序来处理更多的一般类型的对象。
其他算法,如归并和二进制搜索也应分配作为练习。
大量的工作,每个钩子方法指南不同,从一个特定的算法。
在快速排序的实施,大部分的工作是做了decompose()方法中,实现了快速排序的分裂或旋转操作。
在归并,然而,越来越工作将combine()操作,因为它必须进行合并阶段
归并算法。
publicclassQuickSortextendsDivConqTemplate
{protectedbooleanisSimple(Problemp)
{return(((QuickSortDesc)p).getFirst()>=
((QuickSortDesc)p).getLast());
}
protectedSolutionsimplySolve(Problemp)
{return(Solution)p;}
protectedProblem[]decompose(Problemp)
{intfirst=((QuickSortDesc)p).getFirst();
intlast=((QuickSortDesc)p).getLast();
int[]a=((QuickSortDesc)p).getArr();
intx=a[first];//pivotvalue
intsp=first;
for(inti=first+1;i<=last;i++)
{if(a[i]swap(a,first,sp);
Problem[]ps=newQuickSortDesc[2];
ps[0]=newQuickSortDesc(a,first,sp-1);
ps[1]=newQuickSortDesc(a,sp+1,last);
returnps;
}
protectedSolutioncombine(Problemp,Solution[]ss)
{return(Solution)p;}
privatevoidswap(int[]a,intfirst,intlast)
{inttemp=a[first];
a[first]=a[last];
a[last]=temp;
}
}
Fig.6.Quicksortapplication.
图6。
快速排序的应用程序。
3.3构建了一个框架,使用分离作为替代上述设计,我们可以使用分离的原则和策略模式来实现分而治之框架。
这种方法的UML类图示于图。
7。
(混凝土)上下文中实现模板方法类DivConqContext,如图所示。
8。
从(抽象)的钩方法被定义战略类DivConqStrategy的,如示于图9。
上下文类代表钩方法调用的策略类,它内部存储的实例参考。
注意战略方法更加灵活的方法,它是比模板方法未能切换策略动态地使用setAlgorithm()方法的对象上下文类。
快速排序的战略为基础框架构建的应用程序我们需要实现一个子类就是抽象类DivConqStrategy相当类似的统一框架(在图6中示出)中使用的快速排序类。
分而治之系列算法是一个简单的例子,可以用来为了说明这两种方法的框架设计。
它由一组算法,学生应该知道。
因此,应用领域应该是很容易解释。
在相关的项目中,学生可以的框架和要求,构建图7。
战略图案分裂和征服框架。
publicfinalclassDivConqContext
{publicDivConqContext(DivConqStrategydc)
{this.dc=dc;}
publicSolutionsolve(Problemp)
{Problem[]pp;
if(dc.isSimple(p)){returndc.simplySolve(p);}
else{pp=dc.decompose(p);}
Solution[]ss=newSolution[pp.length];
for(inti=0;i{ss[i]=solve(pp[i]);}
returnbine(p,ss);
}
publicvoidsetAlgorithm(DivConqStrategydc)
{this.dc=dc;}
privateDivConqStrategydc;
}
图8。
abstractpublicclassDivConqStrategy
{abstractpublicbooleanisSimple(Problemp);
abstractpublicSolutionsimplySolve(Problemp);
abstractpublicProblem[]decompose(Problemp);
abstractpublicSolutioncombine(Problemp,Solution[]ss);
}
图9。
策略对象的抽象类的应用程序。
。
这是需要了解的框架的设计在一个水平足够使用它,而不需要学生发展自己的抽象框架。
然而,学生们也需要经验确定的热点和发展需要的框架抽象。
我们认为,那些概括在以下步骤
部分。
4.泛化发展框架
增量变化框架设计涉及设计,而不是发现它在一个单一的步骤。
通常情况下,这种演变是一个过程,在研究现有的设计为确定的的冷冻点和热点的家庭,家庭成员,和一般化程序结构,使冷冻斑点的代码重用,并使用不同的实现每一个热点。
这在一个非正式的,有机概括编纂方式可能由罗伯茨和约翰逊的模式演变的框架[19]或者它可以通过使用更系统的技术。
施密德的系统的推广方法是一种技术[22],旨在先验识别热点,并系统地构建了一个框架。
这种方法标识的框架建设[22]通过下列步骤进行:
•创建一个固定的应用模型,
热点分析和规范,
•热点高层次的设计,
•泛化改造。
施密德的做法,固定应用模式是一种面向对象的设计为家庭内的特定的应用程序。
一旦存在一个完整的模型,框架设计师分析模型和发现,并指定域热点。
该设计师开始通过询问它的应用程序的功能的特性应用程序中的域(即,冷冻点)和需要作出灵活的(即,热点)。
通过适当的设计模式的指导下[9],设计师然后替换一个固定的,一个抽象基类专业类的一个热点。
访问热点功能通过共同的接口的抽象类。
不过,由于设计的热点子系统使不同的具体的基类的子类,可以用来提供变体的行为。
[20]另一种系统化的方法是功能泛化。
施密德方法概括为应用程序的设计,功能类结构
泛化的做法概括原型应用程序的功能结构产生一个通用的应用[4]。
它引入的热点,抽象的设计更换或者更换更一般的抽象操作的具体操作具体的数据类型更抽象的类型。
这些抽象实体,成为“参数”的广义功能的。
也就是说,广义函数是高阶,具有显式或隐式的参数,这些参数本身的功能。
概括的各种后热点的应用程序,由此产生的广义函数用来产生一个在一个面向对象的语言如Java框架。
下一节中的案例研究说明的思维过程,设计师可使用的分析和设计了一个框架。
它使用一个非正式的技术动机施密德的系统概括和功能泛化。
图10。
二叉树使用Composite设计模式。
5。
二叉树遍历框架作为框架泛化的个案研究,考虑的又一经典问题,二进制树的遍历[11]。
本案例研究,寻求解决方面的第四层框架谅解第1节所述,学习分析潜在的软件家庭确定冷冻和热点,以及加强和扩大学生'用于构造框架的原理和技术的理解。
一个二进制树是一个分层结构是常见的教导在一个较低的电平本科数据结构课程在计算科学课程。
在这种情况下研究中,我们实施二叉树,二叉树的类层次结构,这是一个结构设计的综合设计模式[9],如图所示。
10。
综合模式“让客户对单个对象和复合对象清一色“[9]。
二叉树类模式基础类组件的作用实施,子类节点的综合作用,而子类无叶的作用。
根据[9],这保证了Singleton模式实现无正是一个实例存在。
图图11显示二叉树的类层次结构的Java代码。
遍历是一个系统的技术为“访问”中的所有节点的树。
使用一个普通的一个二叉树的遍历技术是序遍历。
这是一个深度优先遍历,也就是说,它访问一个节点的孩子