开发中的项目结构

说明

世上本没有规范,用的人多了,便成了规范。

为什么需要考虑项目结构:

项目结构是指在软件开发过程中,为了更好地组织和管理代码、依赖、资源等,而定义的一种目录结构和命名规范。项目结构的目的主要有以下几个方面:

  1. 便于开发:良好的项目结构可以使代码更加清晰、易于理解和维护。在项目结构中,不同的代码文件和资源文件应该被整合在一起,使开发人员可以快速地找到需要的文件和资源。
  2. 提高代码复用性:良好的项目结构可以使代码更容易被复用。在项目结构中,可以按照功能模块将代码划分为不同的包或模块,使得这些代码可以被其他模块或项目共享。这样可以避免重复编写代码,提高效率和质量。
  3. 方便维护:良好的项目结构可以使维护工作更加简单和高效。在项目结构中,不同的功能模块应该被分开,便于开发人员对代码进行修改和更新。同时,项目结构中应该包含必要的文档和注释,使得代码的功能和用法更加清晰明了。
  4. 便于团队合作:良好的项目结构可以使团队合作更加高效。在项目结构中,不同的功能模块应该被分开,使得团队成员可以独立地开发、测试和维护不同的模块。同时,项目结构中应该包含必要的文档和注释,使得团队成员可以更加容易地理解代码的功能和用法。
  5. 提高代码质量:良好的项目结构可以使代码更加规范和易于测试。在项目结构中,应该包含必要的测试代码和测试数据,以确保代码的正确性和稳定性。同时,良好的项目结构可以避免代码的重复和冗余,提高代码的可读性和可维护性,从而提高代码质量。

项目结构在软件开发中具有重要的作用,可以提高代码的可维护性、可复用性和可测试性,提高团队合作效率,降低开发成本和风险。

便于开发

一个合理的项目结构包含以下方面可以便于开发:

  1. 模块化设计:项目结构中应该按照功能模块将代码划分为不同的包或模块,使得不同的代码文件和资源文件可以被整合在一起。这样可以使开发人员更容易地找到所需的文件和资源,提高开发效率。
  2. 规范化命名:项目结构中应该使用规范的命名方式来命名代码文件和资源文件,以便于开发人员快速地理解代码文件的作用和用法。例如,应该使用有意义的类名、方法名和变量名,避免使用过于简单的命名方式。
  3. 统一的代码风格:项目结构中应该统一代码的风格和格式,以便于开发人员更容易地理解代码。例如,应该统一代码的缩进方式、注释格式、命名方式等。
  4. 明确的目录结构:项目结构中应该明确的目录结构,以便于开发人员更容易地找到所需的代码文件和资源文件。例如,可以按照功能模块或者层次结构将代码文件和资源文件分别放置在不同的目录下。
  5. 文档和注释:项目结构中应该包含必要的文档和注释,以便于开发人员理解代码的功能和用法。例如,可以在代码文件中添加注释,或者在项目中添加文档来记录代码的设计和实现。
  6. 工具支持:可以使用一些开发工具来支持项目结构的管理和维护,例如,IDEA、Eclipse等。这些工具可以提供代码自动补全、重构、调试等功能,从而提高开发效率。

案例

