JdonFramework程式碼探討
粗略讀了讀該架構的程式碼,感覺總體寫的還是不錯的。
提出了些建議,僅供參考。
其實我們平常在做專案時,當要進入編碼階段時,
首先應該指定編碼的規範,然後大家按照這個規範進行編碼。
如果不制定一個嚴格的編碼規範,大家隨意發揮,會給將來
的維護帶來很大的麻煩,相信大家也都有這個體會。
該架夠很大的問題就是在這方面沒有太注意,好多類中通篇
連一點註釋都沒有,讓我們這些開源愛好者學習起來太費勁了。
有的雖有些註釋,但註釋的風格花樣疊出,一個優良的系統如
果從編碼的角度看應該儘量讓人覺得這個系統是一個人編出來的,
風格非常統一,程式碼質量高,而且漂亮。
還有提個建議,既然是開源的,大家不妨使用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的呢。
提出了些建議,僅供參考。
其實我們平常在做專案時,當要進入編碼階段時,
首先應該指定編碼的規範,然後大家按照這個規範進行編碼。
如果不制定一個嚴格的編碼規範,大家隨意發揮,會給將來
的維護帶來很大的麻煩,相信大家也都有這個體會。
該架夠很大的問題就是在這方面沒有太注意,好多類中通篇
連一點註釋都沒有,讓我們這些開源愛好者學習起來太費勁了。
有的雖有些註釋,但註釋的風格花樣疊出,一個優良的系統如
果從編碼的角度看應該儘量讓人覺得這個系統是一個人編出來的,
風格非常統一,程式碼質量高,而且漂亮。
還有提個建議,既然是開源的,大家不妨使用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的呢。
相關文章
- 用程式碼探討KVC/KVO的實現原理
- 用程式碼探討 KVC/KVO 的實現原理
- 乾貨| 關於程式碼對齊的探討
- BeeHive 1.6.0 原始碼閱讀探討Hive原始碼
- Promise探討Promise
- Java原始碼分析:深入探討Iterator模式Java原始碼模式
- 深入探討 UndefinedUndefined
- IsPostBack深入探討
- px em rem 探討REM
- with as探討時小插曲
- Oracle Stream 深入探討Oracle
- Open Session In View 探討SessionView
- 軟體開發週期估算及探討-程式碼例項講解
- 一個有趣的故事(請討論JdonFramework的各位進)Framework
- 深入探討單例模式單例模式
- cassandra查詢效率探討
- 前端工程架構探討前端架構
- AdobeFlashLite探討
- Oracle 技術探討3Oracle
- Oracle 技術探討2Oracle
- Oracle 技術探討1Oracle
- 責任鏈模式探討模式
- JavaScript原型鏈汙染探討JavaScript原型
- 高階Bash指令碼程式設計指南 一個對指令碼程式設計技術的深入探討指令碼程式設計
- 探討阻塞佇列和執行緒池原始碼佇列執行緒原始碼
- 開源低程式碼平臺開發實踐一:低程式碼開發探討與技術選型
- 【字元編碼】Java字元編碼詳細解答及問題探討字元Java
- 深入探討ROP 載荷分析
- SQL優化器探討(zt)SQL優化
- Netty URL路由方案探討Netty路由
- Springboot 加密方案探討Spring Boot加密
- oracle 雙機部署模式探討Oracle模式
- 深入探討JavaScript函式物件JavaScript函式物件
- Java HashMap工作原理深入探討JavaHashMap
- Ceph monitor故障恢復探討
- 深入探討、理解Java的CLASSPATHJava
- 雲技術應用探討
- 探討Spring框架使用真相Spring框架