JdonFramework程式碼探討

bluebears發表於2005-02-16
粗略讀了讀該架構的程式碼,感覺總體寫的還是不錯的。
提出了些建議,僅供參考。

其實我們平常在做專案時,當要進入編碼階段時,
首先應該指定編碼的規範,然後大家按照這個規範進行編碼。
如果不制定一個嚴格的編碼規範,大家隨意發揮,會給將來
的維護帶來很大的麻煩,相信大家也都有這個體會。

該架夠很大的問題就是在這方面沒有太注意,好多類中通篇
連一點註釋都沒有,讓我們這些開源愛好者學習起來太費勁了。
有的雖有些註釋,但註釋的風格花樣疊出,一個優良的系統如
果從編碼的角度看應該儘量讓人覺得這個系統是一個人編出來的,
風格非常統一,程式碼質量高,而且漂亮。
還有提個建議,既然是開源的,大家不妨使用Eclipse作為開發工具,
都開源嗎?使用Jbuilder也行,可要小心哪天別撞到槍口上喲。

以下是些具體的點,僅供參考。

1.PropsUtil.java的問題點

(1)變數定義後未使用
public final static String SETUPNAME = "setup";
public final static String SETUPVALUE = "true";

(2)loadProperties方法
52-56和58-63段程式碼不知有啥區別。


2.HttpSessionProxyVisitor.java的問題點
(1)removeEJBObject方法
下面程式碼的112行有必要嗎?
程式執行到112行時ccEjb肯定不是null的,如果從測試的角度看,112行這段程式碼至少需要測試兩個點
一是:ccEjb != null
二是:ccEjb == null
所以這個判斷可一去掉的吧。
111: if (ccEjb instanceof EJBLocalObject) {
112: if (ccEjb != null) {
EJBLocalObject eo = ( (EJBLocalObject) ccEjb);
eo.remove();
}
} else if (ccEjb instanceof EJBObject) {
if (ccEjb != null) {
EJBObject eo = ( (EJBObject) ccEjb);
eo.remove();
}
121: }


3.FileUtil.java的問題點
(1)recursiveRemoveDir方法
①205行:filelist = null; 不知有啥特殊意思,感覺挺怪怪的

②188行: if (tmpFile.isDirectory()) {
190行: } else if (tmpFile.isFile()) {
這兩個判斷條件有點那個了,既然不是目錄,就是檔案了,這樣寫雖說沒錯,但。。。
188行: if (tmpFile.isDirectory()) {
190行: } else {
改成上述語句如何,僅供參考。

(2)CopyDir方法
①方法名用大寫,不太好吧。

②引數名sourcedir,destdir如果該成sourceDir,destDir是不是更好點,
JAVA中一般變數第一個字母是小寫,後面的每個單詞的第一個字母一般都是大寫,這樣符合大多數人的習慣吧。

(3)該類中一個最致命的錯誤就是好多資料流的關閉處理都不太嚴緊,有可能會成為瓶頸的。
例如:readFile方法
假如在該行
while ( (len = br.read(buffer)) > -1) {
讀取資料時發生錯誤了,那麼就導致以下兩行程式碼
br.close();
fr.close();
是無效的,br,fr資料流都沒有被關閉,這些都是隱患的喲。

(4)readFile方法的函式說明
該函式只有一個引數input,而函式說明中確有output,content兩個引數說明。

(5)copy方法
在該方法中定義了變數BUFSIZE,是大寫,
一般常量都是在類中用大寫變數來定義的,
上述用法應該說是很少見的。
int BUFSIZE = 65536;


4.MultiHashMap.java
在JAVA的編碼規約中,該空的空一個格,效果會很好的。請看以下的地方。
(1)put方法
①空格的應用
25行:public Object put(Object key,Object subKey,Object value){
修正:public Object put(Object key, Object subKey, Object value){

27行:if(a==null){
修正:if (a == null) {

29行:super.put(key,a);
修正:super.put(key, a);

雖然對程式的執行沒什麼影響,但適當的加空格,程式碼會變得易讀和漂亮。

②變數名的定義
如該行:HashMap a = (HashMap)super.get(key);
變數名是a,變數名的使用一般讓他人在讀你的程式碼時,
能光看變數名就知道該變數想表達什麼意思。
變數名a,感覺不太專業。


5.VisitorFactory.java的問題點
26行:
private final static String module = VisitorFactory.class.getName();
相當於: private final static String module = “VisitorFactory”;
在38行:
if (cmKey == null){
做了個條件判斷,其實這個判斷條件能走進去嗎???


6.LoginServlet.java的問題點
41行: public final static String Login_Module = "SecurityRealm";
42行: private String Login_Module_Name;
43行: private String Login_Home_Uri;
該三行的變數名第一個字母用大寫,不太符合JAVA程式設計的習慣吧。
JAVA中常量定義一般都是大寫字母,變數名首字母是小寫,後面每個單詞的首字母是大寫。


7.ImageShowAction.java的問題點
下面這個函式的資料流的關閉處理採用這種方法不太好吧。要是在finally塊中執行
toClient.close();
出錯,則資料流沒被關閉,其實一般的做法是在寫完資料後就關閉,然後在finally
塊中判斷資料流有無關閉,沒關閉則在執行一次關閉較安全些。
private void outImage(HttpServletResponse response, byte[] data) throws
Exception {
response.setContentType("images/jpeg");
OutputStream toClient = response.getOutputStream();
try {

toClient.write(data);

} catch (Exception ex) {
Debug.logError("get the image error:" + ex, module);
} finally {
toClient.close();
}

}


8.ModelListForm.java和EventModel.java
如下兩段程式碼,都是get方法返回一個變數,可
如 return (this.allCount);
這種用法太少見了,出現截然不同的兩種寫法,
是不是很怪啊,雖然都沒錯,但從程式碼審美的角度來看,有點不美了吧。
public int getAllCount() {
return (this.allCount);
}

public Model getModel() {
return this.model;
}
建議只採用第二種方式。

9.關於版權的問題點
例如:
InvokerServlet.java
47行: * <p>Copyright: Jdon.com Copyright (c) 2003</p>

WebAppUtil.java
33行: * <p>Copyright: Jdon.com Copyright (c) 2005</p>
一套系統的版權怎麼能既是2003的又是2005的呢。

相關文章