D:\DEVELOP\JAVAPROGRAM\BOOKAPPSWINGUI\SRC
+---main
|   +---java
|   |   \---cn
|   |       \---bluecore
|   |           \---online
|   |               |   BookAppApplication.java
|   |               |
|   |               +---api
|   |               |       ApiUrlConsts.java
|   |               |       HttpUtils.java
|   |               |       LoginAPI.java
|   |               |       PostsAPI.java
|   |               |       PropsAPI.java
|   |               |       ServerAPI.java
|   |               |
|   |               +---model
|   |               |   |   Employee.java
|   |               |   |   HttpResult.java
|   |               |   |   Props.java
|   |               |   |   ServerInfo.java
|   |               |   |
|   |               |   +---dto
|   |               |   |       PostsDto.java
|   |               |   |
|   |               |   \---serverinfo
|   |               |           Cpu.java
|   |               |           Jvm.java
|   |               |           Mem.java
|   |               |           Sys.java
|   |               |
|   |               +---ui
|   |               |   |   UiConsts.java
|   |               |   |
|   |               |   +---component
|   |               |   |       AbsoluteLayout.java
|   |               |   |       MyIconButton.java
|   |               |   |       PostCard.java
|   |               |   |       RoundedCornerBorder.java
|   |               |   |
|   |               |   +---dialog
|   |               |   |       ImageDialog.java
|   |               |   |       PostDetailsDialog.java
|   |               |   |       PropDialog.java
|   |               |   |
|   |               |   +---frame
|   |               |   |       LoginFrame.java
|   |               |   |       MainFrame.java
|   |               |   |
|   |               |   \---panel
|   |               |           AboutPannel.java
|   |               |           AppointmentInfoPanel.java
|   |               |           ParameterManagePanel.java
|   |               |           SettingPanel.java
|   |               |           SystemInfoPanel.java
|   |               |           ToolBarPanel.java
|   |               |
|   |               \---util
|   |                       BaseContext.java
|   |                       PropertyUtil.java
|   |
|   \---resources
|       |   application.properties
|       |   profile.jpg
|       |
|       +---icon
|       |       about.png
|       |       backup.png
|       |       backupEnable.png
|       |       blue-core.jpg
|       |       database.png
|       |       databaseEnable.png
|       |       loading.gif
|       |       loading1000.gif
|       |       logout.png
|       |       logoutEnable.png
|       |       schedule.png
|       |       scheduleEnable.png
|       |       setting.png
|       |       settingEnable.png
|       |       status.png
|       |       statusEnable.png
|       |
|       \---img
|           +---login
|           |       logo.png
|           |       title.png
|           |
|           \---main
\---test
    \---java
D:\DEVELOP\JAVAPROGRAM\BOOKAPP\SRC
+---main
|   |   main.iml
|   |
|   +---java
|   |   \---cn
|   |       \---bluecore
|   |           \---bookapp
|   |               |   BookAppApplication.java
|   |               |
|   |               +---annotation
|   |               |       FileDownloadCache.java
|   |               |       FileUploadCache.java
|   |               |       ImgBase64Cache.java
|   |               |       NeedRole.java
|   |               |       NoAuth.java
|   |               |       ParamLog.java
|   |               |       TokenCheck.java
|   |               |
|   |               +---aspect
|   |               |       CacheableAspect.java
|   |               |       CacheEvictAspect.java
|   |               |       FileDownloadCache.java
|   |               |       FileUploadCache.java
|   |               |       ImgBase64Cache.java
|   |               |       ParamLog.java
|   |               |       RoleAspect.java
|   |               |       TokenCheck.java
|   |               |
|   |               +---common
|   |               |       CustomException.java
|   |               |       EmployeeMetaObjectHandler.java
|   |               |       GlobalExceptionHandler.java
|   |               |
|   |               +---config
|   |               |       FastJsonRedisSerializer.java
|   |               |       InterceptorConfig.java
|   |               |       RedisConfig.java
|   |               |       WebMvcConfig.java
|   |               |
|   |               +---controller
|   |               |       AttachmentsController.java
|   |               |       EmployeeController.java
|   |               |       PostsController.java
|   |               |       PropsController.java
|   |               |       ServerInfoController.java
|   |               |       UserInfoController.java
|   |               |
|   |               +---filter
|   |               |       GlobalArgsFilter.java
|   |               |
|   |               +---interceptor
|   |               |       CheckEmpInterceptor.java
|   |               |       CheckLoginInterceptor.java
|   |               |       CorsInterceptor.java
|   |               |
|   |               +---mapper
|   |               |       AttachmentsMapper.java
|   |               |       EmployeeMapper.java
|   |               |       PostsMapper.java
|   |               |       PropsMapper.java
|   |               |       SmsLogMapper.java
|   |               |       UserInfoMapper.java
|   |               |
|   |               +---pojo
|   |               |   |   Attachments.java
|   |               |   |   Employee.java
|   |               |   |   JsonResult.java
|   |               |   |   PageBean.java
|   |               |   |   Posts.java
|   |               |   |   Props.java
|   |               |   |   RedisKey.java
|   |               |   |   SessionReturn.java
|   |               |   |   SmsAuth.java
|   |               |   |   SmsLog.java
|   |               |   |   UserInfo.java
|   |               |   |   Watermark.java
|   |               |   |   WXAuth.java
|   |               |   |   WxUserInfo.java
|   |               |   |
|   |               |   +---dto
|   |               |   |       AttachmentsDto.java
|   |               |   |       PostsDto.java
|   |               |   |       PropsDto.java
|   |               |   |       UserInfoDto.java
|   |               |   |
|   |               |   \---sysInfo
|   |               |           Arith.java
|   |               |           Cpu.java
|   |               |           DateUtils.java
|   |               |           IpUtils.java
|   |               |           Jvm.java
|   |               |           Mem.java
|   |               |           Server.java
|   |               |           Sys.java
|   |               |           SysFile.java
|   |               |
|   |               +---service
|   |               |   |   AttachmentsService.java
|   |               |   |   EmployeeService.java
|   |               |   |   PostsService.java
|   |               |   |   PropsService.java
|   |               |   |   UserInfoService.java
|   |               |   |
|   |               |   \---impl
|   |               |           AttachmentsServiceImpl.java
|   |               |           EmployeeServiceImpl.java
|   |               |           PostsServiceImpl.java
|   |               |           PropsServiceImpl.java
|   |               |           UserInfoServiceImpl.java
|   |               |
|   |               \---utils
|   |                       AliOssUtil.java
|   |                       AliSmsUtil.java
|   |                       BaseContext.java
|   |                       GenStringUtil.java
|   |                       JacksonObjectMapper.java
|   |                       ProxyUtil.java
|   |                       WxService.java
|   |
|   \---resources
|       |   application-example.yml
|       |   application.yml
|       |   banner.jpg
|       |   banner.txt
|       |   oss-test.json
|       |
|       +---mysql
|       |       bookapp.sql
|       |
|       \---static
\---test
    |   test.iml
    |
    +---java
    |   \---cn
    |       \---bluecore
    |           \---bookapp
    |               |   BookAppApplicationTests.java
    |               |
    |               +---AliOssUtil
    |               |       TestAliOssUtil.java
    |               |
    |               +---attachments
    |               |       TestgetContentType.java
    |               |
    |               \---JSON
    |                       TestToJsonObj.java
    |
    \---Mysql
            bookapp.sql

