JSON、YAML还是领域特定语言:声明还是编程?

JSON、YAML还是领域特定语言:声明还是编程?

作者:架构师JZW
邮箱:jingzhongwen@126.com

目录

前言

大家好,我是架构师JZW,在我日常的开发工作中,我经常会遇到一个问题:在给定的任务中,我们是应该选择使用 JSON、YAML 这样的声明性规范,还是选择在通用编程中编写代码语言?这个问题在每次技术雷达讨论会议上都会引起激烈的争论,而且似乎没有明确的答案。今天,我就想和大家分享一下我的看法和经验。

这篇文章主要针对的读者是那些正在为选择声明性规范还是编程语言而纠结的开发者们。我希望我的文章能帮助你们在面临这个问题时,有一个更明确的方向。

声明还是编程

首先,我们需要明确什么是声明性规范和编程语言。简单来说,声明性规范(如 JSON、YAML 或 HCL)通常更易于阅读和编写,但其有限的抽象可能会导致重复代码的产生。而通用编程语言可以使用抽象来避免重复,但这些抽象可能会让代码变得更难理解,特别是当抽象经过多年的变化和分层后。

实际案例

以我们在讨论 Terraform Cloud Operator 与 Crossplane 的区别时为例,如果我们选择使用声明性规范来描述资源配置,那么我们可能会写出如下的 YAML 文件:

apiVersion: database.crossplane.io/v1alpha1
kind: PostgreSQLInstance
metadata:
  name: my-db
  namespace: default
spec:
  classSelector:
    matchLabels:
      example: "true"
  writeConnectionSecretToRef:
    name: db-conn

这样的代码简洁明了,但如果有大量相似的配置需要编写,那么就会产生大量的重复代码。而如果我们选择使用编程语言(例如 AWS CDK 或 Dagger),那么我们可以通过抽象来避免这种重复:

from aws_cdk import core
from aws_cdk.aws_rds import DatabaseInstance, DatabaseInstanceEngine

class MyDB(core.Stack):
    def __init__(self, app: core.App, id: str, **kwargs):
        super().__init__(app, id, **kwargs)
        DatabaseInstance(self, "Instance",
            engine=DatabaseInstanceEngine.postgres(version="12.1"),
            instance_type=ec2.InstanceType.of(
                ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.SMALL),
            vpc_subnets={'subnet_type': ec2.SubnetType.PUBLIC},
        )

app = core.App()
MyDB(app, "MyDB")
app.synth()

这样的代码虽然可能更难理解,但却大大减少了重复。

结论

根据我的经验,声明性规范和编程语言都有其适用的场景,而且并没有绝对的好坏之分。当你发现一个解决方案无法用一种语言类型去简洁的实现时,那就应该重新评估使用另一种类型。有些时候,拆分关注点并用不同的语言实现它们会更加合理。

后记

以上就是我对于声明性规范和编程语言选择的一些看法和建议。如果你有任何问题或者想法,欢迎通过我的邮箱(jingzhongwen@126.com)和我联系,我会非常乐意和你交流。同时,我也在我的专栏中分享了很多其他的技术经验和心得,欢迎大家前去浏览。

最后,我想问大家一个问题:你更倾向于使用声明性规范还是编程语言?欢迎在评论区留言告诉我你的答案。

标签:#JSON #YAML #编程语言 #声明性规范 #Terraform #Crossplane #AWS CDK #Dagger

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值