星期五, 九月 19, 2003

又有好东东发现了!

现在新闻系统紧张的开发中,在JDO中发现很令我郁闷的事情,其实也就是数据库的开环和闭环事物的问题。譬如两个用户同时对一个Object进行操作就会引起事物的异常。在JDOCentral上面有一篇文章关于JDO事物处理的东西 http://www.jdocentral.com/JDO_ExpertCorner_DavidEzzio_20030320.html ,这个观点和一本书<<实用J2EE设计模式编程指南>> 里面关于数据库的处理差不多。

记得我当初很抵制Struts就是因为他过多的依赖了web项目,进行开发测试都很困难。现在我发现了WebWork 2,感觉确实不错。他主要使用了Xwork,在webwork2里面调用xwork里面定义的对应处理,这个设计是我很需要的,他和Struts方便就在我们不用太多的专注在Web的处理上,编写测试代码变得很容易(尽管cactus能够胜任测试)。这个项目是由opensymphony公司开发的。在这个公司网站我还发现了一个好东东OSCache,一个cache的工具,我发现他用JSP tag来表示,使用起来非常容易,不像apache的JCS那样繁琐。

还有就是发现了一个前端显示的tag很爽,尤其是他的分页和表格处理上,而恰恰table的处理上面是web层开发的重点,不断的罗列许许多多的数据。

就软件的价值的评测,我对此很是头疼。我原来想从软件的价值评测中得到软件的开发周期,但是发现很困难,软件的不可预知的东西太多。这方面我还是需要时间来锤炼自己。
软件的开发模式方面我自己深有体会的很多。
现在软件行业的发展逐渐的转向了web方面的开发。其实说起web方面的开发实际上就是如下开发:表示层、逻辑层、数据层。就我个人而言我很喜欢您所说的水平模式。因为现在编程语言和编程模式的发展也在向这方面发展,按照模块来发展我个人认为是早期软件开发的模式。但是按照我所说的软件开发的模式的话,需要很好的协调。就三个层次我先抛砖:
一、表示层:
表示层是向客户展示自己的产品的最前端,无论您后台的逻辑和数据处做的再好没有一个好的前端显示也是徒劳。现在软件的表示层开发面临的问题是,美工和编程者之间总是存在这样那样的合作的问题。
问题1:美工没有考虑整个系统的控制,没有采取包含文件、统一控制等方式进行开发,而是不断的开发一些重复的页面。这样的页面拿给开发者之后很容易导致开发者出现大量重复代码的现象,可以说是引诱开发者误入繁琐开发误区。
问题2:当开发者发现美工做的东西不符合自己的逻辑要求时候,需要美工进行修改,而美工修改的过程可能破坏原来的已经插入的代码。

