JAVA编程:深切浅出基于Java的注释器计划形式
最后就是我对java的几点希望:首先是IDE工具,有人说java已经很好了,有jbuilder,eclipse,netBeans等等,但是我认为如果java想超越.net,那么他首先要解决的就是IDE工具的整合。计划1、引子实在没有甚么好的例子引进注释器形式,由于它形貌了怎样组成一个复杂的言语注释器,次要使用在利用面向对象言语开辟编译器中;在实践使用中,我们大概很少碰着往机关一个言语的文法的情形。
固然你几近用不到这个形式,可是看一看仍是能遭到必定的启示的。
2、界说与布局
注释器形式的界说以下:界说言语的文法,而且创建一个注释器来注释该言语中的句子。它属于类的举动形式。这里的言语意义是利用划定格局和语法的代码。
在GOF的书中指出:假如一种特定范例的成绩产生的频次充足高,那末大概就值得将该成绩的各个实例表述为一个复杂言语中的句子。如许就能够构建一个注释器,该注释器经由过程注释这些句子来办理该成绩。并且当文法复杂、效力不是关头成绩的时分效果最好。
这也就是注释器形式使用的情况了。
让我们来看看奥秘的注释器形式是由甚么来构成的吧。
1)笼统表达式脚色:声明一个笼统的注释操纵,这个接口为一切详细表达式脚色(笼统语法树中的节点)都要完成的。
甚么叫做笼统语法树呢?《java与形式》中给的注释为:笼统语法树的每个节点都代表一个语句,而在每一个节点上都能够实行注释办法。这个注释办法的实行就代表这个语句被注释。因为每个语句都代表这个语句被注释。因为每个语句都代表一个罕见的成绩的实例,因而每个节点上的注释操纵都代表对一个成绩实例的解答。
2)闭幕符表达式脚色:详细表达式。
a)完成与文法中的闭幕符相干联的注释操纵
b)并且句子中的每一个闭幕符必要该类的一个实例与之对应
3)非闭幕符表达式脚色:详细表达式。
a)文法中的每条划定规矩R::=R1R2…Rn都必要一个非闭幕符表带式脚色
b)关于从R1到Rn的每一个标记都保护一个笼统表达式脚色的实例变量
c)完成注释操纵,注释一样平常要递回地挪用暗示从R1到Rn的那些对象的注释操纵
4)高低文(情况)脚色:包括注释器以外的一些全局信息。
5)客户脚色:
a)构建(大概被给定)暗示该文法界说的言语中的一个特定的句子的笼统语法树
b)挪用注释操纵
放上张注释器布局类图吧,这也是来自于GOF的书中。
对每个脚色都给出了具体的职责,并且在类图中给出五个脚色之间的干系。如许完成起来也不是很坚苦了,上面举了一个复杂的例子,但愿能加深你对注释器形式的了解。
3、举例
来举一个加减乘除的例子吧,完成思绪来自于《java与形式》中的例子。每一个脚色的功效依照下面提到的标准来完成。
//高低文(情况)脚色,利用HashMap来存储变量对应的数值
classContext
{
privateMapvalueMap=newHashMap();
publicvoidaddValue(Variablex,inty)
{
Integeryi=newInteger(y);
valueMap.put(x,yi);
}
publicintLookupValue(Variablex)
{
inti=((Integer)valueMap.get(x)).intValue();
returni;
}
}
//笼统表达式脚色,也能够用接口来完成
abstractclassExpression
{
publicabstractintinterpret(Contextcon);
}
//闭幕符表达式脚色
classConstantextendsExpression
{
privateinti;
publicConstant(inti)
{
this.i=i;
}
publicintinterpret(Contextcon)
{
returni;
}
}
classVariableextendsExpression
{
publicintinterpret(Contextcon)
{
//this为挪用interpret办法的Variable对象
returncon.LookupValue(this);
}
}
//非闭幕符表达式脚色
classAddextendsExpression
{
privateExpressionleft,right;
publicAdd(Expressionleft,Expressionright)
{
this.left=left;
this.right=right;
}
publicintinterpret(Contextcon)
{
returnleft.interpret(con)+right.interpret(con);
}
}
classSubtractextendsExpression
{
privateExpressionleft,right;
publicSubtract(Expressionleft,Expressionright)
{
this.left=left;
this.right=right;
}
publicintinterpret(Contextcon)
{
returnleft.interpret(con)-right.interpret(con);
}
}
classMultiplyextendsExpression
{
privateExpressionleft,right;
publicMultiply(Expressionleft,Expressionright)
{
this.left=left;
this.right=right;
}
publicintinterpret(Contextcon)
{
returnleft.interpret(con)*right.interpret(con);
}
}
classDivisionextendsExpression
{
privateExpressionleft,right;
publicDivision(Expressionleft,Expressionright)
{
this.left=left;
this.right=right;
}
publicintinterpret(Contextcon)
{
try{
returnleft.interpret(con)/right.interpret(con);
}catch(ArithmeticExceptionae)
{
System.out.println("被除数为0!");
return-11111;
}
}
}
//测试程序,盘算(a*b)/(a-b+2)
publicclassTest
{
privatestaticExpressionex;
privatestaticContextcon;
publicstaticvoidmain(String[]args)
{
con=newContext();
//设置变量、常量
Variablea=newVariable();
Variableb=newVariable();
Constantc=newConstant(2);
//为变量赋值
con.addValue(a,5);
con.addValue(b,7);
//运算,对句子的布局由我们本人来剖析,机关
ex=newDivision(newMultiply(a,b),newAdd(newSubtract(a,b),c));
System.out.println("运算了局为:"+ex.interpret(con));
}
}
注释器形式并没有申明怎样创立一个笼统语法树,因而它的完成能够多种多样,在下面我们是间接在Test中供应的,固然另有更好、更专业的完成体例。
关于闭幕符,GOF倡议接纳享元形式来共享它们的拷贝,由于它们要屡次反复呈现。可是思索到享元形式的利用范围性,我倡议仍是当你的体系中闭幕符反复的充足多的时分再思索享元形式。
4、优弱点
注释器形式供应了一个复杂的体例来实行语法,并且简单修正大概扩大语法。一样平常体系中良多类利用类似的语法,可使用一个注释器来取代为每个划定规矩完成一个注释器。并且在注释器中分歧的划定规矩是由分歧的类来完成的,如许使得增加一个新的语律例则变得复杂。
可是注释器形式关于庞大文法难以保护。能够设想一下,每个划定规矩要对应一个处置类,并且这些类还要递回挪用笼统表达式脚色,多如乱麻的类交叉在一同是何等可怕的一件事啊!
5、总结
如许对注释器形式应当有了些大致的熟悉了吧,因为这个形式利用的案例匮乏,以是本文年夜部分概念间接来自于GOF的原著。只是实例代码是亲身完成并调试经由过程的。
C#跟java类似,但是在跨平台方面理论上可以跨平台,实际上应用不大,执行性能优于java,跟C++基本一致,但是启动速度还是慢.代码安全,但容易性能陷阱. 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 是一种将安全性(Security)列为第一优先考虑的语言 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。 是一种使网页(Web Page)产生生动活泼画面的语言 是一种使网页(Web Page)产生生动活泼画面的语言 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 是一种使用者不需花费很多时间学习的语言 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
页:
[1]
2