对面向接口编程的理解

好久不写日志了,今天来谈谈这几天找工作的感受及最近的学习收获!

首先环顾一下大环境,周围的同学很多都已经找到工作了。个人认为有的在学习的努力程度上还比不上我,但现在每个月就是能拿上1~2k块钱,当然我没有嫉妒的意思,其实心里感到挺高兴的!既然他们都能找到工作了,那我又有什么不能的呢?至少说明目前软件行业还较为兴盛,找起工作来不会太难~我觉得问题的关键就是我的简历投地太少了,我才投了3~5封简历,有几次公司打电话要面试我,我却没过去瞧瞧。哎~大好机会如此飘逝!现在局势确实是很紧迫了,一方面5月8号就要毕业答辩了,到时候很可能要面临离校的情形,找房子,麻烦!而且,我选修课8个学分还有没有修满,到时候离校了还要大老远跑回学校上课,真是悲剧~这8个选修学分还好,还有2个专业限选课的学分,妈的辅导员说联系我的,至今仍没有音信,最怕的就是到时候差学分学校不给发毕业证,这样的话就更悲剧了~还有,家里面母亲大人逼我也逼地很紧,说我如果再不去找工作的话就要断我后路了,对此我感到压力很大,心里也很烦~其实像我这么大个人,再过俩月就23岁的人了,竟然还没在外面挣到过一分钱,确实是说不过去,说的不好听点,蜜罐里泡大的一代~再来环顾一下家族的周边形势,堂表兄弟姐妹什么的读书读的少,早就在外面赚了几年的钱了,说不好明天就找媳妇儿老公成家了~哎,我还真是不中用!

 

总觉得自己还学得不够,3大框架中的2框都还没实际用到过项目里面,只是写过一些示例项目。另一框spring甚至还只是停留在稍微理解概念的层面~有人跟我说进公司了之后自会有公司的框架给我们学,对3大框架的要求并非是一定的,但是我觉得,如果连最大众化的Struts、Spring、Hibernate都不会,你还有什么底气去跟别人说学好别人的框架没问题?或许你会说我在钻牛角尖了,我也承认确实有那么点~其实只要奠定坚实的javase基础,javaEE范畴的各种新技术、框架什么的,都只是浮云~我这么说也是有一定依据的,因为这段时间我就在证明自己定下的这个结论。这段时间以来我学习了direct web remoting、XFire webservices、json、ibatis SQLMapping、枪版struts1.x、hibernate等技术,就感觉所有这些始终都没能逃出过javase的范畴~

 

其实我对这些技术都只是了解个皮毛而已,也就停留在只会使用框架大致功能的层面,对于微妙深精的一些细节,不知道也不会用~

 

就来谈谈我研读过的那个枪版struts1.x!那个项目是基于jsp/servlet的,大家都知道servlet在第一次被请求的时候就会被new出来,而且一直存活下去直到服务器关闭,servlet在调用init方法的时候能从web.xml文件中取到一些参数!说到框架,那肯定是有一个xml配置文件的!这个xml文件就是除了web.xml附加上来的另一个扩展配置文件,不得不说xml确实是很优秀的一门语言,其中记载了结构很复杂的数据体,承载的数据在之后将发挥出很重要的作用~同时,这个项目也汲取了面向接口编程的思想,在各个类地头上都有一个接口作为顶头上司。我来说一说到底有哪些接口:①XMLConfig定义了“xml文件”对应的java类的接口,其中什么方法也没有,有一个MVCConfig类实现了这个接口;②Action定义了什么样的路径被请求之后的应该做出怎样的反应的接口,有3个类:DispatchAction,LoginAction,RegistAction,实现了这个接口;③同时还定义了一个xml文件解析类的接口XMLParser,以及实现了该接口的MVCConfigParser类。

 

至此,大体思路已经呈现出来了:

首先来谈谈配置文件带来的好处。属性文件(以.properties结尾)、xml文件、txt文本文件等都可以作为配置文件,那么配置文件究竟有哪些好处呢?这要涉及到可编译语言程序从书写到执行的流程,中间有个编译的环节。编译之前你可以随意修改,但是此时不能执行该源文件,编译之后生成字节码文件,可以在安装了jre的机器上运行,但这个程序里面写好的东西已经不能再做修改了。要想修改程序执行所需要读取的资源文件的路径的话(假设该路径在程序中以字符串的形式存在),就得在源代码上修改,改完编译生成了新的可执行文件之后才能达到效果...这样好吗?很不好!对于业务逻辑复杂的程序来说,它所要读取的一些数据和参数都是需要变动的,如果变动的余地留在修改源代码的层次,到时候再次使用升级产品的同时还得要经历拷贝可执行文件到目标机器、安装等繁多的步骤,如果能把变动的余地留在修改配置文件的层次,那肯定要方便很多,只需要关一下服务器,把配置文件改一改再重新启动就可以了!另外,配置文件是多种多样的,但配置文件里面也是分档次的,有的配置文件很强大,能够展现出复杂的数据结构,如xml文件。也有的配置文件档次很低,只能保存诸如键值对一样的简单格式数据,如java中的属性文件~任何一种配置文件都要有一个解析工具Parser,由于.properties属性文件有java这个给力的后台,而xml又是广泛使用的一种数据存储和传输格式,因此都存在与之相对应的使用较为普遍的操作包、库、类或者框架...如果你觉得这两种配置文件太俗气的话,呵呵,大可自己也来凑凑热闹,定制一个很特别的配置文件,不过前提是你得把这个特殊配置文件的Parser给一起搞出来了,这样成本比较高而且达到的效果还不一定好~这也就揭示了为什么配置文件总是那么几种的原因。

 