项目一:

在第一个Swing项目中,对编写的类进行了以下的分包处理

api 网络通讯类 存放api获取数据的方法
model 数据模型类 从api接口获取的数据,转为对应数据模型
|-dto 数据传输类 用于在服务器直接交换数据
ui 界面相关类 整个界面的相关组件拆分
|-component 通用组件类 存放小组件,可以多次复用
|-dialog 对话框类 交互界面的对话框
|-frame 窗体类 整个软件的生命周期中需要创建的窗体
|-panel 面板类 如主界面上需要切换各个面板
util 工具类 存放一些常用的工具类

对于一个需要使用 JDBC、网络通讯和界面组件模块化等技术的 Swing 项目,我们可以使用以下的基本结构:

myproject/
├── src/
│   ├── com.myproject.model/
│   │   ├── Entity1.java
│   │   ├── Entity2.java
│   │   └── ...
│   ├── com.myproject.dao/
│   │   ├── Dao1.java
│   │   ├── Dao2.java
│   │   └── ...
│   ├── com.myproject.service/
│   │   ├── Service1.java
│   │   ├── Service2.java
│   │   └── ...
│   ├── com.myproject.controller/
│   │   ├── Controller1.java
│   │   ├── Controller2.java
│   │   └── ...
│   ├── com.myproject.view/
│   │   ├── View1.java
│   │   ├── View2.java
│   │   └── ...
│   ├── com.myproject.util/
│   │   ├── DbUtil.java
│   │   ├── NetworkUtil.java
│   │   └── ...
│   └── com.myproject.Main.java
├── lib/
│   ├── jdbc.jar
│   ├── ...
│   └── other_dependencies.jar
└── resources/
    ├── images/
    ├── properties

项目二

在第二个SpringBoot项目中,也进行了分包根据不同类的功能作用进行分类,这里就不多做解释了。

总结

