項(xiàng)目規(guī)范化:工具類(lèi)、封裝、代碼生成
項(xiàng)目規(guī)范化工具類(lèi)、封裝、代碼生成一個(gè)人寫(xiě)項(xiàng)目像寫(xiě)日記——自己能看懂就行團(tuán)隊(duì)協(xié)作像寫(xiě)公文——格式不統(tǒng)一就亂套。項(xiàng)目規(guī)范化不是為了好看是為了讓你三個(gè)月后回來(lái)還能看懂自己寫(xiě)的什么。一、項(xiàng)目規(guī)范化的意義可維護(hù)性代碼結(jié)構(gòu)清晰定位問(wèn)題快修改影響范圍可控團(tuán)隊(duì)協(xié)作效率新人接手項(xiàng)目不需要猜約定看目錄結(jié)構(gòu)就知道代碼在哪減少低級(jí)錯(cuò)誤統(tǒng)一封裝減少重復(fù)代碼魔法值用枚舉代替減少手寫(xiě)出錯(cuò)代碼審查效率規(guī)范統(tǒng)一的代碼風(fēng)格Review時(shí)聚焦業(yè)務(wù)邏輯而非格式問(wèn)題規(guī)范化不是寫(xiě)一堆文檔約束人而是通過(guò)工程手段讓規(guī)范自動(dòng)落地。二、項(xiàng)目分層規(guī)范經(jīng)典的三層架構(gòu)分層每層職責(zé)明確src/main/java/com/example/ ├── controller/ # 控制層接收請(qǐng)求、參數(shù)校驗(yàn)、返回結(jié)果 ├── service/ # 業(yè)務(wù)層業(yè)務(wù)邏輯編排 │ └── impl/ ├── mapper/ # 持久層數(shù)據(jù)庫(kù)操作MyBatis接口 ├── entity/ # 實(shí)體類(lèi)與數(shù)據(jù)庫(kù)表對(duì)應(yīng) ├── dto/ # 數(shù)據(jù)傳輸對(duì)象接口入?yún)⒊鰠?│ ├── request/ # 請(qǐng)求DTO │ └── response/ # 響應(yīng)DTO ├── vo/ # 視圖對(duì)象返回給前端的對(duì)象 ├── utils/ # 工具類(lèi) ├── config/ # 配置類(lèi) ├── exception/ # 自定義異常 ├── enums/ # 枚舉類(lèi) └── constant/ # 常量類(lèi)分層依賴(lài)方向Controller → Service → Mapper禁止跨層調(diào)用Controller不能直接調(diào)Mapper禁止反向依賴(lài)Entity不能依賴(lài)DTO。三、命名規(guī)范類(lèi)型規(guī)范示例類(lèi)名大駝峰UserController, OrderService方法名小駝峰getUserById, createOrder變量名小駝峰userName, orderList常量名全大寫(xiě)下劃線MAX_RETRY_COUNT, DEFAULT_PAGE_SIZE包名全小寫(xiě)com.example.controller數(shù)據(jù)庫(kù)表名小寫(xiě)下劃線t_user, t_order_detail接口名不加I前綴UserService非IUserService實(shí)現(xiàn)類(lèi)名接口名ImplUserServiceImpl四、統(tǒng)一返回封裝所有接口返回統(tǒng)一結(jié)構(gòu)前端只需按固定格式解析。4.1 Result封裝DataSchema(description統(tǒng)一返回結(jié)構(gòu))publicclassResultT{privateIntegercode;privateStringmessage;privateTdata;privateResult(Integercode,Stringmessage,Tdata){this.codecode;this.messagemessage;this.datadata;}publicstaticTResultTsuccess(Tdata){returnnewResult(200,操作成功,data);}publicstaticTResultTsuccess(){returnnewResult(200,操作成功,null);}publicstaticTResultTfail(Stringmessage){returnnewResult(500,message,null);}publicstaticTResultTfail(Integercode,Stringmessage){returnnewResult(code,message,null);}}4.2 分頁(yè)結(jié)果封裝DataAllArgsConstructorpublicclassPageResultT{privateListTlist;// 數(shù)據(jù)列表privateLongtotal;// 總記錄數(shù)privateIntegerpageNum;// 當(dāng)前頁(yè)碼privateIntegerpageSize;// 每頁(yè)條數(shù)privateIntegertotalPages;// 總頁(yè)數(shù)publicstaticTPageResultTof(ListTlist,Longtotal,IntegerpageNum,IntegerpageSize){inttotalPages(int)Math.ceil((double)total/pageSize);returnnewPageResult(list,total,pageNum,pageSize,totalPages);}}五、基礎(chǔ)實(shí)體封裝數(shù)據(jù)庫(kù)表通常都有公共字段創(chuàng)建時(shí)間、更新時(shí)間等抽取BaseEntity避免每個(gè)實(shí)體重復(fù)定義。DatapublicclassBaseEntity{TableId(typeIdType.ASSIGN_ID)// 雪花算法生成IDprivateLongid;TableField(fillFieldFill.INSERT)// 插入時(shí)自動(dòng)填充privateLocalDateTimecreateTime;TableField(fillFieldFill.INSERT_UPDATE)// 插入和更新時(shí)自動(dòng)填充privateLocalDateTimeupdateTime;TableField(fillFieldFill.INSERT)privateLongcreateBy;TableField(fillFieldFill.INSERT_UPDATE)privateLongupdateBy;TableLogic// 邏輯刪除標(biāo)記TableField(fillFieldFill.INSERT)privateIntegerdeleted;}MyBatis-Plus自動(dòng)填充處理器ComponentpublicclassMyMetaObjectHandlerimplementsMetaObjectHandler{OverridepublicvoidinsertFill(MetaObjectmetaObject){this.strictInsertFill(metaObject,createTime,LocalDateTime.class,LocalDateTime.now());this.strictInsertFill(metaObject,updateTime,LocalDateTime.class,LocalDateTime.now());this.strictInsertFill(metaObject,deleted,Integer.class,0);// 當(dāng)前登錄用戶(hù)ID從ThreadLocal/SecurityContext獲取LonguserIdSecurityUtils.getCurrentUserId();this.strictInsertFill(metaObject,createBy,Long.class,userId);this.strictInsertFill(metaObject,updateBy,Long.class,userId);}OverridepublicvoidupdateFill(MetaObjectmetaObject){this.strictUpdateFill(metaObject,updateTime,LocalDateTime.class,LocalDateTime.now());this.strictUpdateFill(metaObject,updateBy,Long.class,SecurityUtils.getCurrentUserId());}}實(shí)體類(lèi)繼承BaseEntity即可自動(dòng)獲得這些公共字段DataEqualsAndHashCode(callSupertrue)TableName(t_user)publicclassUserextendsBaseEntity{privateStringusername;privateStringpassword;privateStringemail;privateIntegerstatus;}六、枚舉規(guī)范代碼里到處寫(xiě)012這種魔法值過(guò)兩個(gè)月誰(shuí)也不記得1是啟用還是禁用。用枚舉替代。GetterAllArgsConstructorpublicenumUserStatusEnum{DISABLED(0,禁用),ENABLED(1,啟用),LOCKED(2,鎖定);privatefinalIntegercode;privatefinalStringdesc;publicstaticUserStatusEnumgetByCode(Integercode){for(UserStatusEnume:values()){if(e.getCode().equals(code)){returne;}}thrownewIllegalArgumentException(無(wú)效的狀態(tài)碼: code);}}// 反面教材魔法值if(user.getStatus()1){...}// 正面示范枚舉if(UserStatusEnum.ENABLED.getCode().equals(user.getStatus())){...}常用枚舉場(chǎng)景狀態(tài)碼、性別、訂單狀態(tài)、支付方式、用戶(hù)角色等。七、工具類(lèi)封裝7.1 自定義工具類(lèi)publicclassRegexUtils{privatestaticfinalPatternPHONE_PATTERNPattern.compile(^1[3-9]\\d{9}$);privatestaticfinalPatternEMAIL_PATTERNPattern.compile(^[A-Za-z0-9_.-][A-Za-z0-9.-]$);publicstaticbooleanisPhone(Stringphone){returnphone!nullPHONE_PATTERN.matcher(phone).matches();}publicstaticbooleanisEmail(Stringemail){returnemail!nullEMAIL_PATTERN.matcher(email).matches();}}7.2 Hutool工具庫(kù)推薦自己寫(xiě)工具類(lèi)容易遺漏邊界場(chǎng)景推薦使用Hutool——國(guó)內(nèi)最流行的Java工具庫(kù)500工具方法覆蓋絕大多數(shù)場(chǎng)景。dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.25/version/dependency// 字符串工具StrUtil.isBlank(str);// 判空StrUtil.format(用戶(hù){}已存在,name);// 格式化// 日期工具DateUtil.now();// 當(dāng)前時(shí)間字符串DateUtil.formatDateTime(date);// 格式化日期// 加密工具SecureUtil.md5(password);// MD5加密SecureUtil.sha256(password);// SHA256加密// ID生成IdUtil.getSnowflakeNextId();// 雪花算法ID// HTTP客戶(hù)端HttpUtil.get(https://api.example.com/data);HttpUtil.post(url,body);// JSON處理JSONUtil.toJsonStr(obj);JSONUtil.parseObj(json).getStr(key);Hutool一個(gè)庫(kù)頂你自己寫(xiě)幾十個(gè)工具類(lèi)而且經(jīng)過(guò)大量生產(chǎn)驗(yàn)證比手寫(xiě)更可靠。八、代碼生成MyBatisX手動(dòng)寫(xiě)Entity/Mapper/Service/Controller四件套既枯燥又容易出錯(cuò)。MyBatisX是IDEA插件連接數(shù)據(jù)庫(kù)后一鍵生成整套代碼。使用流程IDEA安裝MyBatisX插件連接數(shù)據(jù)庫(kù)Database面板右鍵表 → MyBatisX-Generator配置生成選項(xiàng)module選擇當(dāng)前項(xiàng)目模塊packagecom.exampleentity勾選繼承BaseEntitymapper勾選生成Mapper接口service勾選生成Service接口Implcontroller勾選生成基礎(chǔ)CRUD接口點(diǎn)擊Generate一鍵生成生成后只需補(bǔ)充業(yè)務(wù)邏輯省去80%的重復(fù)勞動(dòng)。九、代碼規(guī)范檢查阿里巴巴Java開(kāi)發(fā)規(guī)約插件IDEA安裝Alibaba Java Coding Guidelines插件編碼時(shí)實(shí)時(shí)檢查規(guī)范問(wèn)題命名不規(guī)范空指針風(fēng)險(xiǎn)線程安全問(wèn)題魔法值未提取常量集合未指定初始容量!-- Checkstyle靜態(tài)檢查CI集成 --plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-checkstyle-plugin/artifactIdversion3.3.0/versionconfigurationconfigLocationcheckstyle-alibaba.xml/configLocation/configuration/plugin十、完整規(guī)范化項(xiàng)目結(jié)構(gòu)com.example.shop/ ├── ShopApplication.java ├── config/ │ ├── Knife4jConfig.java │ ├── MyBatisPlusConfig.java │ ├── RedisConfig.java │ └── WebMvcConfig.java ├── common/ │ ├── result/ │ │ ├── Result.java │ │ └── PageResult.java │ ├── entity/ │ │ └── BaseEntity.java │ ├── exception/ │ │ ├── BusinessException.java │ │ └── GlobalExceptionHandler.java │ ├── enums/ │ │ ├── UserStatusEnum.java │ │ └── OrderStatusEnum.java │ └── constant/ │ └── RedisConstant.java ├── controller/ │ ├── user/ │ │ └── UserController.java │ └── order/ │ └── OrderController.java ├── service/ │ ├── user/ │ │ ├── UserService.java │ │ └── impl/UserServiceImpl.java │ └── order/ │ ├── OrderService.java │ └── impl/OrderServiceImpl.java ├── mapper/ │ ├── UserMapper.java │ └── OrderMapper.java ├── entity/ │ ├── User.java │ └── Order.java ├── dto/ │ ├── request/ │ │ ├── UserLoginDTO.java │ │ └── OrderCreateDTO.java │ └── response/ │ ├── UserVO.java │ └── OrderVO.java └── utils/ ├── RegexUtils.java └── SecurityUtils.java項(xiàng)目規(guī)范化不是一蹴而就的是在開(kāi)發(fā)過(guò)程中逐步沉淀的。前期花時(shí)間搭好骨架后期團(tuán)隊(duì)所有人都能受益——寫(xiě)代碼時(shí)有章可循改代碼時(shí)有跡可循這才是規(guī)范化的真正價(jià)值。

