如果有用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的人,中小型的項目已經足夠用了.
---
一大早給老媽子吵醒,沒法睡了.出來打點東西,又要嘮嘮叨叨,算了,不打了.
今天回一趟學校,看有沒有插本的信息,看來還得繼續考試(-_-,我不喜歡考試).