---
title: 使用Plato生成Back4App云代码函数复杂性报告指南
slug: docs-ch/cloud-code-functions/code-complexity
description: 了解如何使用Plato生成Back4App云代码函数的复杂性报告，以优化性能和降低成本。
image: https://www.back4app.com/images/logo-social.png
createdAt: 2024-02-28T13:58:14.341Z
---

# 如何创建一个显示您的云代码复杂性的报告

## 介绍

本节将教您如何使用 [Plato](https://www.npmjs.com/package/plato) 生成您的云代码的代码复杂性报告。

云代码必须从设计上高效。由于它被调用的次数非常多，稍微差一点的性能可能会成为一个巨大的问题，并严重影响您的生产环境。

如果您花时间高效地设计您的云代码，您将能够使用更小的服务器处理更多的请求，这可以随着时间的推移带来巨大的节省。
另一方面，设计不良的云代码只能在更大、更昂贵的机器上扩展，这也有其局限性。这种情况可能会导致重写代码的必要性，并随着时间的推移增加开支。

请花时间进行测试、负载测试并不断检查代码复杂度的报告。

## 前提条件

:::hint{type="info"}
- 要完成本教程，您需要：

- 一个安装了 Node.js 的本地环境，以便应用单元测试。您可以按照 [官方 NodeJS 教程](https://nodejs.org/en/download/package-manager/) 在终端成功安装 Node.js。
- 在 Back4App 创建的应用。
- 按照 [创建新应用教程](https://www.back4app.com/docs/get-started/new-parse-app) 学习如何在 Back4App 创建应用。
- 与项目配置的 Back4App 命令行工具。
- 按照 [设置云代码教程](https://www.back4app.com/docs/local-development/parse-cli) 学习如何为项目设置云代码。
:::

## 首先，我们需要谈谈 Plato

我们通常通过创建一组较小的函数来开始开发，这些函数将一个大问题分解为更小、更易处理的问题。
这种方法通常是可行的，这些初始较小的函数随着时间的推移而增长，进行更复杂的操作并处理更多的数据。
随着您应用中的数据增长，计算密集型任务（如循环和递归调用）被越来越多地调用，这往往会减慢应用程序的速度。在严重的情况下，它甚至可能完全冻结应用程序。
这就是 [Plato](https://www.npmjs.com/package/plato) 的用武之地。

[Plato](https://www.npmjs.com/package/plato) 是一个JavaScript源代码可视化、静态分析和复杂性工具，它生成报告显示您的应用程序变得多复杂，以及在哪里进行修复以潜在地加快流程。

### 1 - 安装Plato

如果您在系统中安装了 [NodeJS](https://nodejs.org/en/download/package-manager/) 和 [NPM](https://www.npmjs.com/)，安装 [Plato](https://www.npmjs.com/package/plato) 就像输入

:::BlockQuote
1   npm install -g plato
:::

如果您没有，请在继续之前安装这些。

### 2 - 运行Plato

在安装后运行 [Plato](https://www.npmjs.com/package/plato) 的过程是从您的Cloud Code所在目录输入以下命令：

:::BlockQuote
1   plato -r -d MyReportFolder -t "My Report for this App" -x .json \*.js
:::

这些选项的意思是：

- -r: 递归，意味着它会进入目录和子目录查找文件
- -d MyReportFolder: （输出）目录。Plato 将创建一个名为 <font color="#2166ae">`MyReportFolder`</font> 的目录，在其中存储其结果
- -t “My Report for this App”: 标题。Plato 将把此报告命名为 <font color="#2166ae">`My Report for this App`</font>。这对于随着时间的推移创建多个报告并进行跟踪非常有用
- -x .json: 排除 .json 文件。您可以告诉 Plato 忽略文件类型，以便它运行得更快
- \*.js: 查找任何扩展名为 .js 的文件进行评估

### 3 - 获取结果

在由上述命令创建的 <font color="#2166ae">`MyReportFolder`</font> 中，您会找到一个 <font color="#2166ae">`index.html`</font> 文件，其中包含报告。在浏览器中打开该文件，您会发现类似这样的内容:

![](https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/m7y26fYbFw_pxzXbDa9E-_image.png)

在我的情况下，我只有一个名为 <font color="#2166ae">`main.js`</font>, 但根据您的代码，您可以有更多文件。
向下滚动到 <font color="#2166ae">`文件`</font> 部分，点击您想要打开的文件名（在我的情况下是 main.js）。这将打开该文件的报告:

![](https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/TqMI00Zb4hLBqZul0SQmX_image.png)

- 可维护性是一个介于0到100之间的值，表示维护代码的相对容易程度。较高的值意味着更好的可维护性。
- 难度度量与编写或理解程序的难度相关。
- 估计错误是Halstead交付的错误，是对实现中错误数量的估计。

功能权重有两个指标：

- 按复杂性：该指标计算代码块中不同路径的数量。较低的值更好。
- 按SLOC：源代码行/逻辑行

现在您可以向下滚动，查看建议的警报和可能的修复：

![](https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/nf44nHZSFHVQYA2bY-0DO_image.png)

在我的情况下，它告诉我 <font color="#2166ae">`箭头函数语法 (=>) 仅在 ES6 中可用 (使用 'esversion: 6')`</font>, 这不是问题。
但让我们在那个函数中添加一些非常低效的代码并重新评估:

```javascript
1function getSquareRootOf(numberOne, numberTwo, numberThree){
2	var finalResult;
3
4	var i = 0;
5	var j = 0;
6	var k = 0;
7
8	for (i = 0; i < 100; i ++){
9		for (j = 0; j < 100; i ++){
10			for (k = 0; k < 100; k++){
11				var resultOne = getSquareRootOf(numberOne);
12				var resultTwo = getSquareRootOf(numberTwo);
13				var resultThree = getSquareRootOf(numberThree);
14				finalResult = resultOne + resultTwo + resultThree;
15			}
16		}
17	}
18}
```

并评估结果:

![](https://api.archbee.com/api/optimize/yD3zCY-NNBBIfd0uqcfR5/izF-yrFGm7JcbDQ6XZV1X_image.png)

正如我们所看到的，这个函数的复杂度是 4，这很好。你得到的数字越高，函数就越复杂，你就越应该确保它是高效的。

[Plato](https://www.npmjs.com/package/plato) 还会警告你缺少分号和其他潜在的 Javascript 错误。

## 结论

拥有一个像 [Plato](https://www.npmjs.com/package/plato) 这样的工具来检查你的代码复杂度，并不断重构云代码以尽可能快和高效，可以在长时间内节省大量成本。
你和所有开发者都应该在开发过程中包含这一步或类似的步骤，以确保你在处理请求时获得最大的价值。
