做設(shè)計前期需要注意的細節(jié)
數(shù)據(jù)庫方面:
1、
數(shù)據(jù)庫設(shè)計,所有整數(shù)型的字段默認賦值為0(或-1,這個根據(jù)業(yè)務(wù)來就好,不是特別強求),字符型也默認賦值‘’(這個倒可做可不做)。可以避免程序的空指針異常。
詳細例子:
Public class
User{
Private Integer
state;
Public Integer
getState(){
Return state;
}
}
在action層調(diào)用時:
User user = new
User();
If(user.getState()>1){
如果數(shù)據(jù)庫沒有賦初始值的話,就會報空指針異常
//其他業(yè)務(wù)邏輯
}
2、
把所有冗余字段記錄清楚,下次應(yīng)用程序修改某字段的時候就要把相應(yīng)的冗余字段全部修改過來。可以避免數(shù)據(jù)不一致性。
例子:
A表冗余了b表的name字段,c表冗余了b表的name字段。
程序?qū)崿F(xiàn)有兩種方式解決這種冗余數(shù)據(jù):
ü
修改b的name字段的時候就相應(yīng)的把a和c表的name字段也修改掉
ü
修改b的name字段的時候插入到另外一個表中,通過定時器在凌晨的時候進行自動修改
3、
主外鍵通過數(shù)據(jù)庫文檔描述清楚,數(shù)據(jù)庫不直接建立主外鍵關(guān)系,最主要是考慮到以后數(shù)據(jù)庫擴展,建立了主外鍵的話,水平擴展會非常難。
4、
Tinyint類型的數(shù)據(jù),應(yīng)該說明每種類型的用途,例如: 1:刪除 2:未刪除。
5、
某一些初始數(shù)據(jù)前期就應(yīng)該固定好,并且備份好。以免以后弄亂了。比如:城市數(shù)據(jù)都不會變動的數(shù)據(jù)。
6、
數(shù)據(jù)庫的數(shù)據(jù)主要分為基礎(chǔ)數(shù)據(jù)和業(yè)務(wù)數(shù)據(jù),城市等這些屬于基礎(chǔ)數(shù)據(jù),而會員和會員賬號屬于業(yè)務(wù)數(shù)據(jù),業(yè)務(wù)數(shù)據(jù)在應(yīng)用程序中就需要注意了,添加一個會員數(shù)據(jù)后需要把會員賬號的默認賬號也開起來(當(dāng)然有些業(yè)務(wù)規(guī)則要求賬號可以后期獨立開啟)。
7、
對于數(shù)據(jù)庫中“刪除”操作的處理,我們不需要將數(shù)據(jù)刪除,只要將狀態(tài)標(biāo)識一下即可,比如用戶可以設(shè)置一個state狀態(tài),1:啟用 2:禁用 3:刪除
代碼方面:
1、
統(tǒng)一checkstyle和版權(quán)申明等注釋。
2、
Action在前期就應(yīng)該用模塊化方法規(guī)定好,同一模塊中公用的部分應(yīng)該用utils文件來進行共享,避免使用繼承,減少程序過于龐大和復(fù)雜化。
3、
業(yè)務(wù)層之間調(diào)用應(yīng)該使用service,而不是去直接調(diào)用dao層。
4、
業(yè)務(wù)層的代碼特別是update,delete的方法不能直接返回void,應(yīng)該給出一個特別的值,或者拋出異常,客戶端才能真正的準(zhǔn)確知道此次操作是否真正成功。
可能比較模糊,舉一個例子:
前提條件,業(yè)務(wù)層的代碼如下:
Public void
deleteById(int id){
String sql = “delete
from User where uid=?”;
userDao. executeUpdate(sql);
}
客戶端發(fā)起刪除操作,給了一個數(shù)據(jù)庫不存在的id,而這樣的delete語句是不會報錯的.那么在action層調(diào)用這個方法的時候,action層只要沒有拋出異常,那么action只能認為業(yè)務(wù)層的deleteById方法一定執(zhí)行成功了,實際對于用戶來說是沒有執(zhí)行成功這個操作。用戶體驗非常不好。如何改進呢?
Public int
deleteById(int id){
String sql = “delete
from User where uid=?”;
Return userDao. executeUpdate(sql);
}
Action層調(diào)用這個方法后,判斷返回的int值判斷是否執(zhí)行成功,然后把相應(yīng)的結(jié)果反饋給客戶。
另外一種改進方法:
Public void deleteById(int id) throws new
DeleteException{
String sql = “delete
from User where uid=?”;
Int result =
userDao. executeUpdate(sql);
If(result==0){
Throw new DeleteException(“刪除操作失敗”);
}
}
Action層調(diào)用這個方法后就一定要捕獲DeleteException異常,那么反饋給客戶的結(jié)果也是正確的。
5、
dao層的方法也是類型于上面所講的。
6、
ajax層的ajax方法調(diào)用也要注意一點:對于都要加上error方法或者failure方法,因為服務(wù)端出問題的時候,有一個很好的提示給用戶,對于用戶體驗來說也是非常好的一種感受。
7、
業(yè)務(wù)層用例之間的耦合盡量少,但是類似交互規(guī)則這樣的場景存在的話如何處理呢,可以通過業(yè)務(wù)規(guī)則來處理,可以減少耦合。