继续,编写一个充当大管家的servlet,他相当于一个过滤器,过滤所有从客户端返回来的请求路径...它在init的时候会通过parser解析扩展xml配置文件中的数据,将这些数据保存到一个从该配置文件的数据结构中抽象出来的一个java对象当中,以方便之后能在java程序中方便地获取和修改这个数据结构所承载的数据信息。同理,javascript中也是这样的,如果说json字符串是静态的便于传输的数据呈现方式,那么通过js中的eval方法将json字符串转换成的js对象就是动态的能被js程序直接操作的数据呈现方式...想起以前《C#数据结构》上将程序概括为“数据结构+算法”的事情,现在想来也确实是这样的,数据以怎样的方式传输和存储以达到最高的效率确实是一个很重要的课题!xml作为一种广泛使用的数据传输格式,肯定是有它存在的道理的,不过不能否认的是,xml中的数据必须要转换为本地语言中的对象(在java中转换成java对象,在js中转换成json对象,在C/C++中转换成C++的对象、C的结构体或是其他什么的),其中包含的数据才能以最高的效率被程序进行检索~提一点:个人觉得面向对象语言(Java、C++)中类的概念就是以面向过程语言(C语言)中的结构体这种数据结构为蓝本的。

 

至此一大步已经迈完了,剩下的就要靠java中的反射机制来扫尾了~

无可否认,编程语言的动态特性确实极大的提高了该门语言的竞争力、生命力,有例为证。

java做web应用为什么能做到像现在这么火爆?就是因为java支持动态特性!框架什么的层出不穷,那都是建立在java的动态特性——java反射机制之上的!自从有了java反射机制,程序中要产生一个对象,就再也不用把这个对象是何种类型硬编码到程序中了,一个class.forName("参数为包名+类名");就解决了所有的问题!要new出一个什么类的对象,把这个类的“包名+类名”写在配置文件里面,起个简单易懂的名儿,用“键值对”给对应起来。根据实际的业务需要得到这个别名儿(也可能时用户提交过来的路径名),依据别名检索出“类名+包名”,将其做为参数传递给class.forName();方法,就能以很漂亮的方式new出一个对象!为什么说这种方式很漂亮呢?道理很简单,中型、大型的项目一般都是分模块完成的,为保证该项目日后的维护和扩展,每个模块在设计阶段都必须符合“高类聚、低耦合”的原则,这是非常重要的!如果不遵守这个设计原则的话,那么日后进行维护和扩展的时候,各个模块之间的关系千丝万缕,剪不断理还乱,那将会是一个相当令人挠头的问题!如果遵守的话,各个模块之间以接口的形式进行交互,那么在某个模块出现了故障或者是需要进行扩充的时候,就能很容易的“拆卸”下来并在处理完毕之后一样方便地“安装”回去!另外谈一谈自己对模块化的理解:模块化本来的意图就是“化整为零”,就好比中国要对被打落下来的美国隐形战机进行研究一样,首先就是要把它拆成一个个的零件(对应于模块化系统中的模块),对零件进行研究要比对整个飞机对象进行研究轻松地多,无论是探索其使用技术的时候,还是发生了故障需要排除故障的时候,将一个中型、大型的系统设计的浑然一体,等到出现了问题的时候,想拆都拆不开,排错的范围由单个模块提升到整个系统,你能忍受这样的痛苦吗?另外,java能够汲取“面向接口编程”的思想和java的反射机制究竟有多大的干系呢?我不懂,就不胡乱猜测答案了~

 