项目结构的确是为了提高代码可读性,便于自己和他人开发项目,但是并不是没有指定的规则需要遵循。实际上,项目结构应该遵循一定的规范和标准,以便于开发人员更加规范、高效地组织和管理代码、依赖、资源等。

通常来说,项目结构的规范和标准可以根据具体的编程语言、开发框架、工程管理工具等因素而有所不同。例如,在 Java 开发中,可以使用 Maven、Gradle等工程管理工具来管理项目依赖和构建过程,并且遵循 Maven 或 Gradle 的约定规范来定义项目结构。在 C++ 开发中,可以使用 CMake、Makefile等工具来管理项目依赖和构建过程,并且遵循相应的规范来定义项目结构。

除此之外,还有一些通用的项目结构规范和标准,例如,按照功能模块划分代码文件、使用有意义的命名方式、统一代码风格和格式、明确的目录结构等。这些规范和标准可以提高代码的可读性和可维护性,减少代码的冗余和重复,提高代码的复用性和可测试性,从而提高开发效率和代码质量。

因此,虽然在项目结构的设计中需要考虑自己的开发习惯和代码作用,但是也需要遵循一定的规范和标准,以便于在团队协作或者项目迭代中更加高效地管理和维护代码。

以下是一些通用的项目结构规范和标准的例子:

  1. 按照功能模块划分代码文件:通常将代码文件按照其功能模块划分为不同的包或目录,使得开发人员可以更快地找到所需的代码文件。例如,Java 项目可以按照模型-视图-控制器(MVC)的架构划分代码文件。
  2. 使用有意义的命名方式:命名应该具有一定的描述性,能够直观地表达其作用和功能。例如,类名应该以大写字母开头并使用驼峰式命名法,方法名应该以小写字母开头并使用驼峰式命名法。
  3. 统一代码风格和格式:代码应该遵循统一的风格和格式,以便于开发人员更容易地理解和维护代码。例如,应该使用一致的缩进方式、注释风格、命名方式等。
  4. 明确的目录结构:项目结构应该具有清晰的目录结构,以便于开发人员更容易地找到所需的代码文件和资源文件。例如,可以按照功能模块或者层次结构将代码文件和资源文件分别放置在不同的目录下。
  5. 包含必要的文档和注释:项目结构中应该包含必要的文档和注释,以便于开发人员理解代码的功能和用法。例如,可以在代码文件中添加注释,或者在项目中添加文档来记录代码的设计和实现。
  6. 使用工程管理工具:可以使用一些工程管理工具来支持项目结构的管理和维护,例如,Maven、Gradle、CMake等。这些工具可以提供代码自动补全、重构、调试等功能,从而提高开发效率。
  7. 代码分层:在项目开发过程中,可以将代码按照不同的层次进行划分,例如,表现层、业务逻辑层、数据访问层。这样可以使代码更加清晰、易于理解和维护。
  8. 使用设计模式:在项目开发过程中,可以使用一些常见的设计模式来组织和管理代码。例如,工厂模式、单例模式、责任链模式等。这些设计模式可以使代码更加灵活、可复用和可扩展。
  9. 包含必要的测试代码和测试数据:项目结构中应该包含必要的测试代码和测试数据,以确保代码的正确性和稳定性。例如,可以使用单元测试框架来编写和运行测试代码,以检查代码的各种情况。
  10. 版本管理:在项目开发过程中,应该使用版本管理工具来管理代码的版本和变更历史记录。例如,可以使用 Git、SVN等工具来管理项目代码,以便于开发人员追踪和管理代码的变化。

这些通用的项目结构规范和标准可以使代码更加规范、易于理解和维护,提高代码的可读性、可维护性和可测试性,从而提高代码质量和开发效率。

简单说

简单来说,项目结构就是一个规范开发的过程,对于个人开发者而言,有助于加深对于项目代码的理解。

项目的结构并不是无章可循,是有一定的规范的。但就我们目前阶段而言,只需要按照自己的理解,对java类进行分包,每个软件包进行某一功能的实现即可。这样已经可以满足个人开发的需求了。

但是在实际开发中,需要根据项目规模、开发团队、项目类型等因素来确定具体的项目结构,并遵循相应的规范和标准来进行项目结构的设计和实现。