3.2 代码组织决定应用架构
开发人员在构建架构之后面临的第一个挑战是,如何读懂代码结构。在接触代码之前,我们所要面对的就是代码的组织方式。我们可能会做如下一些事情:
◎ 打开README了解应该阅读哪些相关的资料。
◎ 阅读package.json了解系统的基础设施、使用了哪些组件库,以及配置了哪些构建脚本。
◎ 浏览主目录下的一个个文件,了解系统的一些插件的配置。
◎ 进入项目代码中阅读和了解。
不同框架有不同的文件组织方式,不同团队也有不同的规范。比如使用Java或Spring框架,默认会遵循这样的一些文件夹规范:model文件夹用于存放与模型相关的代码,repository文件夹用于存放与数据源相关的代码,service文件夹用于存放与服务相关的代码等。这些代码的组织形式实际上反映了应用的架构。
Python语言的Django框架使用的方式是基于业务的组织形式,即每个“应用”(即某一业务领域,如用户管理)是一个单独的文件夹,在它的目录中拥有自己完整的相关代码。下面是一个Django应用的代码结构:
. ├—— __init__.py ├—— admin.py ├—— apps.py ├—— migrations | └—— __init__.py ├—— models.py ├—— tests.py └—— views.py
对于前端来说也是相似的。下面是Angular生成的应用(通过ng new xxx可生成)的主目录下的结构:
e2e //E2E测试文件夹 src //源码文件夹 .editorconfig //编辑器统一格式配置文件 .gitignore //Git忽略文件的配置文件 angular.json //Angular配置文件 package.json //软件包相关信息的配置文件 README.md //文档 tsconfig.json //TypeScript编译配置文件 tslint.json //TypeScript代码风格配置文件
通过上面的文件名信息,我们可以快速地了解系统的一些基础组成。这对于其他前端框架也是相似的,这些配置文件实则是定义了一系列的规范。对于不同的开发者,它们可以起到规范的作用。
在src目录的app文件夹下,有如下一些文件:
├—— app.component.css ├—— app.component.html ├—— app.component.spec.ts ├—— app.component.ts ├—— app.module.ts └—— header ├—— header.component.css //CSS样式文件 ├—— header.component.html //HTML模板文件 ├—— header.component.spec.ts //测试文件 └—— header.component.ts //TypeScript代码逻辑
面代码中的header是通过Angular的CLI生成的。举Angular的例子是为了说明代码组织结构的重要性。此外,还需要注意文件名。如果这里的header组件实际上是一个用于页面底部的组件,那么就会很尴尬。
从这里的代码组织形式来看,它更像是基于组件的架构,而不再是类似于MVC形式的架构。对于其他前端框架比如React,如果我们通过状态来管理应用,那么从组织构建上看,它像MVC架构。
从文件名上就可以了解这是一个组件(Component),而由于CSS、HTML、TypeScript的分离,我们又可以快速地在修改代码时找到对应的文件。这种特性对于庞大工程的项目来说相当有帮助,但是对于简单的业务,比如加载(Loading)组件时,使用与React、Vue相似的结构会更简洁,即一个文件包含CSS、HTML、JavaScript代码。
注意:这里主要针对框架默认生成的代码组织架构,一个Vue组件也可以拆分成多个文件,一个Angular组件也可以写成一个文件。而默认生成的,意味着这个框架是约定俗成的,在生成的时候需要加以注意。
因此,当我们定下了前端应用的架构时,我们应该按照与架构相似的方式来编写,以免随着代码架构的变化而腐烂。当架构在未来发生变化的时候,我们就需要相应地更改代码的组织方式。