

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 最佳实践
<a name="best-practices"></a>

**L1 构造**
+ 您无法始终避免直接使用 L1 构造，但应尽可能避免这样做。如果特定的 L2 构造不支持您的边缘情况，您可以探索这两个选项，而不是直接使用 L1 构造：
  + **访问**`defaultChild`：****如果您需要的 CloudFormation 属性在 L2 构造中不可用，则可以使用 `L2Construct.node.defaultChild` 访问底层 L1 构造。您可以通过此属性访问 L1 构造的任何公共属性来更新它们，而不必费心自己创建 L1 构造。
  + **使用属性覆盖**：如果您要更新的属性不是公开的，该怎么办？ 允许 AWS CDK 实现 CloudFormation 模板所有功能的终极解决方案是使用每个 L1 构造中都可用的方法：[addPropertyOverride](https://docs.aws.amazon.com/cdk/v2/guide/cfn_layer.html)。通过将 CloudFormation 属性名称和值直接传递给此方法，您可以在 CloudFormation 模板级别上操作堆栈。

**L2 构造**
+ 记得利用 L2 构造经常提供的帮助程序方法。在第 2 层中，您不必在实例化时传递每个属性。L2 帮助程序方法可以使资源预调配变得更加方便，尤其是在需要条件逻辑时。最方便的帮助程序方法之一是从 [Grant](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_iam.Grant.html) 类派生出来的。这个类不是直接使用的，但是许多 L2 构造使用它来提供帮助程序方法，使权限更容易实现。例如，如果您想授予 L2 Lambda 函数访问某个 L2 S3 存储桶的权限，则可以调用 `s3Bucket.grantReadWrite(lambdaFunction)` 而不是创建新的角色和策略。

**L3 构造**
+ 虽然当您想让堆栈更具可重复使用性和可自定义时，L3 构造可能非常方便，但我们建议您谨慎使用它们。考虑您需要哪种类型的 L3 构造，或者您是否需要 L3 构造：
  + 如果您不直接与 AWS 资源交互，则通常更适合创建帮助程序类而不是扩展该 `Construct` 类。这是因为默认情况下，该 `Construct` 类会执行许多操作，只有在您直接与 AWS 资源交互时才需要执行这些操作。因此，如果您不需要执行这些操作，则避免这些操作会更有效。
  + 如果您确定创建新的 L3 构造是合适的，那么在大多数情况下，您需要直接扩展该 `Construct` 类。仅在想要更新其他 L2 构造的默认属性时，才扩展该构造。如果涉及其他 L2 构造或自定义逻辑，请直接扩展 `Construct`，并实例化构造函数中的所有资源。