| 片段 | 角色 | 典型內容 | 命名建議 |
| studyfront | 專案/產品線標識 | 公司縮寫+產品名、項目代號 | 小寫、無分隔符、唯一性 |
| device | 業務域/限界上下文 | 設備管理、用戶中心、訂單、支付 | 領域名詞、單數、小寫 |
| api | 架構層/模塊類型 | Controller、DTO、VO、Feign Client、OpenAPI 定義 | 分層標識:api、service、dao、domain、common、infrastructure |
完整包結構示例
com.company.studyfront // 基礎包
├── device
│ ├── api // 對外接口層
│ │ ├── controller // REST Controller
│ │ ├── dto // Request/Response DTO
│ │ ├── vo // View Object
│ │ └── feign // 服務間調用 Client
│ ├── service // 業務邏輯層
│ │ ├── impl
│ │ └── DeviceService.java
│ ├── domain // 領域模型層
│ │ ├── entity
│ │ ├── repository
│ │ └── event
│ ├── infrastructure // 基礎設施層
│ │ ├── persistence
│ │ │ ├── mapper // MyBatis Mapper
│ │ │ └── po // Persistent Object
│ │ └── external
│ └── common // 共用工具/常量/異常
└── ... 其他業務模塊 (user, order, payment)
命名規範最佳實踐
- 全小寫:避免大小寫敏感文件系統問題。
- 反域名作為基礎包:`com.company.project`,保證全局唯一。
- 業務模塊優先:`模塊.層` 而非 `層.模塊`,符合高內聚、低耦合,便於微服務拆分。
- 層名標準化:
- `api` / `web` / `controller`:接口層
- `service` / `application`:應用/業務層
- `domain` / `model`:領域層
- `infrastructure` / `dao` / `repository` / `persistence`:基礎設施層
- `common` / `util` / `core`:共用內核
- 避免無意義層級:如 `com.company.project.module.service.impl` 可簡化為 `com.company.project.module.service.impl`(保留),但 `com.company.project.module.service.service` 即屬冗余。
- 測試代碼鏡像主代碼包結構:`src/test/java/com/company/project/module/...`。
常見反模式
| 反模式 | 問題 | 改進 |
| 所有類放在 `com.company.project` 根包 | 耦合度極高、難維護、命名衝突 | 按業務模塊+分層拆包 |
| 按技術角色分頂層包:`controller`、`service`、`dao` 各自包含所有模塊 | 跨模塊調用循環依賴、難拆分微服務 | 模塊優先:`module.controller`、`module.service` |
| 包名使用拼音/縮寫/數字:`usrmgr`、`od1`、`xyz` | 可讀性差、新人上手難 | 英文全拼、領域術語 |
| 包名含版本號:`v1.api`、`v2.service` | 版本應在 API 路徑/模塊坐標體現,不在 Java 包名 | 包名不帶版本,模塊坐標帶版本 |
Maven/Gradle 模塊化對應
studyfront-device-api // 接口模塊,其他模塊依賴
studyfront-device-service // 服務實現
studyfront-device-domain // 領域模型
studyfront-common // 共用內核
多模塊構建時,**Java 包名與模塊名保持一致前綴**,便於導航與依賴管理。
總結
`studyfront-device-api` 代表 **「studyfront 專案下的 device 模塊的 api 接口層」**。優秀的包命名體現 **業務邊界(模塊)、架構分層(層)、專案歸屬(基礎包)**,是代碼可讀性、可維護性、可擴展性的第一道防線。遵循「模塊優先、分層標準、全小寫、反域名基礎」原則,讓包結構成為系統架構的清晰地圖。
- 上一篇文章: Java 對象創建與引用變量聲明的區別:new、聲明、初始化的內存模型圖解
- 下一篇文章: C 語言指針左值右值深度解析:*cp 賦值 ch2 與 &ch2 的本質區別
Copyright ©
程式碼之家 All Rights Reserved