说点旁的,我觉得这xml真是个bug,太强悍了。以前还不知道它这么猛,只是以前专业老师问我xml有什么好处的时候,我在书上一眼瞟到过以下文字:xml的英文全称是Extensable Markup Language(可扩展标记语言),可以用来作为一种跨平台的与硬件无关的数据传输格式...当然时过已久,可能我现在写下来的和当时书上给出的有些出入~随着我后来的学习,我越来越发现xml的广泛使用和它的好处,就说这xml文件不仅能在java,c,c++等可编译语言里面使用,在浏览器、html中也能用,手机里面也能用,如果不出我所料,像工控设备、单片机等等,也是能很方便的操作xml格式的数据的。java提供了操作xml的dom4j,sax等,html脚本语言javascript中提出了DOM(Document Object Model)的概念,其中包含了能方便操作xml的api(微软IE的DOM模型好像只能识别HTML的标记)。总之,什么东西都能往xml身上靠,以前看视频的时候听到过一位老师这样说过:“xml能表达出来的‘感情’太过复杂,以至于没有其他的数据格式能够替代...”,现在想来这个例子举得确实是非常恰当...想想看,java中的类,类中就包含了属性、变量和方法等元素,虽然成员变量依然可以是另外一种类的引用,而在这个作为成员变量的类中,依然还可以持有另一种类地引用,凭借这种类的无限嵌套,java类完全可以做到“表达很复杂的感情”!但是何不想想,至此表达了复杂感情的java类,你还能从最根基的那个类方便地一览整个“复杂感情”的全貌吗?不能!而xml就可以做到,它可以无限制的进行嵌套,同时也为用户的“概览全貌”提供了一个良好的“视界”,而且还能让机器也能很理解!xml还能对包含其中的数据进行加密等操作,而且我还听说过xml数据库的概念。还有就是,我老在struts、hibernate等框架的配置文件,web.xml,html文件的首部见到url地址,前段时间才想明白这些url地址的作用,原来是要把这些xml文件提交到特定的url请求予以验证是否符合官方提供的标准~后来我有认识了另一种数据格式json,即JavaScript Object Notation的简称,它可以作为数据传输的载体流动于浏览器与服务器之间,发起者大肆鼓吹json也能表达像xml能表达的那种复杂的感情,而且还比xml更精简~我就是被蛊惑的群众中的一员。前段时间有个同学他说想做个个人博客,让我来写服务器端他做前台页面,就是他让我第一次知道了json是什么,后来我们就讨论用webservices后台+json数据传输格式+ajax来实现这个项目,很可惜的是,只是谈论而已,我由于找工作没有时间投入大力研究,对方后来也未曾再跟我提及,就此作罢...

 

谈谈几个流程:

①前台页面的制作流程:分析业务逻辑->出草图->出成熟图->由美工将连接、表单等整合到成熟图中去,将图转化为实际页面~

②数据库设计的流程:分析业务逻辑->写项目文档->在Visio、Rose等UML建模软件中建立数据库设计的ER图->按照ER图在PowerDesigner中画出CDM(概念数据模型)-> 将CDM具体化为某种数据库的PDM(物理数据模型)->生成SQL脚本

③把项目中的oracle数据库模块迁移到其他Oracle数据库中:分别导出“所有数据对象”脚本、“表结构及数据”脚本...

④企业里做大中型项目的流程:分析业务逻辑->由项目组长划分模块并设计各个模块的接口->将各个模块的接口实现任务派发给下级程序员->各程序员严格按照接口和需求文档实现自己负责模块的接口->整合所有模块成为一个完整的项目(就拿JavaWeb的数据库模块来说事儿,SUN公司提出了数据库模块接口的标准,将其派发给各个数据库生产厂商,让它们自己负责实现与Java语言的交互接口...这样数据库模块就成了JavaWeb项目中一个可以灵活配置的模块,用户可以自由决定使用哪种数据库,可以随意的更换数据库的类型,只需要修改一下驱动的类型和数据库连接字符串即可...模块与模块之间通过java反射机制以class.forName()、java反射机制的方式接合,变数接口的实现类名可以写在配置文件中,这样就不需要在运行时重新修改编译代码而只要改改配置文件就完事...这是我猜想的,不知道企业中是否确实如此~)。

 

最后,隐隐觉得java中的接口和C++的头文件有点儿相似,而C++主体文件则是相当于java中的实现类~最近对面向接口编程思考比较多,感觉这个东西用的还真是广泛!在dwr中,js对象能映射到java对象,用js代码调用服务器端的java代码;webservices中,客户端程序利用服务器端暴露的接口,也能够很方便的调用服务器端的代码实现;在 JDBC 等标准中,也是由SUN提出数据库连接、操作的接口标准,由各个数据库生产商自己依据SUN提出的接口标准写用java操作各自数据库的具体实现(数据库多种多样的,各自写出来的实现肯定是不同的,不过凭借着“父类或接口引用指向子类对象”以及java语言的多态特性,能够很好地保证我们写出来连接和操作各种数据库的java代码不会有太大的出入),除了JDBC外还有JPA(Java Persistence API)等接口标准...我接触的第一门编程语言是C,让我在编程方面感觉上了路的语言是C#,目前我最熟悉的是java,我还学过一点儿 javascript 、C++,最近我又较为系统的学习了一下Oracle数据库(也包括其中的pl/sql编程),有了一点小小的心得,那就是:编程语言根本就没什么(各门编程语言虽然各有各的特色和专长,但在流程控制上,同样也就是那几种),数据结构、算法、设计、思想,这些东西才是最重要的,只有学习一门语言达到了一定的深度,才能开始在这些处于较为本质层面上的东西有所得!只有上升到了思想的高度,才算是从打字员蜕变为真正的程序员~

你可能感兴趣的:(Java相关)