首页 > 其他分享 >Groovy 是一门 DSL 语言

Groovy 是一门 DSL 语言

时间:2024-09-25 21:52:09浏览次数:9  
标签:Groovy 闭包 Java 语言 一门 语法 DSL

近期接触了很多新的领域,在一个个大坑中摸爬打滚。其中一部分内容又让我发现了 Groovy 的新应用领域,但是我对 Groovy 越来越沦落为一个纯纯的 DSL 语言 (DSL(Domain-Specific Language,领域特定语言)是一种为特定领域或问题设计的编程语言)。相较于通用编程语言(如Java、Python),DSL语言 专注于特定应用领域内的高效表达和操作。

想当初我刚接触 Groovy 的时候,还排在变成语言的前 20,最好成绩是 13 名。作为一门语言,其具有代表性的应用如下:GradeSpockGrailsJenkins。在著名的 接口测试框架 restassured 源码当中,也有大量的 Groovy 痕迹。

由于入行较晚,没赶上 Groovy 辉煌的时候,从上古资料中也能看到很多 Groovy 引领的潮流,其中不少是被 Java 吸纳,最具代表性的就是 Lambda 语法动态类型

我接触时候 Groovy 已经迎来了 3.x 版本,很多语法都遥遥领先 Java 。到现在 Groovy 已经到了 5.x 版本,但是好像也没有特别升级,本人也懒得升级使用。据我了解,很多版本都还停留在 2.x ,毕竟 又不是不能用 。而且在编程语言排名中,Groovy 已经很难在前几页找到了,曾经的代表应用似乎也没能延续往日的荣光。

据我观察 Groovy 已经事实成为一种 DSL 语言 。当然,Groovy 也非常适合作为一种 DSL 语言 。主要以下优势:

  • 灵活的语法:Groovy 的语法非常灵活,可以轻松地创建简洁且表达力强的语言结构。它允许通过内部 DSL (Internal DSL) 创建自定义语法,这些语法结构可以更好地表达特定领域的逻辑。
  • 内置的闭包(Closures):Groovy 的闭包(Closures)是实现 DSL 的一个强大工具。闭包可以作为块状代码传递,支持灵活的代码结构和逻辑表达,使 DSL 更加自然和易于理解。
  • 内置方法和操作符重载:Groovy 支持方法和操作符重载,可以定制和扩展语言功能。这种特性允许开发者创建具有自定义行为的 DSL 语法,进一步提升语言的表达能力。
  • 动态类型:Groovy 的动态类型特性使得在 DSL 中可以灵活地处理不同的数据类型和结构,而不需要事先定义严格的类型。这对于构建灵活和表达力强的 DSL 十分重要。
  • 强大的集合操作:Groovy 内置了丰富的集合操作方法,例如 find, collect, each 等,这使得在 DSL 中处理数据和集合变得更加简便。

Groovy 似乎也与 Java 失去了竞争的能力,安心充当一门 DSL 语言 。而这样也能够很好地发挥优势,避免劣势,毕竟 Groovy 明显的缺陷着实不太适合完全充当一个项目的主力语言。

总体感觉,Groovy 生态这些年并没有很好发展,缺点并没有得到很好修复,但作为一门 DSL 语言Groovy 非常合适。

标签:Groovy,闭包,Java,语言,一门,语法,DSL
From: https://blog.51cto.com/FunTester/12112010

相关文章

  • qudsl 使用备忘录
    前提:已知A表,B表,且 A表一对多B表查询B表数据的同时,同步关联的A表数据1. A表的实体类中:@OneToMany(mappedBy="b",fetch=FetchType.LAZY)@JsonIgnoreprivateSet<B>bs=newHashSet<>();2. B表的实体类中:@QueryInit("*.*.*.*")@ManyToOne(......
  • 给 DSL 开个脑洞:无状态的状态机
    阿里妹导读:什么是 DSL?DSL 是一种工具,其核心价值在于提供了一种手段,可以更加清晰地就系统某部分的意图进行沟通。本文将通过实现一个状态机引擎来看清DSL的本质,介绍状态机的核心模型和Fluent接口,并解决状态机的性能问题。最近在一个项目中,因为涉及很多状态的流转,我们选择使......
  • S-Clustr(影子集群) Simple SCC伪代码编译器,工业控制DSL结构语言,递归函数调用
    项目地址:https://github.com/MartinxMax/S-Clustr/releases200S-ClustrSimpleDSL语法内置函数示例RUN(启动设备)RUN:<ID>STOP(停止设备)STOP:<ID>TIME(MS延时)TIME:<Delay/Ms>函数示例DEF(定义函数名,空形参)DEFFunction:DEF(函数名,带形参)DEFFunction:var,......
  • 探索Groovy的Elvis操作符及其在Java中的替代方案
    在编程的世界里,我们经常需要处理变量的默认值问题,尤其是在变量可能为null的情况下。Groovy语言提供了一种优雅的方式来处理这种情况,那就是Elvis操作符。本文将探讨Elvis操作符的用法,并展示如何在Java中实现类似的功能。Elvis操作符简介Elvis操作符(?:)是Groovy语言中的一种......
  • php htmlspecialchars()、htmlentities()、addslashes() 的区别
    1差别htmlspecialchars()和htmlentities()唯一的差别是对于不认识的编码是否转义。比如,对于西欧编码ISO-8859-1来说,中文字符是“不认识的编码” 2举个例子说明差别2.1转义不认识的编码有差别$str='中文字符';echo"\nhtmlentities会转义:——\n";echohtmlen......
  • ElasticSearch学习笔记(三)RestClient操作文档、DSL查询文档、搜索结果排序
    文章目录前言5RestClient操作文档5.4删除文档5.4修改文档5.5批量导入文档6DSL查询文档6.1准备工作6.2全文检索查询6.3精准查询6.4地理坐标查询6.5复合查询6.5.1相关性算分6.5.2布尔查询7搜索结果处理7.1排序7.1.1普通字段排序7.1.2地理坐标排序......
  • 轻松获得ADSL代理服务
    ADSL代理服务接入常见问答在当今激烈的网络爬虫与反爬虫斗争中,各大网站和应用程序采取的风险管理手段愈加严格,其中最常见的一种措施是IP封禁。为了有效应对IP封禁带来的挑战,设置代理服务成为一种非常有效的解决方案。配置完代理后,爬虫可以通过代理IP来隐藏真实IP,......
  • 一门多范式的编程语言Scala学习收尾-函数的使用
    4、集合(接着上次的集合继续学习)4.4可变集合1、ListBuffervallistBuffer1:ListBuffer[Int]=newListBuffer[Int]println(s"$listBuffer1")listBuffer1.+=(11)listBuffer1.+=(22)listBuffer1.+=(33)listBuffer1.+=(11)listBuffer1.+=(55)listBuffer1.+=(22)listBuffe......
  • 一门多范式的编程语言Scala学习的第二天-函数的使用
    2.12scala中的函数式编程*scala中的函数式编程**面向对象编程:将对象当作参数一样传来传去*1、对象可以当作方法参数传递*2、对象也可以当作方法的返回值返回*当看到类,抽象类,接口的时候,今后无论是参数类型还是返回值类型,都需要提供对应的实现类对象**面向函数式编程......
  • 一门多范式的编程语言Scala学习的第一天-简介
    Scala1、Scala简介1.1Scala的介绍scala是一门多范式的编程语言Scala是把函数式编程思想和面向对象编程思想结合的一种编程语言大数据计算引擎spark是由Scala编写的1.2Scala的特性1.2.1多范式1.2.1.1面向对象特性Scala是一种高度表达性的编程语言,它结合了面向对象编程......