如果有用java開發(fā)Web的人都會(huì)或多或少地懷疑自己是否真的用到了面向?qū)ο蟮睦碚摵头椒?又或者認(rèn)為這是理所當(dāng)然的方式.呵...多想了吧?
為什么我會(huì)有這樣的感受?因?yàn)槲乙荒甓鄟矶荚谙脒@個(gè)問題.
看看下面的代碼,PHP的:
function createPerson($name, $sex, $age) {
?$db = getDbConnection();?//get db *cache*
?$db->query("insert into person values(NULL, '$name', '$sex', '$age')");
?return $db->lastStatus();
}
這是純過程的一段程序,只要在其它程序文件中這樣調(diào)用:
if (createPerson("juggler", "man", 25)) {
?echo "done.";
} else {
?echo "error.";
}
學(xué)過C語(yǔ)言的人會(huì)很容易接受上面的程序,也很自然,這無非是和我們生活過程一樣,一個(gè)一個(gè)步驟執(zhí)行.
那么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,可的確這是最快的開發(fā)方式.
其實(shí)有一個(gè)Person類就是面向?qū)ο笏枷氲捏w現(xiàn),把世界分為一個(gè)又一個(gè)的實(shí)體,歸類,然后統(tǒng)一他們的動(dòng)作,而動(dòng)作的差異由他們自身的數(shù)據(jù)而定.可是我們?cè)僮屑?xì)看PersonDao的create方法,他的動(dòng)作是把member扁平化,然后再用jdbc保存,又或者不扁平化,直接用一些ORM或者SQL map工具(其實(shí)也是扁平化的過程,只是我們看不到而已),其實(shí)和前面所說的那段代碼是沒有區(qū)別的,都是面向過程的方式,雖然這個(gè)表面上套了一層OO的皮.
可能會(huì)有人說:"其實(shí)我是把一些保存數(shù)據(jù)的邏輯動(dòng)作挑出來,合成一個(gè)邏輯對(duì)象,由它專管域?qū)ο蟮倪壿嫼统志没?"是的,我承認(rèn)這句話的正確性,可是這樣的話,域?qū)ο缶椭皇O聅etter和getter了,那他就只是一個(gè)值對(duì)象了,他失去了他應(yīng)有的權(quán)利,那么域?qū)ο筮€有實(shí)在的意義嗎?這或許就是什么PO,VO存在的必要吧.
不想了,這樣的問題永遠(yuǎn)沒有結(jié)果,也沒有統(tǒng)一的模式.其實(shí)失血模型也挺適合我們這些PHP轉(zhuǎn)JAVA的人,中小型的項(xiàng)目已經(jīng)足夠用了.
---
一大早給老媽子吵醒,沒法睡了.出來打點(diǎn)東西,又要嘮嘮叨叨,算了,不打了.
今天回一趟學(xué)校,看有沒有插本的信息,看來還得繼續(xù)考試(-_-,我不喜歡考試).