版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
規(guī)約 2(一)命名規(guī)約 2 (三)格式規(guī)約 5(四)OOP規(guī)約 7(五)集合處理 11(六)并發(fā)處理 13(七)控制語句 16(八)注釋規(guī)約 17(九)其它 18二、異常日志 20(一)異常處理 20 、MySQL規(guī)約 23(一)建表規(guī)約 23(二)索引規(guī)約 25(三)SQL規(guī)約 27(四)ORM規(guī)約 28四、工程規(guī)約 29(一)應用分層 29(二)二方庫規(guī)約 30(三)服務器規(guī)約 32五、安全規(guī)約 33 求越來越高,因為不僅是編程知識點,其它維度的知識付質(zhì)量。比如:數(shù)據(jù)庫的表結(jié)構(gòu)和索引設計缺陷可能帶來險;工程結(jié)構(gòu)混亂導致維護困難;沒有鑒權(quán)的漏洞代碼被容做了引申和解釋;“正例”提倡什么樣的編碼和實現(xiàn)方雷區(qū),以及真實的錯誤案例。本手冊的愿景是碼出質(zhì)量、碼出高效。代碼的字里行間流淌的是軟件生命中的血完成,高效考慮的是降低協(xié)同成本,所謂無規(guī)矩不成方圓,訂交通法規(guī)表面上是要限制行車權(quán),實際上是保障公準絕不是消滅代碼內(nèi)容的創(chuàng)造性、優(yōu)雅性,而是限1.1.02017.2.27(一)命名規(guī)約反例:_name/__name/$Object/name_/name$/Object$反例:DaZhePromotion[打折]/getPingfenByName()[評分]/int某變量=3正例:alibaba/taobao/youku/hangzhou等國際通用的名稱,可視同英文。的相關(guān)命名)DO/BO/DTO/VO等。正例:MarcoPolo/UserDO/XmlService/TcpUdpDeal/TaPromotion反例:macroPolo/UserDo/XMLService/TCPUDPDeal/TAPromotion正例:localValue/getHttpMessage()/inputUserId正例:MAX_STOCK_COUNTCOUNT號是數(shù)組類型的一部分,數(shù)組定義如下:String[]args;反例:定義為基本數(shù)據(jù)類型BooleanisSuccess;的屬性,它的方法也是isSuccess(),RPCing反例:AbstractClass“縮寫”命名成AbsClass;condition“縮寫”命名成condi,此類正例:publicclassOrderFactory;publicclassLoginProxy;publicclassResourceObserver;接口基礎(chǔ)常量表示:StringCOMPANY="alibaba";反例:接口方法定義:publicabstractvoidf();正例:AbstractTranslator實現(xiàn)Translatable。m正例:枚舉名字:DealStatusEnum,成員名稱:SUCCESS/UNKOWN_REASON。/37/37A)Service/DAO層方法命名規(guī)約trtB)領(lǐng)域模型命名規(guī)約4)POJO是DO/DTO/BO/VO的統(tǒng)稱,禁止命名成xxxPOJO。(二)常量定義反例:Stringkey="Id#taobao_"+tradeId;acheputkeyvalue“是”的變量:類A中:publicstaticfinalStringYES="yes";類B中:publicstaticfinalStringYES="y";ant5)類內(nèi)共享常量:直接在類內(nèi)部privatestaticfinal定義。um正例:publicEnum{MONDAY(1),TUESDAY(2),WEDNESDAY(3),THURSDAY(4),FRIDAY(5),SATURDAY(6),SUNDAY(7);}(三)格式規(guī)約現(xiàn)空ifforwhileswitchdo須加空格。請勿勾選Usetabcharacter;而在eclipse中,必須勾選insertspacesfortabs。publicstaticvoidmain(String[]args){Stringsay="hello";//運算符的左右必須有一個空格intflag=0;if(flag==0){System.out.println(say);}//左大括號前加空格且不換行;左大括號后換行if(flag==1){System.out.println("world");號后有else,不用換行}else{System.out.println("ok");//在右大括號后直接結(jié)束,則必須換行}}換行。StringBuffersb=newStringBuffer();sb.append("zi").append("xin")append("huang")append("huang")append("huang");StringBuffersb=newStringBuffer();sb.append("zi").append("xin")...append("huang");method(args1,args2,args3,...,argsX);method("a","b","c");inta=3;longb=4L;floatc=5F;StringBuffersb=newStringBuffer();正例:publicUsergetUsers(Stringtype,Integer...ids)影響。接口過時必須加@Deprecated注解,并清晰地說明采用的新接口或者新服務是什么。該使用雙參數(shù)decode(Stringsource,Stringencode)。接口提供方既然明確是過時接口,equals。正例:"test".equals(object);反例:object.equals("test");Kate】序列化類新增屬性時,請不要修改serialVersionUID字段,避免反序列失??;如果完全不兼容升級,避免反序列化混亂,那么請修改serialVersionUID值。git內(nèi)容的檢查,否則會有拋IndexOutOfBoundsException的風險。Stringstr="a,b,c,,";String[]ary=str.split(",");System.out.println(ary.length);77有方法或保護方法>私有方法>getter/settergetter/setter方法中,盡量不要增加業(yè)務邏輯,增加排查問題的難度。publicIntegergetData(){if(true){returndata+100;}else{returndata-100;}}Stringstr="start";for(intI=0;I<100;i++){str=str+"hello";}ng。finalstatic變量并且與子類共享,必須是protected。rivateate7)類成員方法只供類內(nèi)部調(diào)用,必須是private。8)類成員方法只對繼承類公開,那么限制為protected。(五)集合處理1)只要重寫equals,就必須重寫hashCode。g2.【強制】ArrayList的subList結(jié)果不可強轉(zhuǎn)成ArrayList,否則會拋出ClassCastException異常:java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList;說明:subList返回的是ArrayList的內(nèi)部類SubList,并不是ArrayList,而是ArrayList的一個視圖,對于SubList子列表的所有操作最終會反映到原列表上。加、刪除均產(chǎn)生ConcurrentModificationException異常。4.【強制】使用集合轉(zhuǎn)數(shù)組的方法,必須使用集合的toArray(T[]array),傳入的是類型完全e內(nèi)存空間,并返回新數(shù)組地址;如果數(shù)組元素大于實際所需,下標為[list.size()]的數(shù)組null參數(shù)組大小定義與集合元素List<String>list=newArrayList<String>(2);list.add("guan");list.add("bao");String[]array=newString[list.size()];array=list.toArray(array);類型數(shù)組將出現(xiàn)ClassCastException錯誤。法,它的add/remove/clear方法會拋出UnsupportedOperationException異常。tString[]str=newString[]{"a","b"};Listlist=Arrays.asList(str);第二種情況:str[0]="gujin";那么list.get(0)也會隨之修改。6.【強制】泛型通配符<?extendsT>來接收返回的數(shù)據(jù),此寫法的泛型集合不能使用add方法,而<?superT>不能使用get方法,做為接口調(diào)用賦值時易出錯。說明:擴展說一下PECS(ProducerExtendsConsumerSuper)原則:1)頻繁往外讀取內(nèi)容界Extends。2)經(jīng)常往里插入的,適合用下界Super。List<String>a=newArrayList<String>();a.add("1");a.add("2");for(Stringtemp:a){if("1".equals(temp)){a.remove(temp);}}Iterator<String>it=a.iterator();while(it.hasNext()){Stringtemp=it.next();if(刪除元素的條件){it.remove();}}Collections.sort會報IllegalArgumentException異常。2)x>y,y>z,則x>z。newComparator<Student>(){@Overridepublicintcompare(Studento1,Studento2){returno1.getId()>o2.getId()?1:-1;}}說明:ArrayList盡量使用ArrayList(intinitialCapacity)初始化。集合類KeyValueSuper說明Hashtable不允許為null不允許為nullDictionary線程安全ConcurrentHashMap不允許為null不允許為nullAbstractMap分段鎖技術(shù)TreeMap不允許為null允許為nullAbstractMap線程不安全HashMap允許為null允許為nullAbstractMap線程不安全12.【參考】合理利用好集合的有序性(sort)和穩(wěn)定性(order),避免集合的無序性(unsort)和不穩(wěn)定性(unorder)帶來的負面影響。erunsortHashMapunorderunsortTreeSetorder/sort。(六)并發(fā)處理publicclassTimerTaskThreadextendsThread{publicTimerTaskThread(){super.setName("TimerTaskThread");...}“過度切換”的問題。or。1)FixedThreadPool和SingleThreadPool:允許的請求隊列長度為Integer.MAX_VALUE,可能會堆積大量的請求,從而導致OOM。2)CachedThreadPool和ScheduledThreadPool:允許的創(chuàng)建線程數(shù)量為Integer.MAX_VALUE,可能會創(chuàng)建大量的線程,從而導致OOM。static,必須加鎖,或者使用DateUtils工具類。privatestaticfinalThreadLocal<DateFormat>df=newThreadLocal<DateFormat>(){@OverrideprotectedDateFormatinitialValue(){returnnewSimpleDateFormat("yyyy-MM-dd");}arDateTimeFormatter代替Simpledateformatter,官方給出的解釋:simplebeautifulstrongimmutablethread-safe。薦】使用CountDownLatch進行異步轉(zhuǎn)同步操作,每個線程退出前必須調(diào)用countDownseed導致的性能下降。下,通過雙重檢查鎖(double-checkedlocking)實現(xiàn)延遲初始化的優(yōu)化問題隱患(可參考The"Double-CheckedLockingisBroken"Declaration),推薦問classFoo{privateHelperhelper=null;publicHelpergetHelper(){if(helper==null)synchronized(this){if(helper==null)helper=newHelper();}returnhelper;}//otherfunctionsandmembers...}ntAtomicIntegercount=newAtomicInteger();count.addAndGet(1);如果是JDK8,推(七)控制語句2.【強制】在if/else/for/while/do語句中必須使用大括號,即使只有一行代碼,避免使用下面的形式:if(condition)statements;if(condition){returnobj;}elseifelse//偽代碼如下booleanexisted=(file.open(fileName,"w")!=null)&&(...)||(...);if(existed){}if((file.open(fileName,"w")!=null)&&(...)||(...)){}2)執(zhí)行時間開銷很大的方法,參數(shù)校驗時間幾乎可以忽略不計,但如果因為參數(shù)錯誤導致方法。4)對外提供的開放接口,不管是RPC/API/HTTP接口。限入口。1)極有可能被循環(huán)調(diào)用的方法,不建議對參數(shù)進行校驗。但在方法說明里必須注明外部參2)底層的方法調(diào)用頻度都比較高,一般不校驗。畢竟是像純凈水過濾的最后一道,參數(shù)錯DAOService在同一(八)注釋規(guī)約行,使用//注釋。方法內(nèi)部多行注釋使用/**/注釋,注意與代碼對齊。問題說清楚。專有名詞與關(guān)鍵字保持掉(代碼倉庫保存了歷史代碼)。//putelephantintofridgeput(elephant,fridge);E(九)其它說明:不要在方法體內(nèi)定義:Patternpattern=Pattern.compile(規(guī)則);isXxx法。r5.【強制】獲取當前毫秒數(shù)System.currentTimeMillis();而不是newDate().getTime();ity件、動態(tài)配置屬性(一)異常處理通過catch來處理,比如:IndexOutOfBoundsException,NullPointerException等等。NumberFormatException來實現(xiàn)。正例:if(obj!=null){...}反例:try{obj.method()}catch(NullPointerExceptione){...}n。反例:publicintf(){returnInteger對象};如果為null,自動解箱拋NPE。庫的查詢結(jié)果可能為null。3)集合里的元素即使isNotEmpty,取出的數(shù)據(jù)元素也可能為null。PEt裝isSuccess、“錯誤碼”、“錯誤簡短信息”。區(qū)分unchecked/checked異常,避免直接使用RuntimeException拋出,過的自定義異常,如:DAOException/ServiceException等。13.【參考】避免出現(xiàn)重復的代碼(Don’tRepeatYourself),即DRY原則。privatebooleancheckParam(DTOdto){...}LogjLogbackAPI使用日志框架importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;privatestaticfinalLoggerlogger=LoggerFactory.getLogger(Abc.class);appName_logType_logName.log。logType:日志類型,推薦分類有stats/desc/monitor/visit等;logName:日志描述。這種命名的好處:通過文件名就可知mppserver_monitor_timeZoneConvert.log說明:logger.debug("Processingtradewithid:"+id+"symbol:"+symbol);會執(zhí)行toString()方法,浪費了系統(tǒng)資源,執(zhí)行了上述操作,最終日志卻沒有打印。if(logger.isDebugEnabled()){logger.debug("Processingtradewithid:"+id+"symbol:"+symbol);}logger.debug("Processingtradewithid:{}symbol:{}",id,symbol);正例:<loggername="com.taobao.dubbo.config"additivity="false">正例:logger.error(各類參數(shù)或者對象toString+"_"+e.getMessage(),e);(一)建表規(guī)約正例:getter_admin,task_config,level3_name反例:GetterAdmin,taskConfig,level_3_namex說明:pk_即primarykey;uk_即uniquekey;idx_即index的簡稱。gmt_modified的類型均為date_time類型。正例:tiger_task/tiger_reader/mpp_config聯(lián)查詢。15.【參考】合適的字符存儲長度,不但節(jié)約數(shù)據(jù)庫表空間、節(jié)約索引存儲,更重要的是提升檢人unsignedtinyint龜unsignedsmallintunsignedintunsignedbigint(二)索引規(guī)約。度會高達90%以上,可以使用count(distinctleft(列名,索引長度))/count(*)的區(qū)分度5.【推薦】如果有orderby的場景,請注意利用索引的有序性。orderby最后的字段是組合正例:wherea=?andb=?orderbyc;索引:a_b_c反例:索引中有范圍查找,那么索引有序性無法利用,如:WHEREa>10ORDERBYb;索引SELECTa.*FROM表1a,(selectidfrom表1where條件LIMIT100000,20)bwherea.id=b.id2)ref指的是使用普通的索引(normalindex)。3)range對索引進行范圍檢索。誤認為唯一索引一律需要在應用層通過“先查后插”方式解決。ntcountcountSQLL2.【強制】count(distinctcol)計算該列除NULL之外的不重復行數(shù),注意count(distinctcol1,col2)如果其中一列全為NULL,那么即使另一列有不同的值,也返回為0。NULLSUMgSUMgFROMtable;1)NULL<>NULL的返回結(jié)果是NULL,而不是false。2)NULL=NULL的返回結(jié)果是NULL,而不是true。3)NULL<>1的返回結(jié)果是NULL,而不是true。如果更新學生表中的student_id,同時觸發(fā)成績表中的student_id更新,則為級聯(lián)更新。tSELECTLENGTH("輕松工作");返回為12SELECTCHARACTER_LENGTH("輕松工作");返回為4說明:TRUNCATETABLE在功能上與不帶WHERE子句的DELETE語句相同。p在MyBatisGenerator生成的代碼中,需要進行適當?shù)男薷摹?.【強制】iBATIS自帶的queryForList(StringstatementName,intstart,intsize)不推說明:其實現(xiàn)方式是在數(shù)據(jù)庫取到statementName對應的SQL語句的所有記錄,再通過subListMap<String,Object>map=newHashMap<String,Object>();map.put("start",start);map.put("size",size);段,都進行updatetablesetc1=value1,c2=value2,c3=value3;這是不對的。執(zhí)行SQL上此條件;<isNotEmpty>表示不為空且不為null時執(zhí)行;<isNotNull>表示不為null值時(一)應用分層Web轉(zhuǎn)發(fā),各類基本參數(shù)校驗,或者不復用的業(yè)務簡單處理等。Service層:相對具體的業(yè)務邏輯服務層。Manager層:通用業(yè)務處理層,它有如下特征:1)對第三方平臺封裝的層,預處理返回結(jié)果及轉(zhuǎn)化異常信息;行catch,使用catch(Exceptione)方式,并thrownewDAOException(e),不需要打印日志,因為日志在Manager/Service層一定需要捕獲并打到日志文件中去,如果同臺服務器DO(DataObject):與數(shù)據(jù)庫表結(jié)構(gòu)一一對應,通過DAO層向上傳輸數(shù)據(jù)源對象。DTO(DataTransferObject):數(shù)據(jù)傳輸對象,Service和Manager向外傳輸?shù)膶ο?。BO(BusinessObject):業(yè)務對象。可以由Service層輸出的封裝業(yè)務邏輯的對象。QUERY查詢請求。注:超過2個參數(shù)的查詢封裝,禁止VO(ViewObject):顯示層對象,通常是Web向模板渲染引擎層傳輸?shù)膶ο蟆?二)二方庫規(guī)約正例:com.taobao.jstorm或com.alibaba.dubbo.register2)ArtifactID格式:產(chǎn)品線名-模塊名。語義不重復不遺漏,先到倉庫中心去查證一下。正例:dubbo-client/fastjson-api/jstorm-tool3)Version:詳細規(guī)定參考下方。API,或者增加了能改變產(chǎn)品方向的新功能。2)次版本號:當做了向下兼容的功能性新增(新增類、接口等)。3)修訂號:修復bug,沒有修改方法簽名的功能加強,保持API兼容性。當前版本:1.3.3,那么下一個合理的版本號:1.3.4或1.4.0或2.0.0dependencyresolve后信息比對,如果仲裁結(jié)果完全不一致,那么通過dependency:tree命令,找出差異點,進行<excludes>排除jar包。gframeworkcor
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 餐飲電子版勞務合同
- 駁回民事裁定申請書
- 北京市政府勞動合同續(xù)簽辦法
- 腫瘤放射治療體位固定技術(shù)
- 廣東省仲元中學2024-2025學年九年級上學期期中考試化學試題(含答案)
- 調(diào)研活動心得體會
- 突發(fā)事件應急
- 雙頭應急燈相關(guān)行業(yè)投資方案范本
- 石油鉆采設備相關(guān)項目投資計劃書范本
- 電控多瓶采水器相關(guān)行業(yè)投資規(guī)劃報告
- 總賬會計崗位職責招聘
- GB∕T 17268-2020 工業(yè)用非重復充裝焊接鋼瓶
- 蘇教版二年級數(shù)學上冊《認識線段》課件(市級賽課一等獎)
- 幼兒園:中班美術(shù)活動《柿柿如意》
- 輸電線路初步設計評審要點課件
- (完整word版)小餐飲經(jīng)營食品安全管理制度
- 產(chǎn)后尿潴留的護理個案課件
- 裝配式混凝土結(jié)構(gòu)部件吊裝監(jiān)理細則
- 交通事故傷殘鑒定知識培訓及案例課件
- 地鐵站裝飾施工組織設計(181頁)
- 動火作業(yè)及動火工作票管理規(guī)定
評論
0/150
提交評論