相關(guān)新聞

服務(wù)監(jiān)控:Actuator + Prometheus + Grafana

服務(wù)監(jiān)控:Actuator + Prometheus + Grafana

服務(wù)監(jiān)控:Actuator Prometheus Grafana線上服務(wù)就像一輛行駛中的汽車(chē)——沒(méi)有儀表盤(pán)你不知道油量、不知道速度、不知道發(fā)動(dòng)機(jī)溫度,等真拋錨了才發(fā)現(xiàn)問(wèn)題,那就晚了。一、為什么需要監(jiān)控 線上服務(wù)跑著跑著突然卡了、內(nèi)存滿(mǎn)了、響應(yīng)慢了——如…

2026/7/31 0:14:40 閱讀更多
SAP財(cái)務(wù)核心技能:FAGLB03科目余額查詢(xún)深度解析與實(shí)戰(zhàn)指南

SAP財(cái)務(wù)核心技能:FAGLB03科目余額查詢(xún)深度解析與實(shí)戰(zhàn)指南

1. 項(xiàng)目概述:為什么科目余額查詢(xún)是SAP財(cái)務(wù)的“定盤(pán)星”?干了十幾年SAP財(cái)務(wù)顧問(wèn),我見(jiàn)過(guò)太多剛?cè)胄械呐笥?amp;#xff0c;一上來(lái)就急著學(xué)復(fù)雜的憑證過(guò)賬、月結(jié)流程,結(jié)果在第一個(gè)月結(jié)日就卡殼了。老板問(wèn)“這個(gè)月利潤(rùn)多少?”&…

