一、前言
俗話說(shuō)贱傀,細(xì)節(jié)決定成敗,每個(gè)成功的人伊脓,除了天賦府寒,其實(shí)更重要的魁衙,是毅力,是對(duì)自己近乎苛刻的要求株搔,而這種要求剖淀,能夠讓你更加快速的前行,避免前行道路上的很多彎路纤房。
-
作為一個(gè)技術(shù)開(kāi)發(fā)人員纵隔,規(guī)范化的要求自己,顯得更加的重要與迫切:
- 軟件開(kāi)發(fā)是一門(mén)工程學(xué)科
由于軟件行業(yè)的特殊性炮姨,即它的工程性捌刮,對(duì)于規(guī)范的要求,就更高一層了舒岸,只有完整性绅作、細(xì)節(jié)性等各方面的嚴(yán)格把控,才能讓這個(gè)工程更加穩(wěn)定蛾派,bug率更少俄认。(你要沒(méi)有這樣要求過(guò)自己,在一天洪乍、一周眯杏、甚至一個(gè)月內(nèi),零bug壳澳,有這樣的魄力嗎岂贩?)
- 技術(shù)創(chuàng)新、更新钾埂、淘汰速度急快
估計(jì)每一個(gè)軟件開(kāi)發(fā)者都很清楚河闰,在信息化技術(shù)飛速發(fā)展的當(dāng)代,一門(mén)技術(shù)的更新褥紫、發(fā)展姜性、以及淘汰整個(gè)周期是很短很短的,而一門(mén)又一門(mén)新的技術(shù)問(wèn)世的速度髓考,確實(shí)及其的驚人部念,此時(shí),對(duì)于每一個(gè)軟件開(kāi)發(fā)者來(lái)說(shuō)氨菇,都是一種極大的挑戰(zhàn)儡炼,而這種挑戰(zhàn),只會(huì)愈演愈烈查蓉,所以乌询,如何快速的掌握一門(mén)新的技術(shù),是一個(gè)軟件開(kāi)發(fā)者必備的能力豌研,而好的習(xí)慣妹田,即規(guī)范唬党,則是處處相同的,只要沿著這條規(guī)范化的路前行鬼佣,會(huì)在學(xué)習(xí)應(yīng)用中少走好多彎路驶拱,更加快捷的前行。
二晶衷、代碼開(kāi)發(fā)規(guī)范
1蓝纲、命名開(kāi)發(fā)規(guī)范
- 包名命名規(guī)范:
包,在java開(kāi)發(fā)中是不可避免的晌纫,而好的包命名税迷,會(huì)使得程序?qū)哟谓Y(jié)構(gòu)明確,讓程序的可讀性更好缸匪,團(tuán)隊(duì)協(xié)作也變得更加簡(jiǎn)單翁狐,而且,會(huì)使得項(xiàng)目的體系結(jié)構(gòu)非常的明了易懂凌蔬,讓開(kāi)發(fā)中可能因?yàn)榻涣饕约袄斫馄疃鴮?dǎo)致的代碼冗余性高露懒、重用性差等問(wèn)題得到很好的解決。除此只為砂心,會(huì)讓項(xiàng)目的整體架構(gòu)層次清晰易懂懈词。
命名方式推薦: 業(yè)務(wù)領(lǐng)域名.子系統(tǒng)名.層名(最好都采用標(biāo)準(zhǔn)的英文命名,切記中文拼音以及二義性詞語(yǔ)命名)
-
SV辩诞、DAO坎弯、ACTION的類(lèi)名命名規(guī)范
** 命名規(guī)范推薦:**以英文單詞取名,首字母必須大寫(xiě)译暂,多個(gè)英文單詞以大寫(xiě)字母間隔抠忘,避免使用單詞的縮寫(xiě),除非它的縮寫(xiě)已經(jīng)廣為人知外永,如HTTP崎脉。類(lèi)名中不允許'_'、 '-'等符號(hào)伯顶。
- 1) SV接口和實(shí)現(xiàn)類(lèi)命名規(guī)范
接口類(lèi):xxxSV.java囚灼;
實(shí)現(xiàn)類(lèi):xxxSVImpl.java- 2) DAO接口和實(shí)現(xiàn)類(lèi)命名規(guī)范
接口類(lèi):xxxDAO.java;
實(shí)現(xiàn)類(lèi):xxxDAOImpl.java- 3) ACTION接口和實(shí)現(xiàn)類(lèi)命名規(guī)范
類(lèi)名:xxxACTION.java
-
參數(shù)的命名規(guī)范
- 1) 基本類(lèi)型的變量
基本類(lèi)型有int祭衩、long灶体、boolean、double掐暮、short蝎抽、float在定義變量時(shí),需要體現(xiàn)出基本對(duì)象是什么類(lèi)型路克。
單個(gè)對(duì)象在定義的變量后加上基本類(lèi)型首字母大寫(xiě) : int abcI = 0 ; long abcL = 0L ;
數(shù)組對(duì)象在定義的變量后加上基本類(lèi)型的首字母大寫(xiě)和大寫(xiě)的“S” : int[] abcIS = {0,1} ; Long[] abcLS ={0L ,1L} ;
* **2) 單個(gè)變量命名規(guī)范**
> 直接將收字母小寫(xiě)织中,其他不變
參數(shù)名稱(chēng)需要體現(xiàn)出屬性代表的意義 :“prodInstIdList”,此參數(shù)是個(gè)List锥涕,存放的是產(chǎn)品實(shí)例ID
StringBuffer prodInstIdStringBuffer = new StringBuffer();
String prodInstIdString = "";
List prodInstIdList = new ArrayList();
Set prodInstIdSet = new HashSet();
Map prodInstIdMap = new HashMap();
-
3) 數(shù)組命名規(guī)范
若定義類(lèi)前有“I”,需要去除“I”后首字母小寫(xiě)狭吼;如果沒(méi)有“I”,直接首字母小寫(xiě)殖妇。結(jié)尾統(tǒng)一使用小寫(xiě)“s”結(jié)尾刁笙。
GbatchQurryParameterInfoBean[] gbatchQurryParameterInfoBeans = null;
IgbatchQurryParameterInfoValue[] gbatchQurryParameterInfoValues = null; -
4) 類(lèi)引用對(duì)象名稱(chēng)命名規(guī)范
在方法中,如果使用到其他服務(wù)的方法谦趣,需要通過(guò)ServiceFactory.getService方法獲取相應(yīng)的對(duì)象疲吸。對(duì)象命名格式采用統(tǒng)一標(biāo)準(zhǔn),接口類(lèi)名去除“I”后首字母小寫(xiě)前鹅,具體如下:
IOrderQuerySV orderQuerySV = (IOrderQuerySV)ServiceFactory.getService(IOrderQuerySV.class);
-
5) 方法名稱(chēng)命名規(guī)范
方法命名時(shí)摘悴,需要表明此方法的處理的功能,并且首字母小寫(xiě)舰绘。例如:dealXml蹂喻,可以從方法名稱(chēng)看出是處理XML報(bào)文的方法。
表的操作方法需要體現(xiàn)出操作類(lèi)型I捂寿、 單個(gè)和批量保存方法
例如:saveBean/saveBeans
II口四、 查詢(xún)方法
例如:queryBeansByMap 不要用getBeansByMap
III、 更新方法
例如:updateBean
IV秦陋、 刪除方法
例如:deleteBean
2蔓彩、格式規(guī)范
TAB空格的數(shù)量。編輯器上的TAB空格數(shù)量統(tǒng)一取值為4驳概;
換行赤嚼, 每行120字符;
if語(yǔ)句的嵌套層數(shù)3層以?xún)?nèi)顺又。If和else if更卒、else 配合使用時(shí),如果超過(guò)三個(gè)待榔,改成switch…case…實(shí)現(xiàn)逞壁;
匿名內(nèi)部類(lèi)20行以?xún)?nèi),太長(zhǎng)的匿名內(nèi)部類(lèi)影響代碼可讀性锐锣,建議重構(gòu)為命名的(普通)內(nèi)部類(lèi)腌闯;
文件長(zhǎng)度2000行以?xún)?nèi);
方法長(zhǎng)度150行以?xún)?nèi)雕憔;
邏輯上相關(guān)序代碼與其前后之程序代碼間應(yīng)以空白行加以分隔姿骏;在注釋段與程序段、以及不同程序段插入空行斤彼。提高可讀性分瘦;
方法(構(gòu)造器)參數(shù)在5個(gè)以?xún)?nèi) 蘸泻,太多的方法(構(gòu)造器)參數(shù)影響代碼可讀性〕懊担考慮用值對(duì)象代替這些參數(shù)或重新設(shè)計(jì)悦施;
布爾表達(dá)式中的布爾運(yùn)算符(&&,||)的個(gè)數(shù)每行不超過(guò)3個(gè),超過(guò)3個(gè)去团,可以“&&抡诞,||”打頭換行;
-
if和for土陪、while等關(guān)鍵字的排版規(guī)范:
關(guān)鍵字后需要以空格隔開(kāi)昼汗,if、for鬼雀、while后面包含的內(nèi)容需要用“{}”包括
代碼禁止使用“Ctrl+Shift+F”進(jìn)行(如果自定義了長(zhǎng)度之后顷窒,按照個(gè)人習(xí)慣,可以很好的使用);
3源哩、調(diào)用規(guī)范
4鞋吉、異常拋出規(guī)范
在SV層方法中原則上不允許捕獲異常,先拋出Exception璧疗,再拋出RemoteException異常(如果涉及RemoteException異常)坯辩。
在DAO層方法中原則上不允許捕獲異常,只需要拋出Exception異常崩侠。
在WEB層不允許拋出異常漆魔,必須捕獲,包含在JSP却音、ACTION等中改抡。
當(dāng)捕獲異常之后,嚴(yán)謹(jǐn)再次拋出異常系瓢,因?yàn)檫@樣會(huì)隱藏真正異常的位置阿纤,導(dǎo)致查找問(wèn)題難度增加。
5夷陋、日志打印規(guī)范
常用的文本日志,采用的Log文本日志類(lèi)骗绕,在調(diào)用方式上采用統(tǒng)一的格式規(guī)范藐窄,下面將給出如何定義對(duì)象,如果打印日志
- 定義類(lèi)屬性對(duì)象酬土,并且是靜態(tài)最終不可修改對(duì)象荆忍;
private static final Log log = LogFactory.getLog(FixNetSmsSVImpl.class);
- 調(diào)用時(shí),需要注意需要判斷是否是此級(jí)別的日志,如果不是刹枉,不要進(jìn)入打印方法叽唱,提高調(diào)用效率。
if (log.isErrorEnabled()) {
log.error("根據(jù)策劃實(shí)例ID:" + offerInstId + " 微宝、用戶(hù)編號(hào):" + memInsUserValue.getUserId() + " 產(chǎn)品實(shí)例數(shù)據(jù)有誤棺亭!");
}
6、sql變量綁定
代碼開(kāi)發(fā)時(shí)對(duì)于可使用綁定變量的SQL必須使用綁定變量芥吟,對(duì)于特殊SQL侦铜,如使用IN(1,2,3)方式的,采用判斷IN的數(shù)量钟鸵,對(duì)于小于5個(gè)值的,也全部使用綁定變量涤躲,以減少數(shù)據(jù)庫(kù)硬解析(硬解析容易產(chǎn)生大量的HARD PARSE棺耍,并造成library cache pin等待,對(duì)數(shù)據(jù)庫(kù)性能造成影響)种樱,從而提高處理性能蒙袍。
對(duì)于SQL中的使用到的表字段,如字段在ivalue類(lèi)中定義嫩挤,必須使用ivalue類(lèi)中的定義害幅,避免直接使用字段名的情況,以在表結(jié)構(gòu)變更時(shí)能夠快速的定位到影響到的代碼岂昭,增強(qiáng)程序的可維護(hù)性以现。
備注:SQL使用IN時(shí),IN的參數(shù)如果非表關(guān)聯(lián)查詢(xún)時(shí)约啊,參數(shù)最大值是1000邑遏,超過(guò)1000會(huì)出現(xiàn)錯(cuò)誤。
7恰矩、對(duì)象判斷
- 數(shù)據(jù)對(duì)象是否為空判斷方法
String[] bbb = null;
if ( null == bbb || bbb.length < 1 )
- 單個(gè)對(duì)象判斷是否為空方法
if ( null == aaa || "".equals(aaa) )
- 對(duì)象比較
基本類(lèi)型使用“==”记盒,其他的類(lèi)對(duì)象比較使用equals