代码精进之路
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
38234 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
结束语 (1讲)
代码精进之路
15
15
1.0x
00:00/00:00
登录|注册

12丨组织好代码文件,要有“用户思维”

文档的管理
测试代码的存放位置
命名空间的区隔
源代码存放位置
LICENSE
COPYRIGHT
README
一起来动手
自定义文件组织原则
IDE的文件组织形式
软件该怎么使用?
逻辑之四:软件该怎么测试?
逻辑之三:软件是怎么实现的?
逻辑之二:软件可以拿来用吗?
逻辑之一:软件是干什么的?
小结
组织好代码文件,要有“用户思维”

该思维导图由 AI 生成,仅供参考

上一讲中,我们讲了如何组织代码段,今天我来讲下,如何组织代码文件。
最开始接触一个项目代码时,我们最渴望的,就是快速揭开项目的面纱。这个项目是干什么的?是怎么做的?该怎么使用?
有很多这样的问题,排着队等我们处理。我们需要从一个点开始,先撕破一点点皮,然后,像剥洋葱一样,一层一层地阅读,一层一层地了解。
刚拿到一个项目的代码时,你最想找哪一个文件?面对大量的文件,该从哪里入手?创建一个项目时,各式各样的文件该怎么规整?
如果一个项目很小,只有三五个文件,我们不用担心上述的问题。
但事实上,一个典型的软件项目,拥有上百个文件是寻常的事情。如果这些文件组织混乱,就会让整个项目乱糟糟的,我们很难入手去查找、阅读和测试。
其实文件的组织是一个简单的事情,但这些简单的事情如果不能做得清晰、明了,就会变成一个效率的黑洞。
文件的组织要层次分明、易于检索、一目了然。要做到这一点,我们可以从用户思考问题的逻辑入手。

逻辑之一:软件是干什么的?