2026/7/31 0:14:40 閱讀更多
維修工程師的示波器實(shí)戰(zhàn):02 探頭地線——示波器最大的“坑”

維修工程師的示波器實(shí)戰(zhàn):02 探頭地線——示波器最大的“坑”

第二篇:探頭地線——示波器最大的“坑” ——那根不起眼的小地線,可能比你測(cè)的信號(hào)還重要 很多工程師第一次用示波器時(shí),都會(huì)經(jīng)歷這樣一個(gè)“驚魂”時(shí)刻。 某食品廠包裝線,伺服偶發(fā)報(bào)警。年輕工程師判斷是編碼器信號(hào)受干擾,便拿出示波器認(rèn)真測(cè)量。波形一出來(lái),所有人都倒…

2026/7/31 0:14:40 閱讀更多
誰(shuí)懂啊,最近發(fā)現(xiàn)一個(gè)適合日常薅小優(yōu)惠的小渠道,就在千間

誰(shuí)懂啊,最近發(fā)現(xiàn)一個(gè)適合日常薅小優(yōu)惠的小渠道,就在千間

給大家整理好簡(jiǎn)單操作流程,親測(cè)順利領(lǐng)到:1.先下載 千間2.輸入口令: 千問(wèn)新人福利 yPBm3m3.直接領(lǐng)取 8 元通用券4.后續(xù)下單就能抵扣平時(shí)下班點(diǎn)奶茶、點(diǎn)外賣(mài)、出門(mén)打車(chē)都能用。 最近天氣悶熱,經(jīng)常想點(diǎn)冰飲,剛好能用上…

