文章目录

  • I . DSL 简介
  • II . Kotlin 函数扩展
  • III . Kotlin 属性扩展

I . DSL 简介


1 . DSL ( Domain Specific Language ) 领域特定语言 : 针对某一个特定的领域的语言 , 如 SQL 语言 ;

2 . DSL 用途 : DSL 用于某个特定领域 , 主要是该领域的专家使用 , 通过简单的编程 , 可以描述该领域中的事物 , 这个简单的编程语言就是 DSL 领域特定语言 ; 如 SQL 是给数据库管理员使用的管理数据库的 DSL ;

3 . DSL 与 编程语言区别 :

① 使用者不同 : DSL 是特定领域的专家使用 , 编程语言是程序员使用 ;

② 作用范围不同 : DSL 仅能表示特定领域的事物模型 , 编程语言可以表现任何事物和模型 ;

4 . 开发 DSL 的要求 : 开发一种领域特定语言 , 需要能完整表现该领域的模型和事物 , 并且语言简洁 , 接近真实语言 , 能对非编程人员隐藏该语言实现的细节 ;

5 . Kotlin 中的 DSL : DSL 是 Kotlin 语言的特性之一 , 使用 DSL 可以让函数调用非常接近真实的语言 ;

6 . Kotlin 中实现 DSL 的原理 : Kotlin 中使用 ① 函数扩展 , ② Lambda 表达式 , ③ infix 中缀表达式 , ④ invoke 约定行为 , 等 Kotlin 特性原理实现 DSL 开发 ;

II . Kotlin 函数扩展


1 . 函数扩展作用 : Kotlin 中的函数 / 属性 扩展 , 可以为任意定义好的类 , 扩展任意函数或属性 ;

2 . 函数扩展语法格式 : 为一个定义好的类在外部定义一个新的函数 , 为 T 类型定义新的类 , 使用如下格式扩展函数 ;

fun 要扩展函数的类型.扩展方法名(参数列表) : 返回值类型
{扩展的操作return 返回值类型变量
}

3 . 函数扩展示例解析 : 集合的高阶函数 maxBy 就是对 Iterable 类型的函数胡扩展 ;

① 声明泛型 : 其中 <T, R : Comparable> 是声明泛型 ;

② 需要扩展函数类型 : Iterable 是要扩展函数的类型 ( 为该类扩展函数 ) ;

③ 扩展函数名称 : maxBy 是扩展的函数名称 ;

④ 函数参数 : selector: (T) -> R 是扩展函数的参数 , 该参数类型是函数类型 ;

⑤ 扩展函数返回值 : T? 类型 , 后面的 ? 表示该参数不能为 空 ;

⑥ 方法体 : 在方法体中调用传入的函数类型 , 获取元素中符合 selector(T) 调用返回值 最大值的元素 ;

/*** Returns the first element yielding the largest value of the given function * or `null` if there are no elements.* * @sample samples.collections.Collections.Aggregates.maxBy*/
public inline fun <T, R : Comparable<R>> Iterable<T>.maxBy(selector: (T) -> R): T? {val iterator = iterator()if (!iterator.hasNext()) return nullvar maxElem = iterator.next()if (!iterator.hasNext()) return maxElemvar maxValue = selector(maxElem)do {val e = iterator.next()val v = selector(e)if (maxValue < v) {maxElem = emaxValue = v}} while (iterator.hasNext())return maxElem
}

III . Kotlin 属性扩展


1 . 属性扩展作用 : Kotlin 中的函数 / 属性 扩展 , 可以为任意定义好的类 , 扩展任意函数或属性 ;

2 . 属性扩展格式 : 为一个定义好的类在外部定义一个新的属性 , 为 T 类型定义新的属性 , 使用如下格式扩展函属性 ;

var <被扩展属性类型> 要扩展属性的类型<被扩展的属性类型>.被扩展的属性名称 : 被扩展的属性类型//下面是被扩展属性的 getter 和 setter 方法get(){return }set(value){}