现在有很多的项目组织正在解决表示层的问题,其实全部都是基于MVC思想的。他们可以使得表示层和逻辑层能够最大限度的分开。其中有几个Framework比较突出:
1:Apache 的Struts http://jakarta.apache.org/struts/index.html
2:Opensymphoney的webwork http://www.opensymphony.com/webwork/
3:Apache 的velocity http://jakarta.apache.org/velocity/index.html
等等。
我个人认为作为公司要是想开发稳定的产品就需要有自己的Framework。其实这些Framework都是采用Servlet/taglib/jstl等技术,并不是特别复杂,能够让美工和开发者共同参入进来产生一个Framework,在以后的开发中开发起来会变得得心应手,当然这些需要时间。
二、数据层:
我把数据层提到逻辑层前面说是因为逻辑层是需要表示层和数据层才能工作的。现代数据库技术的发展日新月异了,现在大家的观点就是怎么让数据层和逻辑层分开,现在的开发人员不短需要写逻辑,还要不短的写一些数据库的处理,譬如关掉连接数据库,产生事物,插入数据库,事物提交,关闭数据库等等繁琐的代码。一个逻辑里面有很大一部分集中在数据库的处理中这么繁琐的代码,而且数据库的sql语句还需要不短的调试。使得开发者在相当大的时间内集中在sql语句的调试上,而不是集中在商业逻辑的开发中。 如果我们的数据层能够做的很好的话,就是开发者仅仅需要一点点代码就可以和数据库打交道,而且和数据库打交道是纯Java代码,而不是sql语句之类的。现在这方面已经出现了好几个产品用来实现这方面的东西。就技术的角度来讲主要有两种:
1:在Java编译之后的代码上面enhance一些字节码进去。这方面的典范就是Sun公司提出的JDO(Java Data Object http://java.sun.com/products/jdo/).的确Sun公司提出的这种方法很先进,他让开发者不关心数据库的连接,而仅仅是关注与商业逻辑。譬如插入一个记录可以如下操作:
PersistenceManagerFactory pmf=JDOHelper.getPersistenceManagerFactory();
PersistenceManager pm=pmf.getPersistenceManager();
Transaction trans=pm.currentTransaction();
TestBean tb=new TestBean();
tb.setXX("asdf");
tb.setXXX("asdfasdf");
pm.makePersistence(tb);
trans.commit();
pm.close();

就这样插入到了数据库中。里面没有见到一点点sql的代码,仅仅关心在商业逻辑上面。可惜的是sun公司给出的是接口和一个简单的实现,发展的还不是很完善,外国有几家公司在做这方面的技术实现:
LIBeLIS http://www.libelis.com
Hemisphere http://www.hemtech.co.za
Apache 的Obj http://db.apache.org/ojb
等等。

2:使用XML、Java Object进行映射。这方面的技术发展比JDO早,现在做的也比较成熟了。这方面的典范莫过于 castor(http://castor.exolab.org/) hibernate (http://www.hibernate.org) ,他们都是使用了XML文件做为映射,书写自己的API,来进行persistence。尤其是hibernate表现非常不错,现在他的性能无疑成为最佳,最近又被JBOSS应用服务器采纳作为他的EJB中的CMP的引擎。

session = sessionFactory.openSession();
transaction = session.beginTransaction();

Cat max = new Cat();
max.setName("Max");
max.setSex('M');
max.setWeight(8.1f);
session.save(max);

if (commit) {
transaction.commit();
} else {
// Don't commit the transaction, can be faster for read-only operations
transaction.rollback();
}
session.close();

上述代码展示了利用hibernate进行数据库的插入。

数据库技术在O/R Mapping上面发展很快,这也是很多开发者关注的,因为他可以使得开发者从繁琐的数据库处理中解放出来。进行商业逻辑的编辑。但是现在这个东西行业没有标准,仍然出在发展的阶段,我想这个地方肯定会成为数据库开发的热点。因为在J2ee中CMP实际上就是O/R Mapping的结果,我相信这方面的技术肯定会得到长足发展。

三、逻辑层

现在商业逻辑层实际上就是处理客户的需求,一个Client向Server发出一个request然后来得到一个response.繁琐的使用代码来获取客户端的信息。譬如用户输入一个int,我们要检查他时候为空,然后在检查时候是数字型,如果不是则要返回信息。这些繁琐的处理带来大量的代码的重复。现在在商业逻辑上面的框架也有一些,他们主要是结合表示层来的,这个需要大量的代码演示。


综上所述:我个人认为一个系统在良好的设计之后,然后结合几个框架,采用水平的开发模式,我认为最好不过了。我心目中的开发方式:

1:拿到项目之后,由几个设计者和开发者共同研究出来整个系统的构成,技术实施方案。
2:然后在分配人手进行整体框架的搭建。为后期开发提供一个接口。
3:然后在研究整个系统的逻辑,此时应该让美工和开发这共同参加,研究出一些技术上面和美工方面的难点。
4:根据难点,有几个人重点突破此难点。此时开发者和美工可以先抛开此难点进行先期开发。
5:难点攻破之后,写出详细文档,归公司技术文档。移交开发者使用,并进行辅助。
6:系统完成之后进行系统测试。
而开发者在每天的开发过程大概如下:
1:上午由协调者召开1刻钟的会议,确定今天完成的任务,以及人员的配备情况。
2:开发者在开发的时候应该先书写完整的测试。然后在开发(一个高级工程师说的〕。
2:开发者可以进行两两结对进行编程,共同讨论。书写可以完成通过上面编写测试代码的代码。
3:在下班前半小时,各个开发者必须提交到CVS。
4:然后由协调者和开发者共同进行系统的整合,测试,发现Bug,归入Bug区。
5:大家击掌下班了。

上面提到的开发模式,人员不见得必须某两个人必须配对,可以不断的轮换。这样的开发方式是高效的,而且大家互相直接肯定可以学到这样那样的知识。但是要求开发者要有良好的 敬业精神和按时完成可以完成的任务。


以上是我的个人观点,还有许多,我不知道怎么用言语来表达,我对软件的开发模式方面和服务器的一些原理方面很感兴趣。