2026/7/31 3:34:54 閱讀更多
基于8051單片機(jī)的HRTOS雙任務(wù)LED應(yīng)用實(shí)例

基于8051單片機(jī)的HRTOS雙任務(wù)LED應(yīng)用實(shí)例

1. 前言傳統(tǒng)8051裸機(jī)開(kāi)發(fā)中,當(dāng)程序功能逐漸增加時(shí),通常需要在主循環(huán)中不斷判斷各種狀態(tài)。例如:while(1) {if(flag1)task1();if(flag2)task2(); }當(dāng)任務(wù)數(shù)量增加后,代碼維護(hù)難度逐漸提升。RTOS通過(guò)任務(wù)調(diào)度機(jī)制,可以將不…

2026/7/31 3:34:54 閱讀更多
ABB工業(yè)機(jī)器人RAPID編程實(shí)戰(zhàn):從架構(gòu)設(shè)計(jì)到焊接應(yīng)用

ABB工業(yè)機(jī)器人RAPID編程實(shí)戰(zhàn):從架構(gòu)設(shè)計(jì)到焊接應(yīng)用

1. 項(xiàng)目概述:從“會(huì)動(dòng)”到“會(huì)干活”的工業(yè)機(jī)器人 提到工業(yè)機(jī)器人,很多人腦海里浮現(xiàn)的是汽車(chē)生產(chǎn)線上那些揮舞著機(jī)械臂、精準(zhǔn)焊接或搬運(yùn)的“鋼鐵俠”。但要讓這些價(jià)值不菲的設(shè)備真正“會(huì)干活”,核心就在于程序。ABB作為全球工業(yè)機(jī)器人領(lǐng)域的巨…

2026/7/31 3:34:54 閱讀更多
關(guān)于流批一體架構(gòu)的思考

關(guān)于流批一體架構(gòu)的思考

1. 流批一體平臺(tái)的主要作用數(shù)據(jù)采集:從各種異構(gòu)數(shù)據(jù)源(如數(shù)據(jù)庫(kù)、文件、消息隊(duì)列等)中實(shí)時(shí)抽取數(shù)據(jù),包括增量和全量抽取。數(shù)據(jù)轉(zhuǎn)換:對(duì)抽取的數(shù)據(jù)進(jìn)行清洗、轉(zhuǎn)換和處理,以滿(mǎn)足目標(biāo)系統(tǒng)的要求。它提供了一系列…

