如果有用java开发Web的人都会或多或少地怀疑自己是否真的用到了面向对象的理论和方法,又或者认为这是理所当然的方式.呵...多想了吧?
为什么我会有这样的感受?因为我一年多来都在想这个问题.
看看下面的代码,PHP的:
function createPerson($name, $sex, $age) {
$db = getDbConnection(); //get db *cache*
$db->query("insert into person values(NULL, '$name', '$sex', '$age')");
return $db->lastStatus();
}
这是纯过程的一段程序,只要在其它程序文件中这样调用:
if (createPerson("juggler", "man", 25)) {
echo "done.";
} else {
echo "error.";
}
学过C语言的人会很容易接受上面的程序,也很自然,这无非是和我们生活过程一样,一个一个步骤执行.
那么Java呢?看看下面的代码:
//Person.java
//a pojo class
package org.oxl.domain;
public class Person {
public Person() {}
public setName(String name){//....此处省略}
public getName() {//....此处省略}
//...getter and setter
}
//PersonDao
package org.oxl.dao.implements;
public class PersonDao implements Daobase {
public create(Person member) {
String name = member.getName();
String sex = member.getSex();
String age = member.getAge();
//use jdbc to save it
//or you can use hibernate or use ibatis..
}
}
上面是我见到的最常用的java代码,失血模型,所有的逻辑都在Dao层和Service层搞定,分工合理,只是总觉得不够OO,可的确这是最快的开发方式.
其实有一个Person类就是面向对象思想的体现,把世界分为一个又一个的实体,归类,然后统一他们的动作,而动作的差异由他们自身的数据而定.可是我们再仔细看PersonDao的create方法,他的动作是把member扁平化,然后再用jdbc保存,又或者不扁平化,直接用一些ORM或者SQL map工具(其实也是扁平化的过程,只是我们看不到而已),其实和前面所说的那段代码是没有区别的,都是面向过程的方式,虽然这个表面上套了一层OO的皮.
可能会有人说:"其实我是把一些保存数据的逻辑动作挑出来,合成一个逻辑对象,由它专管域对象的逻辑和持久化."是的,我承认这句话的正确性,可是这样的话,域对象就只剩下setter和getter了,那他就只是一个值对象了,他失去了他应有的权利,那么域对象还有实在的意义吗?这或许就是什么PO,VO存在的必要吧.
不想了,这样的问题永远没有结果,也没有统一的模式.其实失血模型也挺适合我们这些PHP转JAVA的人,中小型的项目已经足够用了.
---
一大早给老妈子吵醒,没法睡了.出来打点东西,又要唠唠叨叨,算了,不打了.
今天回一趟学校,看有没有插本的信息,看来还得继续考试(-_-,我不喜欢考试).