后端開發(fā)規(guī)范
SOA服務(wù)接口規(guī)范
1、SOA接口命名提供出去后不能變更,廢棄接口使用@deprecated進(jìn)行標(biāo)記
2、SOA接口出入?yún)⒍x為一個(gè)大對(duì)象,且出入?yún)?shù)不能刪除,只能增加,廢棄字段使用@deprecated進(jìn)行標(biāo)記
一般規(guī)范
- 開發(fā)必須會(huì)使用樂觀鎖。樂觀鎖不要采用有意義的字段,考慮用version字段
- 設(shè)計(jì)表結(jié)構(gòu)慎用大字段。注意控制輸入不要超過字段長(zhǎng)度,或者截段
- mysql盡量少用join查詢;分庫(kù)的不要用,其他情況酌情處理
- 分頁頁面展示不超過10。提供接口查詢量大,必須分頁
- 緩存。所有的讀操作,必須考慮緩存。 緩存key必須是唯一的,緩存時(shí)間根據(jù)實(shí)際情況設(shè)置,key值要有業(yè)務(wù)意義;做+ 設(shè)計(jì)的時(shí)候告知需求方,我們使用緩存的影響。緩存配置要考慮默認(rèn)值,如取不到數(shù)據(jù),使用默認(rèn)值。且不能影響正常業(yè)務(wù);考慮后臺(tái)能夠隨時(shí)清理緩存。redis manage
- 所有的定時(shí)任務(wù)考慮是否支持多進(jìn)程的,是否有補(bǔ)跑機(jī)制. 考慮使用多頻率調(diào)用的方法處理數(shù)據(jù)。避免集中式爆發(fā);單臺(tái)機(jī)器多線程加上原子控制,集群指定服務(wù)器ip跑定時(shí)任務(wù)。
- 批量操作,一定要使用分批處理。批處理中一定要考慮間隔和上限,1000條做一次
- 設(shè)計(jì)表時(shí)要加上以下字段:create_time、creator_id、creator、last_modified、modified_id、modified_by、is_deleted如是日志表考慮client_ip、server_ip
- 是否所有頁面上的功能都考慮了多瀏覽器環(huán)境支持(必須支持火狐,chrome)
- 對(duì)數(shù)據(jù)唯一性要求很高的話,考慮唯一索引
- 接口返回盡量要保證冪等
- 頁面提交按鈕必須防呆。(如考慮遮罩)
- 源文件編碼格式為UTF-8
- Long與Ineger大小比較,用equals方法,或者先使用longValue()或intValue()方法來得到他們的基本類型的值然后使用==比較也是可以的。
命名規(guī)范
- 使用駝峰命名法,方法名以動(dòng)詞開頭;類命名如:HelloWorld。變量命名如:headCount。常量命名應(yīng)使用CONSTANT_CASE格式(譯注:所有字母大寫,單詞使用下劃線分隔)。(final, static)
- controller層以Controller結(jié)尾,Service層以Service結(jié)尾,實(shí)現(xiàn)類以ServiceImpl結(jié)尾,Dao層以Dao結(jié)尾,實(shí)現(xiàn)類以**DaoImpl結(jié)尾
- 工具類以Utils結(jié)尾,并放到單獨(dú)的包如:common,utils
- 方法命名:dao層如果是單條查詢請(qǐng)用get開頭,如:getOperatorById,查詢集合通過find*list開頭,findMerchantListByOperatorId;get單表單條數(shù)據(jù);find..List單表list;query多表對(duì)象;query..List多表list ;新增用insert開頭,更新用update開頭,刪除用delete開頭,Service層方法命名根據(jù)具體業(yè)務(wù)來,見名知意,如取消訂單,cancelOrder。
- 參數(shù)的命名:參數(shù)的名字必須和變量的命名規(guī)范一致。使用有意義的參數(shù)命名,如果可能的話,使用和要賦值的字段一樣的名字:
- sql文件以*_mapper.xml結(jié)尾 ,如order_mapper.xml
- jsp與html文件名全部小寫,單詞之間用_隔開,如:order_list.jsp
- model層:持久層對(duì)象必須和表名一致,表現(xiàn)層對(duì)象一律使用 vo(Value Object)結(jié)尾。用(request,response)結(jié)尾
- 關(guān)于屬性的定義,數(shù)組定義為:xxxs,列表定義為xxxList
編碼原則
- 所有問題要采用縮進(jìn)風(fēng)格編寫,縮進(jìn)的空格數(shù)為4個(gè)
- 不允許把多個(gè)短語句寫在一行中,即一行只寫一條語句
- 相對(duì)獨(dú)立的程序塊之間、變量說明之后必須加空行
- 必須要有注釋,源程序注釋量必須在30%以上,注釋可根據(jù)需要列出:作者、內(nèi)容、功能、與其它類的關(guān)系等。功能詳細(xì)描述部分說明該類或者接口的功能、作 用、使用方法和注意事項(xiàng),每次修改后增加作者和更新版本號(hào)和日期。方法內(nèi)的單行注釋用//,其他都用/** 。。。*/
- 不允許提交編譯報(bào)錯(cuò)和帶黃色警告的代碼。
- 每個(gè)類文件不能超過2000行,每個(gè)方法不能超過150行。代碼寬度150列。
- If-else不應(yīng)嵌套太多,不能超過三層,如果嵌套太多應(yīng)該考慮調(diào)整你的邏輯了或者換種實(shí)現(xiàn)方式嵌套循環(huán)不能超過三層。
- 日志處理,一般的異常情況都需要增加log日志,盡量不要用“System.out.println()”
- 代碼段原則上要放在大括號(hào){}之內(nèi),如果只有一行代碼也必須放在大括號(hào)之中,不允許省略,并且大括號(hào)不允許與其中的代碼段在同一行。
- 不要在controller層做業(yè)務(wù)邏輯,統(tǒng)一在sevice層處理:controller層所做的事情是獲取入?yún)?,做?shù)據(jù)有效性校驗(yàn)。完+ 成后則拼裝DO并傳入service層做業(yè)務(wù)邏 輯處理。
- 對(duì)外接口異常統(tǒng)一返回異常編碼和異常說明,內(nèi)部正確使用異常,不要隨意地就拋出一個(gè)異常,特別是Exception異常。但在try-catch時(shí)盡量捕獲具體異常,最 好不要catch(Exception)這么寫。
- 業(yè)務(wù)使用手動(dòng)事務(wù),后臺(tái)酌情考慮。不允許有大事務(wù)。(事務(wù)的傳播性考慮)aop配置事務(wù)必須指定到方法
- 外部接口調(diào)用需要記錄日志,數(shù)據(jù)表記錄等——提供給外部的接口
- 調(diào)用接口獲得的返回值需要做對(duì)象非空、業(yè)務(wù)邏輯驗(yàn)證等操作;調(diào)用接口的結(jié)果對(duì)象轉(zhuǎn)換成本地定義對(duì)象,避免接口修改通知不及時(shí)引起的系統(tǒng)異常
- 系統(tǒng)功能及數(shù)據(jù)有合適的權(quán)限控制(比如菜單權(quán)限,水平權(quán)限)
- 沒有冗余代碼(特別是一注釋就注釋一大片的那種);面向接口編程
- 沒有硬編碼(如數(shù)據(jù)庫(kù)源配置、跳轉(zhuǎn)URL、魔鬼數(shù)字、通用錯(cuò)誤碼、bean初始化)
- 面向用戶端的接口,必須做安全校驗(yàn)。
- update操作涉及多條或多表數(shù)據(jù)時(shí),確保并發(fā)場(chǎng)景下無死鎖問題,批量更新多表按表名排序,單表按主鍵排序
- 無SQL注入的漏洞(在編寫mybatis的映射語句時(shí),盡量采用“#{xxx}”這樣的格式。若不得不使用“${xxx}”這樣的參數(shù),要手工地做好過濾工作,來防止sql注入 攻擊);不要用like,用SELECT * from end_user where INSTR(user_name,'jun.')
- spring.xml 配置bean一定要有id且唯一(考慮jar包沖突)
- 第三方j(luò)ar 引入是否exclude了和現(xiàn)在有沖突的版本 spring mybatis log4j等
- pom文件,版本控制放到最上面。
接口提供:
- 接口可擴(kuò)展(入?yún)xRequest、出參xxResponse)
- 是否需要支持可重復(fù)調(diào)用
- 是否需要提供回滾接口
- 入?yún)?qiáng)制校驗(yàn)
- dao層考慮水平和垂直拆分的影響(是否需要路由、聚合函數(shù)分頁等如何處理)
- 重要數(shù)據(jù)操作,比如金額一定要有流水,不是簡(jiǎn)單的日志記錄(log總是多多益善)
- 接口層統(tǒng)一返回對(duì)象,異常只能在接口內(nèi)部處理,不能拋出來。返回對(duì)象包含3個(gè)基本屬性。1,返回編號(hào) 2,返回?cái)?shù)據(jù) 3,返回消息
- SoaResponse.java