2026/7/31 3:34:54 閱讀更多
ERP生產(chǎn)單附件功能實(shí)現(xiàn):數(shù)據(jù)庫(kù)設(shè)計(jì)到前后端集成完整方案

ERP生產(chǎn)單附件功能實(shí)現(xiàn):數(shù)據(jù)庫(kù)設(shè)計(jì)到前后端集成完整方案

如果你正在使用ERP系統(tǒng)管理生產(chǎn)流程,可能會(huì)遇到這樣的困擾:生產(chǎn)單上只有文字描述,工人需要反復(fù)核對(duì)圖紙和工藝文件,或者質(zhì)檢人員無(wú)法快速查看產(chǎn)品標(biāo)準(zhǔn)圖片。這種信息割裂不僅影響效率,還容易導(dǎo)致生產(chǎn)錯(cuò)誤。 傳統(tǒng)ERP的…

2026/7/31 3:34:54 閱讀更多
SEW-Movifit軟件調(diào)試全攻略:從參數(shù)整定到運(yùn)動(dòng)控制優(yōu)化

SEW-Movifit軟件調(diào)試全攻略:從參數(shù)整定到運(yùn)動(dòng)控制優(yōu)化

1. 項(xiàng)目概述:從“能動(dòng)”到“好用”的臨門(mén)一腳在工業(yè)自動(dòng)化領(lǐng)域,尤其是涉及電機(jī)驅(qū)動(dòng)和運(yùn)動(dòng)控制的場(chǎng)景,我們常常會(huì)遇到一個(gè)尷尬的局面:設(shè)備硬件安裝完畢,線路連接無(wú)誤,但整套系統(tǒng)就是“不聽(tīng)使喚”&#xff0c…

2026/7/31 3:24:54 閱讀更多
HART協(xié)議詳解:05 HART現(xiàn)場(chǎng)通信實(shí)戰(zhàn)

HART協(xié)議詳解:05 HART現(xiàn)場(chǎng)通信實(shí)戰(zhàn)

第五季 HART現(xiàn)場(chǎng)通信實(shí)戰(zhàn) ——從USB-HART Modem抓包到工程診斷:讓協(xié)議知識(shí)變成維修能力 各位工業(yè)現(xiàn)場(chǎng)的工程師朋友們,大家好! 經(jīng)過(guò)前四季的系統(tǒng)學(xué)習(xí),我們已經(jīng)構(gòu)建了HART協(xié)議的完整理論框架: 第一季:六層生命模型與本質(zhì)認(rèn)知 第二季:物理層4–20mA與FSK魔法 第三季:數(shù)…

2026/7/31 0:14:40 閱讀更多
維修工程師的示波器實(shí)戰(zhàn):02 探頭地線——示波器最大的“坑”

維修工程師的示波器實(shí)戰(zhàn):02 探頭地線——示波器最大的“坑”

第二篇:探頭地線——示波器最大的“坑” ——那根不起眼的小地線,可能比你測(cè)的信號(hào)還重要 很多工程師第一次用示波器時(shí),都會(huì)經(jīng)歷這樣一個(gè)“驚魂”時(shí)刻。 某食品廠包裝線,伺服偶發(fā)報(bào)警。年輕工程師判斷是編碼器信號(hào)受干擾,便拿出示波器認(rèn)真測(cè)量。波形一出來(lái),所有人都倒…

2026/7/31 0:14:40 閱讀更多
SAP財(cái)務(wù)核心技能:FAGLB03科目余額查詢(xún)深度解析與實(shí)戰(zhàn)指南

SAP財(cái)務(wù)核心技能:FAGLB03科目余額查詢(xún)深度解析與實(shí)戰(zhàn)指南

1. 項(xiàng)目概述:為什么科目余額查詢(xún)是SAP財(cái)務(wù)的“定盤(pán)星”?干了十幾年SAP財(cái)務(wù)顧問(wèn),我見(jiàn)過(guò)太多剛?cè)胄械呐笥?amp;#xff0c;一上來(lái)就急著學(xué)復(fù)雜的憑證過(guò)賬、月結(jié)流程,結(jié)果在第一個(gè)月結(jié)日就卡殼了。老板問(wèn)“這個(gè)月利潤(rùn)多少?”&…

2026/7/31 0:14:40 閱讀更多