版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
文檔版本:DOCPROPERTY文檔版本2018-09-25DOCPROPERTY商標(biāo)XXXXXX局社會(huì)共治服務(wù)平臺建設(shè)項(xiàng)目詳細(xì)設(shè)計(jì)說明書XXXXXX有限公司XXXXXXXXXXXX局社會(huì)共治服務(wù)平臺建設(shè)項(xiàng)目-詳細(xì)設(shè)計(jì)說明書文檔基本信息文件狀態(tài):[]草稿[√]正式發(fā)布[]正在修改文件標(biāo)識:XXXXXXXXXXXX局社會(huì)共治服務(wù)平臺建設(shè)項(xiàng)目-詳細(xì)設(shè)計(jì)說明書當(dāng)前版本:V1.0作者:張三完成日期:2022年11月修訂記錄版本號作者參與者日期修改說明V0.5張三/2022年11月創(chuàng)建文檔V0.6張三/2022年11月補(bǔ)充接口設(shè)計(jì)V0.7張三/2022年11月調(diào)整文檔目錄結(jié)構(gòu),統(tǒng)一圖片備注。V0.8張三/2022年11月補(bǔ)充輸入輸出、用戶界面設(shè)計(jì)V1.0張三/2022年11月統(tǒng)一調(diào)整文檔格式目錄TOC\o"1-4"\f\u1.引言 社會(huì)共治服務(wù)平臺建設(shè)項(xiàng)目詳細(xì)設(shè)計(jì)說明書名稱縮寫:詳細(xì)設(shè)計(jì)說明書文檔概述本文檔是以項(xiàng)目建設(shè)目標(biāo)和內(nèi)容以及需求規(guī)格說明書、概要設(shè)計(jì)說明書為依據(jù),以文檔的方式闡述本項(xiàng)目各系統(tǒng)模塊的詳細(xì)設(shè)計(jì)內(nèi)容,擬達(dá)到如下2個(gè)主要目的:確保本文檔的設(shè)計(jì)內(nèi)容符合項(xiàng)目建設(shè)目標(biāo)與內(nèi)容,以及滿足用戶的真實(shí)需求。確保本文檔能作為開發(fā)人員進(jìn)行系統(tǒng)編碼的依據(jù)。本文檔的讀者主要分為兩個(gè)主要類別:一類是項(xiàng)目相關(guān)參與人,作為系統(tǒng)的使用者、需求的提出者,通過本文檔能夠明確產(chǎn)品開發(fā)的目標(biāo)以及能夠達(dá)到的程度;另一類是項(xiàng)目技術(shù)實(shí)施的相關(guān)人員,通過本文檔能夠指導(dǎo)編碼人員進(jìn)行系統(tǒng)編碼,指導(dǎo)測試人員進(jìn)行單元測試。修改約束該文檔在正式發(fā)布后,其更新需要甲乙雙方共同確認(rèn)。參考資料《XXXXXXXXXXXX局社會(huì)共治服務(wù)平臺建設(shè)項(xiàng)目需求規(guī)格說明書》《XXXXXXXXXXXX局社會(huì)共治服務(wù)平臺建設(shè)項(xiàng)目概要設(shè)計(jì)說明書》設(shè)計(jì)概述背景介紹黨的十九大報(bào)告指出,打造共建共治共享的社會(huì)治理格局,是中國特色社會(huì)主義進(jìn)入新時(shí)代的客觀要求。市場監(jiān)管是社會(huì)治理的重要組成部分。商事制度改革后,市場主體保持高增長態(tài)勢,新技術(shù)、新業(yè)態(tài)、新模式持續(xù)涌現(xiàn),市場監(jiān)管的難度和復(fù)雜性不斷提升,傳統(tǒng)政府大包大攬模式已無法適應(yīng)監(jiān)管的現(xiàn)實(shí)需求。以科技賦能市場監(jiān)管現(xiàn)代化成為為發(fā)展主線,營造良好科技創(chuàng)新生態(tài),加快構(gòu)建市場監(jiān)管科技創(chuàng)新體系,推動(dòng)社會(huì)共治是共治理念的新發(fā)展。項(xiàng)目背景進(jìn)入新時(shí)代,應(yīng)對機(jī)構(gòu)改革后“一支隊(duì)伍管市場”的新挑戰(zhàn),從單一的部門監(jiān)管走向多元參與的社會(huì)共治,回應(yīng)人民群眾對美好生活的新期待,是新形勢下市場監(jiān)管的大方向。為應(yīng)對這一變化,XXXXXX市場監(jiān)管局提出建設(shè)社會(huì)共治服務(wù)平臺,推進(jìn)XXXXXX市場監(jiān)管共治體系建設(shè)。項(xiàng)目目標(biāo)轉(zhuǎn)變市場秩序及市場安全監(jiān)管治理理念,從政府“單打獨(dú)斗”向“社會(huì)共治”轉(zhuǎn)變,從“事后救火”向“事前預(yù)警”轉(zhuǎn)變,通過市場監(jiān)管社會(huì)共治平臺建設(shè),為通用市場監(jiān)管領(lǐng)域共治場景提供統(tǒng)一共治監(jiān)管應(yīng)用,為個(gè)性共治場景提供統(tǒng)一規(guī)范能力支撐,壓實(shí)市場主體責(zé)任,引導(dǎo)行業(yè)自律,提升主體自治水平,充分發(fā)揮公眾監(jiān)督作用,優(yōu)先實(shí)現(xiàn)食品生產(chǎn)、流通、餐飲、電梯場景社會(huì)共治模式。推動(dòng)構(gòu)建“政府主導(dǎo)、市場主體自治、行業(yè)自律、社會(huì)監(jiān)督”的社會(huì)共治格局。1、鼓勵(lì)企業(yè)自證合規(guī),推動(dòng)構(gòu)建自治自律的社會(huì)共治格局壓實(shí)市場主體責(zé)任,引導(dǎo)行業(yè)自律,提升主體自治水平,推動(dòng)構(gòu)建“政府主導(dǎo)、市場主體自治、行業(yè)自律、社會(huì)監(jiān)督”的社會(huì)共治格局。2、提升社會(huì)監(jiān)督能力,促進(jìn)企業(yè)良性發(fā)展創(chuàng)建消費(fèi)者、社會(huì)公眾的監(jiān)督渠道,通過“他證合規(guī),投訴評價(jià)”促進(jìn)社會(huì)監(jiān)督,樹立好企業(yè)的口碑。3、建立自治、共治體系,推動(dòng)市場監(jiān)管理念轉(zhuǎn)變轉(zhuǎn)變市場秩序及市場安全監(jiān)管治理理念,從政府“單打獨(dú)斗”向“社會(huì)共治”轉(zhuǎn)變,從“事后救火”向“事前預(yù)警”轉(zhuǎn)變,通過市場監(jiān)管社會(huì)共治平臺建設(shè),為通用共治場景提供統(tǒng)一共治監(jiān)管應(yīng)用,為個(gè)性共治場景提供統(tǒng)一能力支撐。通過構(gòu)建監(jiān)管線索反哺日常監(jiān)管和各類專項(xiàng)監(jiān)管。4、形成一套符合云南市場監(jiān)管工作實(shí)際的共治模式機(jī)制保障。建立一套標(biāo)準(zhǔn)規(guī)范,形成共治監(jiān)管機(jī)制。系統(tǒng)架構(gòu)使用圖系統(tǒng)架構(gòu)圖技術(shù)架構(gòu)使用圖技術(shù)架構(gòu)圖部署架構(gòu)使用圖部署架構(gòu)圖系統(tǒng)環(huán)境序號系統(tǒng)名稱用途數(shù)量硬件環(huán)境軟件環(huán)境網(wǎng)絡(luò)環(huán)境1自證合規(guī)應(yīng)用前端應(yīng)用服務(wù)器1云主機(jī):CPU:8核;內(nèi)存:16G;系統(tǒng)盤:100G;數(shù)據(jù)盤:200G;系統(tǒng)版本:CentOS7.564位Nginx1.24.0互聯(lián)網(wǎng)區(qū)2后臺應(yīng)用服務(wù)器1云主機(jī):CPU:8核;內(nèi)存:16G;系統(tǒng)盤:100G;數(shù)據(jù)盤:200G;系統(tǒng)版本:CentOS7.564位;Jdk1.8政務(wù)外網(wǎng)區(qū)3數(shù)據(jù)庫服務(wù)器1云主機(jī):CPU:8核;內(nèi)存:16G;存儲(chǔ)空間:500G系統(tǒng)版本:CentOS7.564位MySQL5.7互聯(lián)網(wǎng)區(qū)出錯(cuò)處理設(shè)計(jì)出錯(cuò)輸出信息錯(cuò)誤碼錯(cuò)誤類型錯(cuò)誤字符描述Err_cfg_info事先沒有配置系統(tǒng)系統(tǒng)提示用戶讓管理員創(chuàng)建配置文檔Err_debug_info調(diào)用外部模型系統(tǒng)出錯(cuò)系統(tǒng)提示用戶檢查調(diào)用地址和參數(shù)Err_doc_info引用的配置文檔改變或者刪除系統(tǒng)提示用戶配置文檔已改變或刪除Err_performent_info系統(tǒng)運(yùn)行出錯(cuò)系統(tǒng)提示出錯(cuò),并給出錯(cuò)誤編號和說明Err_submit_info沒有填寫要求的必要信息而提交對于保存操作,使用域校驗(yàn)公式,或者檢查是否填寫完整;400業(yè)務(wù)異常業(yè)務(wù)異常,消息不能讀取,缺少必要的請求參數(shù),請求參數(shù)類型錯(cuò)誤,請求參數(shù)綁定錯(cuò)誤,參數(shù)校驗(yàn)失敗401請求未授權(quán)客戶端請求未授權(quán)404請求地址錯(cuò)誤404沒找到請求405請求方法錯(cuò)誤不支持當(dāng)前請求方法415媒體類型錯(cuò)誤不支持當(dāng)前媒體類型500服務(wù)器異常服務(wù)器異常出錯(cuò)處理策略故障出現(xiàn)后可能采取的變通措施,包括:1)后備技術(shù)說明準(zhǔn)備采用的后備技術(shù),當(dāng)原始系統(tǒng)數(shù)據(jù)萬一丟失時(shí)啟用的副本的建立和啟動(dòng)的技術(shù),例如周期性地把磁盤信息記錄到磁帶上去就是對于磁盤媒體的一種后備技術(shù)。2)降效技術(shù)說明準(zhǔn)備采用的后備技術(shù),使用另一個(gè)效率稍低的系統(tǒng)或方法來求得所需結(jié)果的某些部分,例如一個(gè)自動(dòng)系統(tǒng)的降效技術(shù)可以是手工操作和數(shù)據(jù)的人工記錄。3)恢復(fù)及再啟動(dòng)技術(shù)說明將使用的恢復(fù)再啟動(dòng)技術(shù),使軟件從故障點(diǎn)恢復(fù)執(zhí)行或使軟件從頭開始重新運(yùn)行的方法。出錯(cuò)處理過程系統(tǒng)關(guān)鍵事務(wù)將由系統(tǒng)進(jìn)行事務(wù)管理,關(guān)鍵事務(wù)如果出錯(cuò)將返回到系統(tǒng)最近完好狀態(tài),保證數(shù)據(jù)安全,不被污染。系統(tǒng)某個(gè)實(shí)例出現(xiàn)故障,此實(shí)例將被鎖定,以利于排查問題;但系統(tǒng)其他應(yīng)用實(shí)例將不受影響可以繼續(xù)工作。質(zhì)量屬性設(shè)計(jì)高可用性要求系統(tǒng)提供7×24小時(shí)的連續(xù)運(yùn)行能力,數(shù)據(jù)存取服務(wù)準(zhǔn)確,不能丟失數(shù)據(jù)。系統(tǒng)具備冗余和容錯(cuò)能力,避免出現(xiàn)系統(tǒng)死鎖、資源耗盡、程序崩潰等故障,具備自動(dòng)糾錯(cuò)和異常報(bào)警功能??蓴U(kuò)展性要求系統(tǒng)設(shè)計(jì)采用分布式數(shù)據(jù)庫技術(shù),支持自動(dòng)化水平拆分、平滑擴(kuò)容、彈性擴(kuò)展、透明讀寫分離、分布式事務(wù)、具備分布式數(shù)據(jù)庫全生命周期的運(yùn)維管控能力,確保數(shù)據(jù)層的可擴(kuò)展性。系統(tǒng)設(shè)計(jì)采用分布式服務(wù)框架和松耦合設(shè)計(jì),支持微應(yīng)用、服務(wù)治理和容量線性擴(kuò)展,在業(yè)務(wù)持續(xù)增長的情況下保障業(yè)務(wù)平穩(wěn)運(yùn)行。系統(tǒng)設(shè)計(jì)采用組件化、迭代化的開發(fā)模式,基于微應(yīng)用構(gòu)建通用服務(wù)中心,支持快速搭建應(yīng)用。性能要求社會(huì)共治門戶提供良好的頁面設(shè)計(jì)與功能交互,在網(wǎng)絡(luò)穩(wěn)定的環(huán)境下,業(yè)務(wù)專網(wǎng)業(yè)務(wù)應(yīng)用操作界面簡單操作的響應(yīng)時(shí)間小于5秒,互聯(lián)網(wǎng)業(yè)務(wù)應(yīng)用操作界面簡單操作的響應(yīng)時(shí)間小于5秒;可恢復(fù)性要求具備事務(wù)回滾功能,可將錯(cuò)誤數(shù)據(jù)恢復(fù)到正確節(jié)點(diǎn),而不影響其他數(shù)據(jù)。接口支持?jǐn)帱c(diǎn)續(xù)傳,與周邊系統(tǒng)數(shù)據(jù)交互出現(xiàn)異常時(shí)自動(dòng)補(bǔ)傳和數(shù)據(jù)校驗(yàn),確保數(shù)據(jù)完整性和一致性。具備成熟的災(zāi)難恢復(fù)功能,提供多種級別的數(shù)據(jù)及應(yīng)用備份能力。兼容性要求系統(tǒng)兼容各種版本的主流瀏覽器,包括IE10+、FireFox、Chrome等常見瀏覽器,客戶端支持常用終端設(shè)備PC(Windows)、手機(jī)和平板(Android)等。整體需求功能列表編號建設(shè)版塊一級功能二級功能功能說明1社會(huì)共治服務(wù)門戶企業(yè)端門戶注冊登錄提供企業(yè)主體用戶注冊及登錄功能,支持用戶注冊、登錄、綁定操作。提供統(tǒng)一的用戶登陸界面,支持電子營業(yè)執(zhí)照認(rèn)證、法人實(shí)名認(rèn)證,事業(yè)單位,外資企業(yè)認(rèn)證、連鎖企業(yè)認(rèn)證。2主體查詢提供企業(yè)相關(guān)信息檢索查詢功能,具體包含企業(yè)主體信息、行政信息、陽光公示信息。支持查看企業(yè)畫像信息。3通知公告提供通知公告、風(fēng)險(xiǎn)預(yù)警、政策法規(guī)等公告信息的查閱。4共治專區(qū)對市場監(jiān)管社會(huì)共治應(yīng)用專區(qū)介紹,如食品安全、特種設(shè)備、藥品安全、重要工業(yè)產(chǎn)品、質(zhì)量安全、知識產(chǎn)權(quán),提供相關(guān)的功能介紹。5信息填報(bào)意見征集、問卷調(diào)查、企業(yè)表單等不同類型表單的填報(bào)。6企業(yè)中心提供共治消息查看、信息反饋、企業(yè)基本信息自主維護(hù)管理,作為企業(yè)自證合規(guī)應(yīng)用入口,可以進(jìn)入到人員管理、主體責(zé)任落實(shí)、服務(wù)能力管理、客體管理等功能。關(guān)鍵技術(shù)基于分布式計(jì)算技術(shù)(1)分布式文件系統(tǒng)提供一個(gè)海量的、可靠的、可擴(kuò)展的數(shù)據(jù)存儲(chǔ)服務(wù),將集群中各個(gè)節(jié)點(diǎn)的存儲(chǔ)能力聚集起來,并能夠自動(dòng)屏蔽軟硬件故障,為用戶提供不間斷的數(shù)據(jù)訪問服務(wù)。支持增量擴(kuò)容和數(shù)據(jù)的自動(dòng)平衡,支持隨機(jī)讀寫和追加寫的操作。(2)任務(wù)調(diào)度為集群系統(tǒng)中的任務(wù)提供調(diào)度服務(wù),同時(shí)支持強(qiáng)調(diào)響應(yīng)速度的在線服務(wù)和強(qiáng)調(diào)處理數(shù)據(jù)吞吐量的離線任務(wù)。自動(dòng)檢測系統(tǒng)中故障和熱點(diǎn),通過錯(cuò)誤重試、針對長尾作業(yè)并發(fā)備份作業(yè)等方式,保證作業(yè)穩(wěn)定可靠地完成。(3)集群監(jiān)控和部署對集群的狀態(tài)和上層應(yīng)用服務(wù)的運(yùn)行狀態(tài)和性能指標(biāo)進(jìn)行監(jiān)控,對異常事件產(chǎn)生警報(bào)和記錄;為運(yùn)維人員提供整個(gè)基礎(chǔ)計(jì)算平臺以及上層應(yīng)用的部署和配置管理,支持在線集群擴(kuò)容、縮容和應(yīng)用服務(wù)的在線升級。(4)分布式系統(tǒng)底層服務(wù)提供分布式環(huán)境下所需要的協(xié)調(diào)服務(wù)、遠(yuǎn)程過程調(diào)用、安全管理和資源管理的服務(wù)。這些底層服務(wù)為上層的分布式文件系統(tǒng)、任務(wù)調(diào)度等模塊提供支持?;谠萍夹g(shù)的計(jì)算和存儲(chǔ)狹義云計(jì)算是指IT基礎(chǔ)設(shè)施的交付和使用模式,指通過網(wǎng)絡(luò)以按需、易擴(kuò)展的方式獲得所需的資源;廣義云計(jì)算是指服務(wù)的交付和使用模式,指通過網(wǎng)絡(luò)以按需、易擴(kuò)展的方式獲得所需的服務(wù)。這種服務(wù)可以是IT和軟件、互聯(lián)網(wǎng)相關(guān)的,也可以是任意其他的服務(wù),它具有超大規(guī)模、虛擬化、可靠安全等獨(dú)特功效。云技術(shù)具有以下特點(diǎn):(1)數(shù)據(jù)安全可靠云計(jì)算提供了最可靠、最安全的數(shù)據(jù)存儲(chǔ)中心,用戶不用再擔(dān)心數(shù)據(jù)丟失、病毒入侵等麻煩。嚴(yán)格的權(quán)限管理策略可以幫助你放心地與你指定的人共享數(shù)據(jù)。(2)客戶端需求低其次,云計(jì)算對用戶端的設(shè)備要求最低,使用起來也最方便。(3)輕松共享數(shù)據(jù)云計(jì)算可以輕松實(shí)現(xiàn)不同設(shè)備間的數(shù)據(jù)與應(yīng)用共享。(4)可能無限多云計(jì)算為使用網(wǎng)絡(luò)提供了幾乎無限多的可能。為存儲(chǔ)和管理數(shù)據(jù)提供了幾乎無限多的空間,也為完成各類應(yīng)用提供了幾乎無限強(qiáng)大的計(jì)算能力。微服務(wù)架構(gòu)服務(wù)架構(gòu)采用一組服務(wù)的方式來構(gòu)建一個(gè)應(yīng)用,服務(wù)獨(dú)立部署在不同的進(jìn)程中,不同服務(wù)通過一些輕量級交互機(jī)制來通信,例如RPC、HTTP等,服務(wù)可獨(dú)立擴(kuò)展伸縮,每個(gè)服務(wù)定義了明確的邊界,不同的服務(wù)甚至可以采用不同的編程語言來實(shí)現(xiàn),由獨(dú)立的團(tuán)隊(duì)來維護(hù),具備如下幾個(gè)特征:(1)通過服務(wù)實(shí)現(xiàn)組件化傳統(tǒng)實(shí)現(xiàn)組件的方式是通過庫(library),傳統(tǒng)組件是和應(yīng)用一起運(yùn)行在進(jìn)程中,組件的局部變化意味著整個(gè)應(yīng)用的重新部署。通過服務(wù)來實(shí)現(xiàn)組件,意味著將應(yīng)用拆散為一系列的服務(wù)運(yùn)行在不同的進(jìn)程中,那么單一服務(wù)的局部變化只需重新部署對應(yīng)的服務(wù)進(jìn)程。另外將服務(wù)作為組件可以更明確的定義出組件的邊界,因?yàn)榉?wù)之間的調(diào)用是跨進(jìn)程的,清晰的邊界和職責(zé)定義是設(shè)計(jì)時(shí)必須考慮的。(2)按業(yè)務(wù)能力來劃分服務(wù)與組織團(tuán)隊(duì)傳統(tǒng)開發(fā)方式中,我們將工程師按技能專長分層為前端層、中間層、數(shù)據(jù)層,前端對應(yīng)的角色為UI、頁面構(gòu)建師等,中間層對應(yīng)的角色為服務(wù)端業(yè)務(wù)開發(fā)工程師,數(shù)據(jù)層對應(yīng)著DBA等角色。事實(shí)上傳統(tǒng)應(yīng)用設(shè)計(jì)架構(gòu)的分層結(jié)構(gòu)正反應(yīng)了不同角色的溝通結(jié)構(gòu)。而微服務(wù)架構(gòu)的開發(fā)模式不同于傳統(tǒng)方式,它將應(yīng)用按業(yè)務(wù)能力來劃分為不同的服務(wù),每個(gè)服務(wù)都要求在對應(yīng)業(yè)務(wù)領(lǐng)域的全棧(從前端到后端)軟件實(shí)現(xiàn),從界面到數(shù)據(jù)存儲(chǔ)到外部溝通協(xié)作等等。因此團(tuán)隊(duì)的組織是跨功能的,包含實(shí)現(xiàn)業(yè)務(wù)所需的全面的技能。近年興起的全棧工程師正是因?yàn)榧軜?gòu)和開發(fā)模式的轉(zhuǎn)變而出現(xiàn),當(dāng)然具備全棧的工程師其實(shí)很少,但將不同領(lǐng)域的工程師組織為一個(gè)全棧的團(tuán)隊(duì)就容易的多。(3)服務(wù)即產(chǎn)品傳統(tǒng)的應(yīng)用開發(fā)都是基于項(xiàng)目模式的,開發(fā)團(tuán)隊(duì)根據(jù)一堆功能列表開發(fā)出一個(gè)軟件應(yīng)用并交付給客戶后,該軟件應(yīng)用就進(jìn)入維護(hù)模式,由另一個(gè)維護(hù)團(tuán)隊(duì)負(fù)責(zé),開發(fā)團(tuán)隊(duì)的職責(zé)結(jié)束。而微服務(wù)架構(gòu)的倡導(dǎo)者提議避免采用這種項(xiàng)目模式,更傾向于讓開發(fā)團(tuán)隊(duì)負(fù)責(zé)整個(gè)產(chǎn)品的全部生命周期。(4)智能終端與啞管道微服務(wù)架構(gòu)拋棄了ESB過度復(fù)雜的業(yè)務(wù)規(guī)則編排、消息路由等。服務(wù)作為智能終端,所有的業(yè)務(wù)智能邏輯在服務(wù)內(nèi)部處理,而服務(wù)間的通信盡可能的輕量化,不添加任何額外的業(yè)務(wù)規(guī)則。(5)去中心統(tǒng)一化傳統(tǒng)應(yīng)用中傾向采用統(tǒng)一的技術(shù)平臺或產(chǎn)品來解決所有問題。不是每個(gè)問題都是釘子,也不是每個(gè)解決方案都是一個(gè)錘子。問題有其具體性,解決方案也應(yīng)有其針對性。用最適合的技術(shù)方案去解決具體的問題,在大一統(tǒng)的傳統(tǒng)應(yīng)用中其實(shí)很難做到,而微服務(wù)的架構(gòu)意味著,你可以針對不同的業(yè)務(wù)服務(wù)特征選擇不同的技術(shù)平臺或產(chǎn)品,有針對性的解決具體的業(yè)務(wù)問題。(6)基礎(chǔ)設(shè)施自動(dòng)化單一進(jìn)程的傳統(tǒng)應(yīng)用被拆分為一系列的多進(jìn)程服務(wù)后,意味著開發(fā)、調(diào)試、測試、集成、監(jiān)控和發(fā)布的復(fù)雜度都會(huì)相應(yīng)增大。必須要有合適的自動(dòng)化基礎(chǔ)設(shè)施來支持微服務(wù)架構(gòu)模式,否則開發(fā)、運(yùn)維成本將大大增加。(7)Designforfailure正因?yàn)閷⒎?wù)獨(dú)立在不同的進(jìn)程中后,引入了額外的失敗因素。任何時(shí)刻對服務(wù)的調(diào)用都可能因?yàn)榉?wù)方不可用導(dǎo)致失敗,這就要求服務(wù)的消費(fèi)方需要優(yōu)雅的處理此類錯(cuò)誤。這其實(shí)是相對傳統(tǒng)應(yīng)用開發(fā)方式的一個(gè)缺點(diǎn),不過隨著一些開源服務(wù)化框架的出現(xiàn),對業(yè)務(wù)開發(fā)人員而言適當(dāng)?shù)钠帘瘟祟愃频腻e(cuò)誤處理,不過開發(fā)人員依然需要知道對服務(wù)的調(diào)用是完全不同于進(jìn)程內(nèi)的方法或函數(shù)調(diào)用的。(8)進(jìn)化設(shè)計(jì)一旦采用了微服務(wù)架構(gòu)模式,那么在服務(wù)需要變更時(shí)我們要特別小心,服務(wù)提供者的變更可能引發(fā)服務(wù)消費(fèi)者的兼容性破壞,時(shí)刻謹(jǐn)記保持服務(wù)契約(接口)的兼容性。業(yè)界流行的阿里的框架dubbo以及淘寶內(nèi)部的HSF,Navi-rpc都可以看做微服務(wù)化框架的雛形,加上服務(wù)治理中心的管理、基礎(chǔ)交付設(shè)施的保障就可以構(gòu)成完整的一套微服務(wù)框架。整體架構(gòu)如下圖,他由服務(wù)發(fā)布者、調(diào)用者和治理中心三者組成,屬于標(biāo)準(zhǔn)的協(xié)調(diào)者模式。微服務(wù)整體框架生產(chǎn)者中服務(wù)邏輯在Spring或者Guice等IoC框架的bean中,由IoC容器托管,為了符合模塊即服務(wù)的思想,在框架層級實(shí)現(xiàn)了一套可插拔組件的引擎,去實(shí)現(xiàn)組件的掃描,需要暴露服務(wù)的發(fā)布出來,依賴別的服務(wù)的,通過字節(jié)碼技術(shù)生成Rpc調(diào)用代理Stub,形成了一個(gè)基于組件的容器,通過JSR315這個(gè)規(guī)范的SPI實(shí)現(xiàn)對接到J2EE容器,下面的消費(fèi)者結(jié)構(gòu)相同。在服務(wù)啟動(dòng)后,首先會(huì)第一步注冊自己到服務(wù)治理中心,上傳自己的契約、版本上去,治理中心如果通過檢查就發(fā)布出去,之后和治理中心通過長連接協(xié)議(我們采用websocket,因?yàn)楝F(xiàn)成、簡單)做一個(gè)訂閱發(fā)布的通道,可以供收集狀態(tài),推送服務(wù)Endpint的變更;服務(wù)消費(fèi)者可以去治理中心或者M(jìn)aven倉庫獲取契約、SDK,治理中心推送Endpoint下來,供路由進(jìn)行Rpc調(diào)用,通過消費(fèi)者也通過長連接協(xié)議來進(jìn)行狀態(tài)和統(tǒng)計(jì)信息的上報(bào),供治理中心進(jìn)行分析決策和反饋。服務(wù)治理中心為了保證高可用性,通常使用Zookeeper這個(gè)流行的開源的基于Paxos的方案,當(dāng)然最近漸漸流行起來的kebernetes的etcd是基于Raft的集群共享數(shù)據(jù)、也可以做服務(wù)的發(fā)現(xiàn)的解決方案。隨著這種分布式調(diào)用越來越頻繁,就需要服務(wù)治理能力越來越強(qiáng),否則就是一張混亂的、無序的Rpc調(diào)用的網(wǎng),無法管理復(fù)雜度。這里建立了服務(wù)治理的模型,在下圖中的服務(wù)治理中心來實(shí)現(xiàn),模型從這樣幾個(gè)角度來考慮如何治理服務(wù),包括通信、契約、版本、監(jiān)控、安全、交付等角度,依托服務(wù)治理中心,有了這套基礎(chǔ)設(shè)施保駕護(hù)航,服務(wù)化就可以真正做到提高研發(fā)效率、提供優(yōu)雅的開發(fā)體驗(yàn)。服務(wù)治理模型DOA面向數(shù)據(jù)的體系結(jié)構(gòu)面向數(shù)據(jù)的體系結(jié)構(gòu)(DOA,DataOrientedArchitecture),建立在云計(jì)算的硬件架構(gòu)之上,采用“面向數(shù)據(jù)和以數(shù)據(jù)為核心”的思想,通過數(shù)據(jù)注冊中心(DRC,DataRegisterCenter),數(shù)據(jù)權(quán)限中心(DAC,DataAuthorityCenter),數(shù)據(jù)異常控制中心(DEC,DataExceptionControlCenter)來統(tǒng)一定義數(shù)據(jù)、管理數(shù)據(jù)和提供數(shù)據(jù)服務(wù),通過數(shù)據(jù)應(yīng)用單元(DAUs,DataApplicationUnits)對各種應(yīng)用進(jìn)行管理和服務(wù),建立一種數(shù)據(jù)大平臺與碎片化應(yīng)用的數(shù)據(jù)生態(tài)系統(tǒng),構(gòu)建起從數(shù)據(jù)保護(hù)到授權(quán)應(yīng)用的整套機(jī)制,為有效解決大數(shù)據(jù)時(shí)代所面臨軟件體系結(jié)構(gòu)的問題提供基礎(chǔ)理論和方法技術(shù)支撐。大數(shù)據(jù)時(shí)代下的廣義數(shù)據(jù),是真實(shí)世界映射成虛擬世界的各種類型的數(shù)據(jù),應(yīng)用則是由政府、企業(yè)和個(gè)人在互聯(lián)網(wǎng)和移動(dòng)互聯(lián)網(wǎng)中隨時(shí)隨地、隨心隨意的各種需求產(chǎn)生出的碎片化和個(gè)性化的應(yīng)用。數(shù)據(jù)生態(tài)系統(tǒng)可以簡單形象地比喻為“肥沃的數(shù)據(jù)土壤上生長著茂盛的應(yīng)用森林”。理解為:將不斷積累和豐富的各種數(shù)據(jù)定義為數(shù)據(jù)土壤,那么建立在數(shù)據(jù)之上的各種碎片化、個(gè)性化和不斷增長的應(yīng)用則是應(yīng)用森林。應(yīng)用森林中的某一棵應(yīng)用之樹是具有生命周期的,可能會(huì)被淘汰或死亡,但整個(gè)森林是生態(tài)的、枝繁葉茂的和可持續(xù)發(fā)展的。一個(gè)生態(tài)系統(tǒng)的好壞取決于這個(gè)生態(tài)系統(tǒng)的構(gòu)成和運(yùn)行機(jī)制,而面向數(shù)據(jù)的軟件體系結(jié)構(gòu)(DOA)就是探索一種解決數(shù)據(jù)與應(yīng)用之間自生長、自適應(yīng)、自管理和可持續(xù)發(fā)展的機(jī)制,也包括數(shù)據(jù)的安全機(jī)制和應(yīng)用中數(shù)據(jù)的授權(quán)使用機(jī)制。數(shù)據(jù)注冊中心(DRC),是DOA的核心部件,通過它來構(gòu)建邏輯的數(shù)據(jù)資源池,并管理數(shù)據(jù)和提供數(shù)據(jù)服務(wù)。DRC按照統(tǒng)一標(biāo)準(zhǔn)進(jìn)行設(shè)計(jì),可以將各個(gè)行業(yè)或不同規(guī)模的DRC進(jìn)行互聯(lián)和關(guān)聯(lián),從而可以構(gòu)成更大規(guī)模的DOA系統(tǒng)。數(shù)據(jù)權(quán)限中心(DAC),是DOA的關(guān)鍵部件,對數(shù)據(jù)的安全存儲(chǔ)、傳輸及應(yīng)用授權(quán)進(jìn)行管理。對數(shù)據(jù)實(shí)行“天生加密、授權(quán)使用”的機(jī)制,將數(shù)據(jù)分成存儲(chǔ)和傳輸時(shí)保持加密的“數(shù)據(jù)態(tài)”和在應(yīng)用中授權(quán)使用時(shí)解密的“應(yīng)用態(tài)”,充分保證數(shù)據(jù)的安全及使用的授權(quán)。數(shù)據(jù)異常控制中心(DEC),是DOA的重要部件,對數(shù)據(jù)資源池進(jìn)行自適應(yīng)管理,也是數(shù)據(jù)生態(tài)系統(tǒng)的主要構(gòu)成。數(shù)據(jù)應(yīng)用單元(DAUs),是DOA的關(guān)鍵部件,關(guān)聯(lián)應(yīng)用對數(shù)據(jù)的訪問,對各種應(yīng)用提供支持。類似于構(gòu)件系統(tǒng),在數(shù)據(jù)資源池之上,以模塊和積木方式提供應(yīng)用程序接口(API,ApplicationProgrammingInterface),供應(yīng)用系統(tǒng)直接調(diào)用,可以由易到難,由簡到繁地構(gòu)建生態(tài)的應(yīng)用系統(tǒng)。大數(shù)據(jù)分析技術(shù)大數(shù)據(jù)分析技術(shù)是改進(jìn)已有數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)技術(shù),開發(fā)數(shù)據(jù)網(wǎng)絡(luò)挖掘、特異群組挖掘、圖挖掘等新型數(shù)據(jù)挖掘技術(shù);突破基于對象的數(shù)據(jù)連接、相似性連接等大數(shù)據(jù)融合技術(shù),突破用戶興趣分析、網(wǎng)絡(luò)行為分析、情感語義分析等面向領(lǐng)域的大數(shù)據(jù)挖掘技術(shù)。大數(shù)據(jù)挖掘就是從大量的、不完全的、有噪聲的、模糊的、隨機(jī)的實(shí)際應(yīng)用數(shù)據(jù)中,提取隱含在其中的、人們事先不知道的、但又是潛在有用的信息和知識的過程。與傳統(tǒng)數(shù)據(jù)分析相比,用于大數(shù)據(jù)分析的數(shù)據(jù)集合主要有三點(diǎn)區(qū)別:首先,傳統(tǒng)模式多通過采樣方式獲得部分?jǐn)?shù)據(jù)用于分析,大數(shù)據(jù)可以對收集到的所有海量數(shù)據(jù)進(jìn)行分析,分析用的數(shù)據(jù)源由采樣數(shù)據(jù)擴(kuò)展至全部數(shù)據(jù);其次,分析用的數(shù)據(jù)源從傳統(tǒng)單一領(lǐng)域的數(shù)據(jù)擴(kuò)展到跨領(lǐng)域數(shù)據(jù),大數(shù)據(jù)可以將不同領(lǐng)域的數(shù)據(jù)組合后進(jìn)行分析;再次,傳統(tǒng)數(shù)據(jù)分析更關(guān)注數(shù)據(jù)源與分析結(jié)果間的因果關(guān)系,大數(shù)據(jù)分析時(shí)數(shù)據(jù)源與分析結(jié)果間不再只是因果關(guān)系,基于有相關(guān)關(guān)系的數(shù)據(jù)源同樣可以分析預(yù)測出正確的結(jié)果。大數(shù)據(jù)分析給傳統(tǒng)數(shù)據(jù)分析和處理技術(shù)帶來了很多挑戰(zhàn)。云計(jì)算和開源技術(shù)的發(fā)展推動(dòng)大數(shù)據(jù)落地,分布式存儲(chǔ)、非關(guān)系數(shù)據(jù)庫和并行處理技術(shù)逐漸成為大數(shù)據(jù)應(yīng)用實(shí)施過程中的關(guān)鍵技術(shù)。數(shù)據(jù)可視化技術(shù)(1)支持多種場景的復(fù)雜設(shè)計(jì)模板數(shù)據(jù)可視化的設(shè)計(jì)難點(diǎn)不在于圖表類型的多,而在于如何能在簡單的一頁之內(nèi)讓人讀懂?dāng)?shù)據(jù)之間的層次與關(guān)聯(lián),這就關(guān)系到色彩、布局、圖表的綜合運(yùn)用。通過提供指揮中心、地理分析、實(shí)時(shí)監(jiān)控、匯報(bào)展示等多種場景模版,即便沒有設(shè)計(jì)師的可視化作品也有高設(shè)計(jì)水準(zhǔn)。(2)多種圖表組件,支撐多種數(shù)據(jù)類型的分析展示除針對業(yè)務(wù)展示優(yōu)化過的常規(guī)圖表外,還能夠繪制包括海量數(shù)據(jù)的地理軌跡、地理飛線、熱力分布、地域區(qū)塊、3D地圖、3D地球,地理數(shù)據(jù)的多層疊加。此外還有拓?fù)潢P(guān)系、樹圖等異形圖表供自由搭配。(3)多種數(shù)據(jù)源接入,充分發(fā)揮云大數(shù)據(jù)計(jì)算的能力能夠接入包括云分析型數(shù)據(jù)庫,關(guān)系型數(shù)據(jù)庫,本地上傳和在線API的接入,且支持動(dòng)態(tài)請求。滿足各類大數(shù)據(jù)實(shí)時(shí)計(jì)算、監(jiān)控的需求,充分發(fā)揮大數(shù)據(jù)計(jì)算的能力。(4)圖形化的搭建工具,無需專業(yè)編程人員也可快速實(shí)現(xiàn)提供多種的業(yè)務(wù)模塊級而非圖表組件的Wiget,所見即所得式的配置方式,只需要通過拖拖拽拽,無需編程能力,即可創(chuàng)造出專業(yè)的可視化應(yīng)用。(5)多分辨率適配與發(fā)布方式,滿足不同場合下的使用特別針對拼接大屏端的展示做了分辨率優(yōu)化,能夠適配非常規(guī)拼接分辨率做適配優(yōu)化。創(chuàng)建的可視化應(yīng)用能夠發(fā)布分享,用戶也可以訪問到應(yīng)用,作為對外數(shù)據(jù)業(yè)務(wù)展示的窗口。編碼規(guī)范命名風(fēng)格(1)【強(qiáng)制】代碼中的命名均不能以下劃線或美元符號開始,也不能以下劃線或美元符號結(jié)束。反例:_name/__name/$Object/name_/name$/Object$(2)【強(qiáng)制】代碼中的命名嚴(yán)禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。說明:正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。注意,即使純拼音命名方式也要避免采用。正例:alibaba/taobao/youku/hangzhou等國際通用的名稱,可視同英文。反例:DaZhePromotion[打折]/getPingfenByName()[評分]/int某變量=3(3)【強(qiáng)制】類名使用UpperCamelCase風(fēng)格,必須遵從駝峰形式,但以下情形例外:DO/BO/DTO/VO/AO正例:MarcoPolo/UserDO/XmlService/TcpUdpDeal/TaPromotion反例:macroPolo/UserDo/XMLService/TCPUDPDeal/TAPromotion(4)【強(qiáng)制】方法名、參數(shù)名、成員變量、局部變量都統(tǒng)一使用lowerCamelCase風(fēng)格,必須遵從駝峰形式。正例:localValue/getHttpMessage()/inputUserId(5)【強(qiáng)制】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達(dá)完整清楚,不要嫌名字長。正例:MAX_STOCK_COUNT反例:MAX_COUNT(6)【強(qiáng)制】抽象類命名使用Abstract或Base開頭;異常類命名使用Exception結(jié)尾;測試類命名以它要測試的類的名稱開始,以Test結(jié)尾。(7)【強(qiáng)制】中括號是數(shù)組類型的一部分,數(shù)組定義如下:String[]args;反例:使用Stringargs[]的方式來定義。(8)【強(qiáng)制】POJO類中布爾類型的變量,都不要加is,否則部分框架解析會(huì)引起序列化錯(cuò)誤。反例:定義為基本數(shù)據(jù)類型BooleanisDeleted;的屬性,它的方法也是isDeleted(),RPC框架在反向解析的時(shí)候,“以為”對應(yīng)的屬性名稱是deleted,導(dǎo)致屬性獲取不到,進(jìn)而拋出異常。(9)【強(qiáng)制】包名統(tǒng)一使用小寫,點(diǎn)分隔符之間有且僅有一個(gè)自然語義的英語單詞。包名統(tǒng)一使用單數(shù)形式,但是類名如果有復(fù)數(shù)含義,類名可以使用復(fù)數(shù)形式。正例:應(yīng)用工具類包名為com.alibaba.open.util、類名為MessageUtils(此規(guī)則參考spring的框架結(jié)構(gòu))。(10)【強(qiáng)制】杜絕完全不規(guī)范的縮寫,避免望文不知義。反例:AbstractClass“縮寫”命名成AbsClass;condition“縮寫”命名成condi,此類隨意縮寫嚴(yán)重降低了代碼的可閱讀性。(11)【推薦】為了達(dá)到代碼自解釋的目標(biāo),任何自定義編程元素在命名時(shí),使用盡量完整的單詞組合來表達(dá)其意。正例:從遠(yuǎn)程倉庫拉取代碼的類命名為PullCodeFromRemoteRepository反例:變量inta;的隨意命名方式。(12)【推薦】如果模塊、接口、類、方法使用了設(shè)計(jì)模式,在命名時(shí)體現(xiàn)出具體模式。說明:將設(shè)計(jì)模式體現(xiàn)在名字中,有利于閱讀者快速理解架構(gòu)設(shè)計(jì)理念。正例:publicclassOrderFactory;publicclassLoginProxy;publicclassResourceObserver;(13)【推薦】接口類中的方法和屬性不要加任何修飾符號(public也不要加),保持代碼的簡潔性,并加上有效的Javadoc注釋。盡量不要在接口里定義變量,如果一定要定義變量,肯定是與接口方法相關(guān),并且是整個(gè)應(yīng)用的基礎(chǔ)常量。正例:接口方法簽名:voidf();接口基礎(chǔ)常量表示:StringCOMPANY="alibaba";反例:接口方法定義:publicabstractvoidf();說明:JDK8中接口允許有默認(rèn)實(shí)現(xiàn),那么這個(gè)default方法,是對所有實(shí)現(xiàn)類都有價(jià)值的默認(rèn)實(shí)現(xiàn)。(14)接口和實(shí)現(xiàn)類的命名有兩套規(guī)則:1)【強(qiáng)制】對于Service和DAO類,基于SOA的理念,暴露出來的服務(wù)一定是接口,內(nèi)部的實(shí)現(xiàn)類用Impl的后綴與接口區(qū)別。正例:CacheServiceImpl實(shí)現(xiàn)CacheService接口。2)【推薦】如果是形容能力的接口名稱,取對應(yīng)的形容詞做接口名(通常是–able的形式)。正例:AbstractTranslator實(shí)現(xiàn)Translatable。(15)【參考】枚舉類名建議帶上Enum后綴,枚舉成員名稱需要全大寫,單詞間用下劃線隔開。說明:枚舉其實(shí)就是特殊的常量類,且構(gòu)造方法被默認(rèn)強(qiáng)制是私有。正例:枚舉名字為ProcessStatusEnum的成員名稱:SUCCESS/UNKOWN_REASON(16)【參考】各層命名規(guī)約:1)Service/DAO層方法命名規(guī)約a)獲取單個(gè)對象的方法用get做前綴。b)獲取多個(gè)對象的方法用list做前綴。c)獲取統(tǒng)計(jì)值的方法用count做前綴。d)插入的方法用save/insert做前綴。e)刪除的方法用remove/delete做前綴。f)修改的方法用update做前綴。2)領(lǐng)域模型命名規(guī)約a)數(shù)據(jù)對象:xxxDO,xxx即為數(shù)據(jù)表名。b)數(shù)據(jù)傳輸對象:xxxDTO,xxx為業(yè)務(wù)領(lǐng)域相關(guān)的名稱。c)展示對象:xxxVO,xxx一般為網(wǎng)頁名稱。d)POJO是DO/DTO/BO/VO的統(tǒng)稱,禁止命名成xxxPOJO。常量定義(1)【強(qiáng)制】不允許任何魔法值(即未經(jīng)定義的常量)直接出現(xiàn)在代碼中。反例:Stringkey="Id#taobao_"+tradeId;cache.put(key,value);(2)【強(qiáng)制】long或者Long初始賦值時(shí),使用大寫的L,不能是小寫的l,小寫容易跟數(shù)字1混淆,造成誤解。說明:Longa=2l;寫的是數(shù)字的21,還是Long型的2?(3)【推薦】不要使用一個(gè)常量類維護(hù)所有常量,按常量功能進(jìn)行歸類,分開維護(hù)。說明:大而全的常量類,非得使用查找功能才能定位到修改的常量,不利于理解和維護(hù)。正例:緩存相關(guān)常量放在類CacheConsts下;系統(tǒng)配置相關(guān)常量放在類ConfigConsts下。(4)【推薦】常量的復(fù)用層次有五層:跨應(yīng)用共享常量、應(yīng)用內(nèi)共享常量、子工程內(nèi)共享常量、包內(nèi)共享常量、類內(nèi)共享常量。1)跨應(yīng)用共享常量:放置在二方庫中,通常是client.jar中的constant目錄下。2)應(yīng)用內(nèi)共享常量:放置在一方庫中,通常是modules中的constant目錄下。反例:易懂變量也要統(tǒng)一定義成應(yīng)用內(nèi)共享常量,兩位攻城師在兩個(gè)類中分別定義了表示“是”的變量:類A中:publicstaticfinalStringYES="yes";類B中:publicstaticfinalStringYES="y";A.YES.equals(B.YES),預(yù)期是true,但實(shí)際返回為false,導(dǎo)致線上問題。3)子工程內(nèi)部共享常量:即在當(dāng)前子工程的constant目錄下。4)包內(nèi)共享常量:即在當(dāng)前包下單獨(dú)的constant目錄下。5)類內(nèi)共享常量:直接在類內(nèi)部privatestaticfinal定義。(5)【推薦】如果變量值僅在一個(gè)范圍內(nèi)變化,且?guī)в忻Q之外的延伸屬性,定義為枚舉類。下面正例中的數(shù)字就是延伸信息,表示星期幾。正例:publicEnum{MONDAY(1),TUESDAY(2),WEDNESDAY(3),THURSDAY(4),FRIDAY(5),SATURDAY(6),SUNDAY(7);}代碼格式(1)【強(qiáng)制】大括號的使用約定。如果是大括號內(nèi)為空,則簡潔地寫成{}即可,不需要換行;如果是非空代碼塊則:1)左大括號前不換行。2)左大括號后換行。3)右大括號前換行。4)右大括號后還有else等代碼則不換行;表示終止的右大括號后必須換行。(2)【強(qiáng)制】左小括號和字符之間不出現(xiàn)空格;同樣,右小括號和字符之間也不出現(xiàn)空格。詳見第5條下方正例提示。反例:if(空格a==b空格)(3)【強(qiáng)制】if/for/while/switch/do等保留字與括號之間都必須加空格。(4)【強(qiáng)制】任何二目、三目運(yùn)算符的左右兩邊都需要加一個(gè)空格。說明:運(yùn)算符包括賦值運(yùn)算符=、邏輯運(yùn)算符&&、加減乘除符號等。(5)【強(qiáng)制】采用4個(gè)空格縮進(jìn),禁止使用tab字符。說明:如果使用tab縮進(jìn),必須設(shè)置1個(gè)tab為4個(gè)空格。IDEA設(shè)置tab為4個(gè)空格時(shí),請勿勾選Usetabcharacter;而在eclipse中,必須勾選insertspacesfortabs。正例:(涉及1-5點(diǎn))publicstaticvoidmain(String[]args){//縮進(jìn)4個(gè)空格Stringsay="hello";//運(yùn)算符的左右必須有一個(gè)空格intflag=0;//關(guān)鍵詞if與括號之間必須有一個(gè)空格,括號內(nèi)的f與左括號,0與右括號不需要空格if(flag==0){System.out.println(say);}//左大括號前加空格且不換行;左大括號后換行if(flag==1){System.out.println("world");//右大括號前換行,右大括號后有else,不用換行}else{System.out.println("ok");//在右大括號后直接結(jié)束,則必須換行}}(6)【強(qiáng)制】注釋的雙斜線與注釋內(nèi)容之間有且僅有一個(gè)空格。正例://注釋內(nèi)容,注意在//和注釋內(nèi)容之間有一個(gè)空格。(7)【強(qiáng)制】單行字符數(shù)限制不超過120個(gè),超出需要換行,換行時(shí)遵循如下原則:1)第二行相對第一行縮進(jìn)4個(gè)空格,從第三行開始,不再繼續(xù)縮進(jìn),參考示例。2)運(yùn)算符與下文一起換行。3)方法調(diào)用的點(diǎn)符號與下文一起換行。4)方法調(diào)用時(shí),多個(gè)參數(shù),需要換行時(shí),在逗號后進(jìn)行。5)在括號前不要換行,見反例。正例:StringBuffersb=newStringBuffer();//超過120個(gè)字符的情況下,換行縮進(jìn)4個(gè)空格,點(diǎn)號和方法名稱一起換行sb.append("zi").append("xin")....append("huang")....append("huang")....append("huang");反例:StringBuffersb=newStringBuffer();//超過120個(gè)字符的情況下,不要在括號前換行sb.append("zi").append("xin")...append("huang");//參數(shù)很多的方法調(diào)用可能超過120個(gè)字符,不要在逗號前換行method(args1,args2,args3,...,argsX);(8)【強(qiáng)制】方法參數(shù)在定義和傳入時(shí),多個(gè)參數(shù)逗號后邊必須加空格。正例:下例中實(shí)參的"a",后邊必須要有一個(gè)空格。method("a","b","c");(9)【強(qiáng)制】IDE的textfileencoding設(shè)置為UTF-8;IDE中文件的換行符使用Unix格式,不要使用Windows格式。(10)【推薦】沒有必要增加若干空格來使某一行的字符與上一行對應(yīng)位置的字符對齊。正例:inta=3;longb=4L;floatc=5F;StringBuffersb=newStringBuffer();說明:增加sb這個(gè)變量,如果需要對齊,則給a、b、c都要增加幾個(gè)空格,在變量比較多的情況下,是一種累贅的事情。(11)【推薦】方法體內(nèi)的執(zhí)行語句組、變量的定義語句組、不同的業(yè)務(wù)邏輯之間或者不同的語義之間插入一個(gè)空行。相同業(yè)務(wù)邏輯和語義之間不需要插入空行。說明:沒有必要插入多個(gè)空行進(jìn)行隔開。OOP規(guī)約(1)【強(qiáng)制】避免通過一個(gè)類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法,無謂增加編譯器解析成本,直接用類名來訪問即可。(2)【強(qiáng)制】所有的覆寫方法,必須加@Override注解。說明:getObject()與get0bject()的問題。一個(gè)是字母的O,一個(gè)是數(shù)字的0,加@Override可以準(zhǔn)確判斷是否覆蓋成功。另外,如果在抽象類中對方法簽名進(jìn)行修改,其實(shí)現(xiàn)類會(huì)馬上編譯報(bào)錯(cuò)。(3)【強(qiáng)制】相同參數(shù)類型,相同業(yè)務(wù)含義,才可以使用Java的可變參數(shù),避免使用Object。說明:可變參數(shù)必須放置在參數(shù)列表的最后。(提倡同學(xué)們盡量不用可變參數(shù)編程)正例:publicUsergetUsers(Stringtype,Integer...ids){...}(4)【強(qiáng)制】外部正在調(diào)用或者二方庫依賴的接口,不允許修改方法簽名,避免對接口調(diào)用方產(chǎn)生影響。接口過時(shí)必須加@Deprecated注解,并清晰地說明采用的新接口或者新服務(wù)是什么。(5)【強(qiáng)制】不能使用過時(shí)的類或方法。說明:.URLDecoder中的方法decode(StringencodeStr)這個(gè)方法已經(jīng)過時(shí),應(yīng)該使用雙參數(shù)decode(Stringsource,Stringencode)。接口提供方既然明確是過時(shí)接口,那么有義務(wù)同時(shí)提供新的接口;作為調(diào)用方來說,有義務(wù)去考證過時(shí)方法的新實(shí)現(xiàn)是什么。(6)【強(qiáng)制】Object的equals方法容易拋空指針異常,應(yīng)使用常量或確定有值的對象來調(diào)用equals。正例:"test".equals(object);反例:object.equals("test");說明:推薦使用java.util.Objects#equals(JDK7引入的工具類)(7)【強(qiáng)制】所有的相同類型的包裝類對象之間值的比較,全部使用equals方法比較。說明:對于Integervar=?在-128至127范圍內(nèi)的賦值,Integer對象是在IntegerCache.cache產(chǎn)生,會(huì)復(fù)用已有對象,這個(gè)區(qū)間內(nèi)的Integer值可以直接使用==進(jìn)行判斷,但是這個(gè)區(qū)間之外的所有數(shù)據(jù),都會(huì)在堆上產(chǎn)生,并不會(huì)復(fù)用已有對象,這是一個(gè)大坑,推薦使用equals方法進(jìn)行判斷。(8)關(guān)于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標(biāo)準(zhǔn)如下:1)【強(qiáng)制】所有的POJO類屬性必須使用包裝數(shù)據(jù)類型。2)【強(qiáng)制】RPC方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型。3)【推薦】所有的局部變量使用基本數(shù)據(jù)類型。說明:POJO類屬性沒有初值是提醒使用者在需要使用時(shí),必須自己顯式地進(jìn)行賦值,任何NPE問題,或者入庫檢查,都由使用者來保證。正例:數(shù)據(jù)庫的查詢結(jié)果可能是null,因?yàn)樽詣?dòng)拆箱,用基本數(shù)據(jù)類型接收有NPE風(fēng)險(xiǎn)。反例:比如顯示成交總額漲跌情況,即正負(fù)x%,x為基本數(shù)據(jù)類型,調(diào)用的RPC服務(wù),調(diào)用不成功時(shí),返回的是默認(rèn)值,頁面顯示為0%,這是不合理的,應(yīng)該顯示成中劃線。所以包裝數(shù)據(jù)類型的null值,能夠表示額外的信息,如:遠(yuǎn)程調(diào)用失敗,異常退出。(9)【強(qiáng)制】定義DO/DTO/VO等POJO類時(shí),不要設(shè)定任何屬性默認(rèn)值。反例:POJO類的gmtCreate默認(rèn)值為newDate();但是這個(gè)屬性在數(shù)據(jù)提取時(shí)并沒有置入具體值,在更新其它字段時(shí)又附帶更新了此字段,導(dǎo)致創(chuàng)建時(shí)間被修改成當(dāng)前時(shí)間。(10)【強(qiáng)制】序列化類新增屬性時(shí),請不要修改serialVersionUID字段,避免反序列失??;如果完全不兼容升級,避免反序列化混亂,那么請修改serialVersionUID值。說明:注意serialVersionUID不一致會(huì)拋出序列化運(yùn)行時(shí)異常。(11)【強(qiáng)制】構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯,如果有初始化邏輯,請放在init方法中。(12)【強(qiáng)制】POJO類必須寫toString方法。使用IDE的中工具:source>generatetoString時(shí),如果繼承了另一個(gè)POJO類,注意在前面加一下super.toString。說明:在方法執(zhí)行拋出異常時(shí),可以直接調(diào)用POJO的toString()方法打印其屬性值,便于排查問題。(13)【推薦】使用索引訪問用String的split方法得到的數(shù)組時(shí),需做最后一個(gè)分隔符后有無內(nèi)容的檢查,否則會(huì)有拋IndexOutOfBoundsException的風(fēng)險(xiǎn)。說明:Stringstr="a,b,c,,";String[]ary=str.split(",");//預(yù)期大于3,結(jié)果是3System.out.println(ary.length);(14)【推薦】當(dāng)一個(gè)類有多個(gè)構(gòu)造方法,或者多個(gè)同名方法,這些方法應(yīng)該按順序放置在一起,便于閱讀,此條規(guī)則優(yōu)先于第15條規(guī)則。(15)【推薦】類內(nèi)方法定義順序依次是:公有方法或保護(hù)方法>私有方法>getter/setter方法。說明:公有方法是類的調(diào)用者和維護(hù)者最關(guān)心的方法,首屏展示最好;保護(hù)方法雖然只是子類關(guān)心,也可能是“模板設(shè)計(jì)模式”下的核心方法;而私有方法外部一般不需要特別關(guān)心,是一個(gè)黑盒實(shí)現(xiàn);因?yàn)槌休d的信息價(jià)值較低,所有Service和DAO的getter/setter方法放在類體最后。(16)【推薦】setter方法中,參數(shù)名稱與類成員變量名稱一致,this.成員名=參數(shù)名。在getter/setter方法中,不要增加業(yè)務(wù)邏輯,增加排查問題的難度。反例:publicIntegergetData(){if(true){returnthis.data+100;}else{returnthis.data-100;}}(17)【推薦】循環(huán)體內(nèi),字符串的連接方式,使用StringBuilder的append方法進(jìn)行擴(kuò)展。說明:反編譯出的字節(jié)碼文件顯示每次循環(huán)都會(huì)new出一個(gè)StringBuilder對象,然后進(jìn)行append操作,最后通過toString方法返回String對象,造成內(nèi)存資源浪費(fèi)。反例:Stringstr="start";for(inti=0;i<100;i++){str=str+"hello";}(18)【推薦】final可以聲明類、成員變量、方法、以及本地變量,下列情況使用final關(guān)鍵字:1)不允許被繼承的類,如:String類。2)不允許修改引用的域?qū)ο?,如:POJO類的域變量。3)不允許被重寫的方法,如:POJO類的setter方法。4)不允許運(yùn)行過程中重新賦值的局部變量。5)避免上下文重復(fù)使用一個(gè)變量,使用final描述可以強(qiáng)制重新定義一個(gè)變量,方便更好地進(jìn)行重構(gòu)。(19)【推薦】慎用Object的clone方法來拷貝對象。說明:對象的clone方法默認(rèn)是淺拷貝,若想實(shí)現(xiàn)深拷貝需要重寫clone方法實(shí)現(xiàn)屬性對象的拷貝。(20)【推薦】類成員與方法訪問控制從嚴(yán):1)如果不允許外部直接通過new來創(chuàng)建對象,那么構(gòu)造方法必須是private。2)工具類不允許有public或default構(gòu)造方法。3)類非static成員變量并且與子類共享,必須是protected。4)類非static成員變量并且僅在本類使用,必須是private。5)類static成員變量如果僅在本類使用,必須是private。6)若是static成員變量,必須考慮是否為final。7)類成員方法只供類內(nèi)部調(diào)用,必須是private。8)類成員方法只對繼承類公開,那么限制為protected。說明:任何類、方法、參數(shù)、變量,嚴(yán)控訪問范圍。過于寬泛的訪問范圍,不利于模塊解耦。思考:如果是一個(gè)private的方法,想刪除就刪除,可是一個(gè)public的service方法,或者一個(gè)public的成員變量,刪除一下,不得手心冒點(diǎn)汗嗎?變量像自己的小孩,盡量在自己的視線內(nèi),變量作用域太大,無限制的到處跑,那么你會(huì)擔(dān)心的。集合處理(1)【強(qiáng)制】關(guān)于hashCode和equals的處理,遵循如下規(guī)則:1)只要重寫equals,就必須重寫hashCode。2)因?yàn)镾et存儲(chǔ)的是不重復(fù)的對象,依據(jù)hashCode和equals進(jìn)行判斷,所以Set存儲(chǔ)的對象必須重寫這兩個(gè)方法。3)如果自定義對象做為Map的鍵,那么必須重寫hashCode和equals。說明:String重寫了hashCode和equals方法,所以我們可以非常愉快地使用String對象作為key來使用。(2)【強(qiáng)制】ArrayList的subList結(jié)果不可強(qiáng)轉(zhuǎn)成ArrayList,否則會(huì)拋出ClassCastException異常,即java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList說明:subList返回的是ArrayList的內(nèi)部類SubList,并不是ArrayList,而是ArrayList的一個(gè)視圖,對于SubList子列表的所有操作最終會(huì)反映到原列表上。(3)【強(qiáng)制】在subList場景中,高度注意對原集合元素個(gè)數(shù)的修改,會(huì)導(dǎo)致子列表的遍歷、增加、刪除均會(huì)產(chǎn)生ConcurrentModificationException異常。(4)【強(qiáng)制】使用集合轉(zhuǎn)數(shù)組的方法,必須使用集合的toArray(T[]array),傳入的是類型完全一樣的數(shù)組,大小就是list.size()。說明:使用toArray帶參方法,入?yún)⒎峙涞臄?shù)組空間不夠大時(shí),toArray方法內(nèi)部將重新分配內(nèi)存空間,并返回新數(shù)組地址;如果數(shù)組元素大于實(shí)際所需,下標(biāo)為[list.size()]的數(shù)組元素將被置為null,其它數(shù)組元素保持原值,因此最好將方法入?yún)?shù)組大小定義與集合元素個(gè)數(shù)一致。正例:List<String>list=newArrayList<String>(2);list.add("guan");list.add("bao");String[]array=newString[list.size()];array=list.toArray(array);反例:直接使用toArray無參方法存在問題,此方法返回值只能是Object[]類,若強(qiáng)轉(zhuǎn)其它類型數(shù)組將出現(xiàn)ClassCastException錯(cuò)誤。(5)【強(qiáng)制】使用工具類Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時(shí),不能使用其修改集合相關(guān)的方法,它的add/remove/clear方法會(huì)拋出UnsupportedOperationException異常。說明:asList的返回對象是一個(gè)Arrays內(nèi)部類,并沒有實(shí)現(xiàn)集合的修改方法。Arrays.asList體現(xiàn)的是適配器模式,只是轉(zhuǎn)換接口,后臺的數(shù)據(jù)仍是數(shù)組。String[]str=newString[]{"you","wu"};Listlist=Arrays.asList(str);第一種情況:list.add("yangguanbao");運(yùn)行時(shí)異常。第二種情況:str[0]="gujin";那么list.get(0)也會(huì)隨之修改。(6)【強(qiáng)制】泛型通配符<?extendsT>來接收返回的數(shù)據(jù),此寫法的泛型集合不能使用add方法,而<?superT>不能使用get方法,做為接口調(diào)用賦值時(shí)易出錯(cuò)。說明:擴(kuò)展說一下PECS(ProducerExtendsConsumerSuper)原則:第一、頻繁往外讀取內(nèi)容的,適合用<?extendsT>。第二、經(jīng)常往里插入的,適合用<?superT>。(7)【強(qiáng)制】不要在foreach循環(huán)里進(jìn)行元素的remove/add操作。remove元素請使用Iterator方式,如果并發(fā)操作,需要對Iterator對象加鎖。正例:Iterator<String>iterator=list.iterator();while(iterator.hasNext()){Stringitem=iterator.next();if(刪除元素的條件){iterator.remove();}}反例:List<String>list=newArrayList<String>();list.add("1");list.add("2");for(Stringitem:list){if("1".equals(item)){list.remove(item);}}說明:以上代碼的執(zhí)行結(jié)果肯定會(huì)出乎大家的意料,那么試一下把“1”換成“2”,會(huì)是同樣的結(jié)果嗎?(8)【強(qiáng)制】在JDK7版本及以上,Comparator要滿足如下三個(gè)條件,不然Arrays.sort,Collections.sort會(huì)報(bào)IllegalArgumentException異常。說明:三個(gè)條件如下1)x,y的比較結(jié)果和y,x的比較結(jié)果相反。2)x>y,y>z,則x>z。3)x=y,則x,z比較結(jié)果和y,z比較結(jié)果相同。反例:下例中沒有處理相等的情況,實(shí)際使用中可能會(huì)出現(xiàn)異常:newComparator<Student>(){@Overridepublicintcompare(Studento1,Studento2){returno1.getId()>o2.getId()?1:-1;}};(9)【推薦】集合初始化時(shí),指定集合初始值大小。說明:HashMap使用HashMap(intinitialCapacity)初始化。正例:initialCapacity=(需要存儲(chǔ)的元素個(gè)數(shù)/負(fù)載因子)+1。注意負(fù)載因子(即loaderfactor)默認(rèn)為0.75,如果暫時(shí)無法確定初始值大小,請?jiān)O(shè)置為16(即默認(rèn)值)。反例:HashMap需要放置1024個(gè)元素,由于沒有設(shè)置容量初始大小,隨著元素不斷增加,容量7次被迫擴(kuò)大,resize需要重建hash表,嚴(yán)重影響性能。(10)【推薦】使用entrySet遍歷Map類集合KV,而不是keySet方式進(jìn)行遍歷。說明:keySet其實(shí)是遍歷了2次,一次是轉(zhuǎn)為Iterator對象,另一次是從hashMap中取出key所對應(yīng)的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。正例:values()返回的是V值集合,是一個(gè)list集合對象;keySet()返回的是K值集合,是一個(gè)Set集合對象;entrySet()返回的是K-V值組合集合。(11)【推薦】高度注意Map類集合K/V能不能存儲(chǔ)null值的情況,如下表格:集合類KeyValueSuper說明Hashtable不允許為null不允許為nullDictionary線程安全ConcurrentHashMap不允許為null不允許為nullAbstractMap鎖分段技術(shù)(JDK8:CAS)TreeMap不允許為null允許為nullAbstractMap線程不安全HashMap允許為null允許為nullAbstractMap線程不安全反例:由于HashMap的干擾,很多人認(rèn)為ConcurrentHashMap是可以置入null值,而事實(shí)上,存儲(chǔ)null值時(shí)會(huì)拋出NPE異常。(12)【參考】合理利用好集合的有序性(sort)和穩(wěn)定性(order),避免集合的無序性(unsort)和不穩(wěn)定性(unorder)帶來的負(fù)面影響。說明:有序性是指遍歷的結(jié)果是按某種比較規(guī)則依次排列的。穩(wěn)定性指集合每次遍歷的元素次序是一定的。如:ArrayList是order/unsort;HashMap是unorder/unsort;TreeSet是order/sort。(13)【參考】利用Set元素唯一的特性,可以快速對一個(gè)集合進(jìn)行去重操作,避免使用List的contains方法進(jìn)行遍歷、對比、去重操作。并發(fā)處理(1)【強(qiáng)制】獲取單例對象需要保證線程安全,其中的方法也要保證線程安全。說明:資源驅(qū)動(dòng)類、工具類、單例工廠類都需要注意。(2)【強(qiáng)制】創(chuàng)建線程或線程池時(shí)請指定有意義的線程名稱,方便出錯(cuò)時(shí)回溯。正例:publicclassTimerTaskThreadextendsThread{publicTimerTaskThread(){super.setName("TimerTaskThread");...}(3)【強(qiáng)制】線程資源必須通過線程池提供,不允許在應(yīng)用中自行顯式創(chuàng)建線程。說明:使用線程池的好處是減少在創(chuàng)建和銷毀線程上所花的時(shí)間以及系統(tǒng)資源的開銷,解決資源不足的問題。如果不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導(dǎo)致消耗完內(nèi)存或者“過度切換”的問題。(4)【強(qiáng)制】線程池不允許使用Executors去創(chuàng)建,而是通過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同學(xué)更加明確線程池的運(yùn)行規(guī)則,規(guī)避資源耗盡的風(fēng)險(xiǎn)。說明:Executors返回的線程池對象的弊端如下:1)FixedThreadPool和SingleThreadPool:允許的請求隊(duì)列長度為Integer.MAX_VALUE,可能會(huì)堆積大量的請求,從而導(dǎo)致OOM。2)CachedThreadPool和ScheduledThreadPool:允許的創(chuàng)建線程數(shù)量為Integer.MAX_VALUE,可能會(huì)創(chuàng)建大量的線程,從而導(dǎo)致OOM。(5)【強(qiáng)制】SimpleDateFormat是線程不安全的類,一般不要定義為static變量,如果定義為static,必須加鎖,或者使用DateUtils工具類。正例:注意線程安全,使用DateUtils。亦推薦如下處理:privatestaticfinalThreadLocal<DateFormat>df=newThreadLocal<DateFormat>(){@OverrideprotectedDateFormatinitialValue(){returnnewSimpleDateFormat("yyyy-MM-dd");}};說明:如果是JDK8的應(yīng)用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat,官方給出的解釋:simplebeautifulstrongimmutablethread-safe。(6)【強(qiáng)制】高并發(fā)時(shí),同步調(diào)用應(yīng)該去考量鎖的性能損耗。能用無鎖數(shù)據(jù)結(jié)構(gòu),就不要用鎖;能鎖區(qū)塊,就不要鎖整個(gè)方法體;能用對象鎖,就不要用類鎖。說明:盡可能使加鎖的代碼塊工作量盡可能的小,避免在鎖代碼塊中調(diào)用RPC方法。(7)【強(qiáng)制】對多個(gè)資源、數(shù)據(jù)庫表、對象同時(shí)加鎖時(shí),需要保持一致的加鎖順序,否則可能會(huì)造成死鎖。說明:線程一需要對表A、B、C依次全部加鎖后才可以進(jìn)行更新操作,那么線程二的加鎖順序也必須是A、B、C,否則可能出現(xiàn)死鎖。(8)【強(qiáng)制】并發(fā)修改同一記錄時(shí),避免更新丟失,需要加鎖。要么在應(yīng)用層加鎖,要么在緩存加鎖,要么在數(shù)據(jù)庫層使用樂觀鎖,使用version作為更新依據(jù)。說明:如果每次訪問沖突概率小于20%,推薦使用樂觀鎖,否則使用悲觀鎖。樂觀鎖的重試次數(shù)不得小于3次。(9)【強(qiáng)制】多線程并行處理定時(shí)任務(wù)時(shí),Timer運(yùn)行多個(gè)TimeTask時(shí),只要其中之一沒有捕獲拋出的異常,其它任務(wù)便會(huì)自動(dòng)終止運(yùn)行,使用ScheduledExecutorService則沒有這個(gè)問題。(10)【推薦】使用CountDownLatch進(jìn)行異步轉(zhuǎn)同步操作,每個(gè)線程退出前必須調(diào)用countDown方法,線程執(zhí)行代碼注意catch異常,確保countDown方法被執(zhí)行到,避免主線程無法執(zhí)行至await方法,直到超時(shí)才返回結(jié)果。說明:注意,子線程拋出異常堆棧,不能在主線程try-catch到。(11)【推薦】避免Random實(shí)例被多線程使用,雖然共享該實(shí)例是線程安全的,但會(huì)因競爭同一seed導(dǎo)致的性能下降。說明:Random實(shí)例包括java.util.Random的實(shí)例或者M(jìn)ath.random()的方式。正例:在JDK7之后,可以直接使用APIThreadLocalRandom,而在JDK7之前,需要編碼保證每個(gè)線程持有一個(gè)實(shí)例。(12)【推薦】在并發(fā)場景下,通過雙重檢查鎖(double-checkedlocking)實(shí)現(xiàn)延遲初始化的優(yōu)化問題隱患(可參考The"Double-CheckedLockingisBroken"Declaration),推薦解決方案中較為簡單一種(適用于JDK5及以上版本),將目標(biāo)屬性聲明為volatile型。反例:classSingleton{privateHelperhelper=null;publicHelpergetHelper(){if(helper==null)synchronized(this){if(helper==null)helper=newHelper();}returnhelper;}//othermethodsandfields...}(13)【參考】volatile解決多線程內(nèi)存不可見問題。對于一寫多讀,是可以解決變量同步問題,但是如果多寫,同樣無法解決線程安全問題。如果是count++操作,使用如下類實(shí)現(xiàn):AtomicIntegercount=newAtomicInteger();count.addAndGet(1);如果是JDK8,推薦使用LongAdder對象,比AtomicLong性能更好(減少樂觀鎖的重試次數(shù))。(14)【參考】HashMap在容量不夠進(jìn)行resize時(shí)由于高并發(fā)可能出現(xiàn)死鏈,導(dǎo)致CPU飆升,在開發(fā)過程中可以使用其它數(shù)據(jù)結(jié)構(gòu)或加鎖來規(guī)避此風(fēng)險(xiǎn)。(15)【參考】ThreadLocal無法解決共享對象的更新問題,ThreadLocal對象建議使用static修飾。這個(gè)變量是針對一個(gè)線程內(nèi)所有操作共享的,所以設(shè)置為靜態(tài)變量,所有此類實(shí)例共享此靜態(tài)變量,也就是說在類第一次被使用時(shí)裝載,只分配一塊存儲(chǔ)空間,所有此類的對象(只要是這個(gè)線程內(nèi)定義的)都可以操控這個(gè)變量。控制語句(1)【強(qiáng)制】在一個(gè)switch塊內(nèi),每個(gè)case要么通過break/return等來終止,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個(gè)case為止;在一個(gè)switch塊內(nèi),都必須包含一個(gè)default語句并且放在最后,即使它什么代碼也沒有。(2)【強(qiáng)制】在if/else/for/while/do語句中必須使用大括號。即使只有一行代碼,避免采用單行的編碼方式:if(condition)statements;(3)【推薦】表達(dá)異常的分支時(shí),少用if-else方式,這種方式可以改寫成:if(condition){...returnobj;}//接著寫else的業(yè)務(wù)邏輯代碼;說明:如果非得使用if()...elseif()...else...方式表達(dá)邏輯,【強(qiáng)制】避免后續(xù)代碼維護(hù)困難,請勿超過3層。正例:超過3層的if-else的邏輯判斷代碼可以使用衛(wèi)語句、策略模式、狀態(tài)模式等來實(shí)現(xiàn),其中衛(wèi)語句示例如下:publicvoidtoday(){if(isBusy()){System.out.println(“changetime.”);return;}if(isFree()){System.out.println(“gototravel.”);return;}System.out.println(“stayathometolearnAlibabaJavaCodingGuidelines.”);return;}(4)【推薦】除常用方法(如getXxx/isXxx)等外,不要在條件判斷中執(zhí)行其它復(fù)雜的語句,將復(fù)雜邏輯判斷的結(jié)果賦值給一個(gè)有意義的布爾變量名,以提高可讀性。說明:很多if語句內(nèi)的邏輯相當(dāng)復(fù)雜,閱讀者需要分析條件表達(dá)式的最終結(jié)果,才能明確什么樣的條件執(zhí)行什么樣的語句,那么,如果閱讀者分析邏輯表達(dá)式錯(cuò)誤呢?正例://偽代碼如下finalbooleanexisted=(file.open(fileName,"w")!=null)&&(...)||(...);if(existed){...}反例:if((file.open(fileName,"w")!=null)&&(...)||(...)){...}(5)【推薦】循環(huán)體中的語句要考量性能,以下操作盡量移至循環(huán)體外處理,如定義對象、變量、獲取數(shù)據(jù)庫連接,進(jìn)行不必要的try-catch操作(這個(gè)try-catch是否可以移至循環(huán)體外)。(6)【推薦】接口入?yún)⒈Wo(hù),這種場景常見的是用于做批量操作的接口。(7)【參考】下列情形,需要進(jìn)行參數(shù)校驗(yàn):1)調(diào)用頻次低的方法。2)執(zhí)行時(shí)間開銷很大的方法。此情形中,參數(shù)校驗(yàn)時(shí)間幾乎可以忽略不計(jì),但如果因?yàn)閰?shù)錯(cuò)誤導(dǎo)致中間執(zhí)行回退,或者錯(cuò)誤,那得不償失。3)需要極高穩(wěn)定性和可用性的方法。4)對外提供的開放接口,不管是RPC/API/HTTP接口。5)敏感權(quán)限入口。(8)【參考】下列情形,不需要進(jìn)行參數(shù)校驗(yàn):1)極有可能被循環(huán)調(diào)用的方法。但在方法說明里必須注明外部參數(shù)檢查要求。2)底層調(diào)用頻度比較高的方法。畢竟是像純凈水過濾的最后一道,參數(shù)錯(cuò)誤不太可能到底層才會(huì)暴露問題。一般DAO層與Service層都在同一個(gè)應(yīng)用中,部署在同一臺服務(wù)器中,所以DAO的參數(shù)校驗(yàn),可以省略。3)被聲明成private只會(huì)被自己代碼所調(diào)用的方法,如果能夠確定調(diào)用方法的代碼傳入?yún)?shù)已經(jīng)做過檢查或者肯定不會(huì)有問題,此時(shí)可以不校驗(yàn)參數(shù)。注釋規(guī)約(1)【強(qiáng)制】類、類屬性、類方法的注釋必須使用Javadoc規(guī)范,使用/**內(nèi)容*/格式,不得使用//xxx方式。說明:在IDE編輯窗口中,Javadoc方式會(huì)提示相關(guān)注釋,生成Javadoc可以正確輸出相應(yīng)注釋;在IDE中,工程調(diào)用方法時(shí),不進(jìn)入方法即可懸浮提示方法、參數(shù)、返回值的意義,提高閱讀效率。(2)【強(qiáng)制】所有的抽象方法(包括接口中的方法)必須要用Javadoc注釋、除了返回值、參數(shù)、異常說明外,還必須指出該方法做什么事情,實(shí)現(xiàn)什么功能。說明:對子類的實(shí)現(xiàn)要求,或者調(diào)用注意事項(xiàng),請一并說明。(3)【強(qiáng)制】所有的類都必須添加創(chuàng)建者和創(chuàng)建日期。(4)【強(qiáng)制】方法內(nèi)部單行注釋,在被注釋語句上方另起一行,使用//注釋。方法內(nèi)部多行注釋使用/**/注釋,注意與代碼對齊。(5)【強(qiáng)制】所有的枚舉類型字段必須要有注釋,說明每個(gè)數(shù)據(jù)項(xiàng)的用途。(6)【推薦】與其“半吊子”英文來注釋,不如用中文注釋把問題說清楚。專有名詞與關(guān)鍵字保持英文原文即可。反例:“TCP連接超時(shí)”解釋成“傳輸控制協(xié)議連接超時(shí)”,理解反而費(fèi)腦筋。(7)【推薦】代碼修改的同時(shí),注釋也要進(jìn)行相應(yīng)的修改,尤其是參數(shù)、返回值、異常、核心邏輯等的修改。說明:代碼與注釋更新不同步,就像路網(wǎng)與導(dǎo)航軟件更新不同步一樣,如果導(dǎo)航軟件嚴(yán)重滯后,就失去了導(dǎo)航的意義。(8)【參考】謹(jǐn)慎注釋掉代碼。在上方詳細(xì)說明,而不是簡單地注釋掉。如果無用,則刪除。說明:代碼被注釋掉有兩種可能性:1)后續(xù)會(huì)恢復(fù)此段代碼邏輯。2)永久不用。前者如果沒有備注信息,難以知曉注釋動(dòng)機(jī)。后者建議直接刪掉(代碼倉庫保存了歷史代碼)。(9)【參考】對于注釋的要求:第一、能夠準(zhǔn)確反應(yīng)設(shè)計(jì)思想和代碼邏輯;第二、能夠描述業(yè)務(wù)含義,使別的程序員能夠迅速了解到代碼背后的信息。完全沒有注釋的大段代碼對于閱讀者形同天書,注釋是給自己看的,即使隔很長時(shí)間,也能清晰理解當(dāng)時(shí)的思路;注釋也是給繼任者看的,使其能夠快速接替自己的工作。(10)【參考】好的命名、代碼結(jié)構(gòu)是自解釋的,注釋力求精簡準(zhǔn)確、表達(dá)到位。避免出現(xiàn)注釋的一個(gè)極端:過多過濫的注釋,代碼的邏輯一旦修改,修改注釋是相當(dāng)大的負(fù)擔(dān)。反例://putelephantintofridgeput(elephant,fridge);方法名put,加上兩個(gè)有意義的變量名elephant和fridge,已經(jīng)說明了這是在干什么,語義清晰的代碼不需要額外的注釋。(11)【參考】特殊注釋標(biāo)記,請注明標(biāo)記人與標(biāo)記時(shí)間。注意及時(shí)處理這些標(biāo)記,通過標(biāo)記掃描,經(jīng)常清理此類標(biāo)記。線上故障有時(shí)候就是來源于這些標(biāo)記處的代碼。1)待辦事宜(TODO):(標(biāo)記人,標(biāo)記時(shí)間,[預(yù)計(jì)處理時(shí)間])表示需要實(shí)現(xiàn),但目前還未實(shí)現(xiàn)的功能。這實(shí)際上是一個(gè)Javadoc的標(biāo)簽,目前的Javad
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 體育場館廣告牌施工協(xié)議
- 2025版跨境電子商務(wù)平臺用戶隱私保護(hù)合同3篇
- 2025年度溫州二手房交易市場風(fēng)險(xiǎn)防控合作協(xié)議3篇
- 城市環(huán)境衛(wèi)生分層管理辦法
- 2025版電子商務(wù)平臺用戶行為分析合同6篇
- 2024年茶葉生產(chǎn)設(shè)備升級與購買合同
- 2025年度勞動(dòng)密集型產(chǎn)業(yè)勞動(dòng)合同3篇
- DB1331T 096-2024 雄安新區(qū)市政公用工程綠色評價(jià)標(biāo)準(zhǔn)
- 2024年鉆石購銷合同樣本3篇
- 2025版酒店品牌戰(zhàn)略規(guī)劃與委托管理協(xié)議3篇
- 中國珠寶市場發(fā)展報(bào)告(2019-2024)(中英)-中國珠寶玉石首飾行業(yè)協(xié)會(huì)
- 《零售藥店實(shí)務(wù)》期末考試復(fù)習(xí)題及答案
- 培訓(xùn)中心商業(yè)計(jì)劃書
- 2024版新能源汽車購置補(bǔ)貼及服務(wù)保障合同3篇
- 2025年上半年事業(yè)單位聯(lián)考內(nèi)蒙古自治區(qū)民政廳招聘3人準(zhǔn)考重點(diǎn)基礎(chǔ)提升(共500題)附帶答案詳解
- 2024年度云計(jì)算中心綜合布線合同5篇
- 《praat使用入門》課件
- 吉首大學(xué)《管理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 《道路車輛 48V供電電壓的電氣及電子部件 電性能要求和試驗(yàn)方法》文本以及編制說明
- 《病理科(中心)建設(shè)與配置標(biāo)準(zhǔn)》
- 醫(yī)藥銷售主管市場規(guī)劃
評論
0/150
提交評論