无论我们开始一个软件项目,还是阅读一个软件的代码,第一个遇到的问题就是,这个软件是干什么的?
可以回答这个问题的文件叫做 README,它的命名全部使用大写字母。需要被放在一个软件工程的根目录里,方便人或者机器第一时间找到,从而轻而易举地找到并进行阅读。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文从“用户思维”出发,探讨了如何以用户为中心组织代码文件的关键观点。首先,强调了README文件的重要性,清晰描述软件用途;其次,版权和许可证的管理至关重要,建议在根目录下放置COPYRIGHT和LICENSE文件;另外,提出使用命名空间的区隔和测试代码与功能代码的分离;最后,强调测试文件应执行独立任务,组织方式应与功能代码相照应。这些观点为读者提供了以用户思维为出发点的代码文件组织方式,有助于提高代码的可读性、可维护性和质量。文章还强调了软件文档的重要性,应随软件变更不断升级维护,并建议代码和文档统一管理。最后,鼓励读者分享项目文件组织经验,并学习他人经验,共同进步。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • MOV AX,0
    公司项目模块的大致结构: build/ src/ main/ java/domain.parent.module/ constants/ entity/ dao/ mapper/ service/impl/ facade/impl/ job/ utils/ resources/ META-INF/ dubbo/ spring/ app.properties log4j.properties /test/java/domain.parent.module/ dao/ service/ facade/ job/ utils/ TestBase.java deploy.properties jenkinsfile pom.xml 不经意间已经习惯这种结构了。很多东西用的时候很顺,以致于都察觉不到它的好处。看老师的文章感觉非常亲切,也收获了很多!

    作者回复: 谢谢你分享这个典型的代码文件组织结构。

    2019-01-31
    2
    8
  • Y024
    作为 Javaer,分享一些自己接触到东西。目前很多都有脚手架工具,可以帮你快速初始化/规划项目代码组织,比如:Java 里面的 Maven,可以帮你快速初始化一个项目(Maven 生成的工程目录划分,具体细节移步官方文档:https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html)。 利用脚手架初始化完一个项目之后,涉及到了分层,一般会有类别(controller/web、service、dao 等)、业务模块(user、order 等)两个维度,看是先按照类别再按业务分层(如:controller/user、controller/order;service/user,service/order),还是先按照业务再按照类别分层(user/controller,user/service;order/controller,order/service),但一定不要两种风格混合。

    作者回复: 好经验,谢谢分享! 类似于Maven的脚手架工具很有价值,我也建议大家了解了解。我个人特别喜欢它对代码依赖关系的自动化处理。第二部分,我们会使用一下这个小工具(不会讲,就是用一下)。

    2019-01-31
    3
  • Being
    doc/ 需求文档(按功能模块分子目录)、各成员的日志记录(按项目节点分子目录)、UI设计 Source/ VS工程下的多个项目相关Project工程目录、基础库、test工程、Tools工程 ,.sln文件一般放在该目录,主要是VS IDE的组织方式 每个工程下就是会细分像老师说的src Product/ 一般还要分Debug/Release Win32/x64, 存放相应的exe生成文件以及依赖库 主要方便发布与测试 Versions/ 就是每个节点后发布的版本了,并记录依赖的相关部署环境等

    作者回复: 嗯,看起来像是代码的上一层的组织方式,不仅包括代码,还包括编译后的文件,以及支持文件。

    2019-01-30
    3
  • 老吴
    说到这个,老师能否加开一篇领域驱动的课

    作者回复: 这是一个好话题,但是我现在真的不懂领域驱动。要加油学习了!

    2019-02-26
    1
  • pyhhou
    自己使用的就是最简单的 MVC 的代码结构,写的是 node JS,不需要编译结构也是一些个工具帮忙生成的: bin/ node_modules/ public/ scripts/ src/ controllers/ helpers/ models/ routes/ tests/ .env app.js package.json package-lock.json 这里比较不好的是 tests 很难和 src 里面的东西一一对应,有时写着写着会把自己绕进去,不知老师有没有什么好的建议。还想请问老师的就是即便是在一个好的文件框架下,很多子文件的层级结构也还是得由我们程序员自己来设定,就比如一个功能可以由一个文件实现,也可以由多个文件协同实现,这里面有没有一些个比较好的实践,或者是可以借鉴的思想方法,使得即便是不看半句代码,光看文件名加文件结构就可以把设计思想以及代码功能看出个十之八九?

    作者回复: 对应好源代码和测试案例,是一个省时省力的思路。JDK一般按照源代码的目录结构组织测试。比如,测试接口规范javax.net.ssl.SSLSocket的代码,放在test/jdk/javax/net/ssl/SSLSocket目录下。测试接口实现sun.security.ssl.SSLSocketImpl的代码,放在test/jdk/sun/security/ssl/SSLSocketImpl目录下。我们经常需要翻找测试用例,来检查测试覆盖是不是足够,这种对应的组织方式的确省了不少时间。 文件的安排,首先要做好模块的划分,功能类似的、目标类似的放到一个命名空间里(比如Java的包);然后,分割接口规范和内部实现;接口规范和内部实现放到不同的命名空间里;然后,再划分依赖关系,公开接口的文件,一个类一个文件;内部实现的代码,尽量减少文件间的依赖关系,只被一个类依赖的代码,都放到那个类里去。 比如,javax.net.ssl是TLS协议的公开接口规范,单独使用一个公开的包。sun.security.ssl是TLS接口规范的一个实现,单独使用另外一个包。sun.security.ssl.ClientHello类里,还包含了支撑这个类实现的其他几个内部类。 package sun.security.ssl; final class ClientHello { static final class ClientHelloMessage extends HandshakeMessage { // snipped } private static final class ClientHelloKickstartProducer implements SSLProducer { // snipped } // snipped } 另外,就是做好命名空间和类的命名,名字清晰了,从文件名和文件结构的确可以看到更多的东西。

    2019-02-24
    1
  • 亦知码蚁
    上文图中那个make/是什么含义

    作者回复: 放置makefile的目录

    2019-01-30
    1
  • 进化菌
    一般项目代码都会有一套模块化的结构,习惯的将一些共同功能的文件放在一起。 而版权声明,对于公司内部的代码,似乎没有那么必要,因为没有对外开放的~

    作者回复: 公司也要养成添加进版权的习惯。

    2021-11-19
  • 彩色的沙漠
    请问老师,我经常看到的github项目还是自己的项目都是把软件是干什么的和怎么使用放到了README文件,没有区分放到README和软件文档doc两个文件维护。

    作者回复: 一些小的项目,README就能够承担这些责任了。

    2019-05-07
  • 小文
    很多网上的代码都没有版权说明,那也会受法律保护吗?

    作者回复: 是的。这种代码的版权风险很大的,不知期限,不知版权归属,不知许可方式。有些法律默认没有版权说明,就是作者保留所有权利。

    2019-02-18
  • Lindroid
    总结: README:命名大写字母,放在根目录下,用于介绍软件的使用; COPYRIGHT:命名大写字母,放在根目录下,用于解释软件的版权; 源代码文件:src目录下,可再细分目录; 测试代码:需要和功能代码分开存放,可放在根目录的test目录下,一个测试文件最好执行一个独立任务; 文档:可以放在根目录的docs 或者 doc 的目录下。
    2019-04-19
    2
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部