【Kotlin】Kotlin 领域特定语言 DSL 原理 一 ( DSL 简介 | 函数 / 属性扩展 )相关推荐

  1. 【转】开发者需要了解的领域特定语言(DSL)

    转自:开发者需要了解的领域特定语言(DSL) - 知乎 领域特定语言是在特定领域下用于特定上下文的语言.作为开发者,很有必要了解领域特定语言的含义,以及为什么要使用特定领域语言. 领域特定语言doma ...

  2. 开发者需要了解的领域特定语言(DSL)

    领域特定语言是在特定领域下用于特定上下文的语言.作为开发者,很有必要了解领域特定语言的含义,以及为什么要使用特定领域语言. 领域特定语言 domain-specific language (DSL)是 ...

  3. 【Kotlin】Kotlin 领域特定语言 DSL 原理 二 ( 中缀表达式 )

    文章目录 I . 中缀表达式 ( 中缀调用 ) II . 中缀表达式 ( 中缀调用 ) 示例代码 I . 中缀表达式 ( 中缀调用 ) 1 . 中缀表达式作用 : 中缀表达式是 Kotlin 领域特定 ...

  4. 走近“领域特定语言”(Domain-Specific Languages)

    领域特定语言(Domain-Specific Languages,简称DSL),是一个很有用的术语和概念,但其边界很模糊.一些东西很明显是DSL,但另一些可能会引发争议.本文接下来就走近"领 ...

  5. 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)

    前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...

  6. 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)

    本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...

  7. 走近“领域特定语言”

    文/Martin Fowler 领域特定语言(Domain-Specific Languages,简称DSL),是一个很有用的术语和概念,但其边界很模糊.一些东西很明显是DSL,但另一些可能会引发争议 ...

  8. DSL 领域特定语言

    一.DSL介绍 DSL(Domain Specific Language)是针对某一领域,具有受限表达性的一种计算机程序设计语言. 常用于聚焦指定的领域或问题,这就要求 DSL 具备强大的表现力,同时 ...

  9. 《领域特定语言》一2.3DSL的问题

    2.3DSL的问题 前面已经讨论了何时该采用DSL,接下来就该谈论什么时候不该采用DSL,或者至少是使用DSL应注意的问题. 从根本上说,不使用DSL的唯一原因就是,在你的场景下,使用DSL得不到任何 ...

最新文章

  1. 零起点学算法22——华氏摄氏温度转换
  2. c语言中错误executing,C语言编程中常见问题解读.doc
  3. linux jdk1.4 安装,linux安装jdk1.4.2
  4. 触发日期spring3整合quartz实现任务调度功能
  5. 2021年最后一个月
  6. DockOne微信分享(一四一):如何开发部署Kubernetes Native应用
  7. OpenNLP-引言
  8. EdrawMax v12.0.2跨平台图表软件
  9. GHOST重装系统后分区丢失只剩C盘的数据恢复方法
  10. 写会议纪要必备的录音转文字软件推荐,让你再也不用担心职场会议
  11. centos7.2下搭建postfix++dovecot+courier-authlib+extmail邮件收发系统
  12. GTX1050安装cuda10.2配置pytorch正确指令
  13. springboot如何自定义starter
  14. html取消select下拉,jquery取消选择select下拉框
  15. 关闭、清除IBM小型机橙色告警灯方法
  16. 本地字体上传到网络后运用到微信小程序详细过程
  17. 深入浅出GAN框架原理
  18. 【python-opencv】灰度图和彩色图的互相转换
  19. IBM Power小型机用液晶面板屏查看或设置HMC
  20. js正则表达式的使用:

热门文章

  1. 《Windows驱动开发技术详解》读书笔记(一)
  2. “MIDI机器狗”的木马正在疯狂传播
  3. JavaScript 异常处理
  4. jasper(二):制作饼状图和柱状图
  5. 记asp.net VB与C# 页面参数传值
  6. 17秋 软件工程 团队第五次作业 Alpha
  7. 2017.4.7 e.toString() 与 e.getMessage()的区别
  8. MySQL的binlog日志
  9. Symantec Backup Exec Remote Agent 2010在Redhat Enterprise 6.6上启动问题
  10. Spring MVC 基础