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

举报
韩曙亮 发表于 2022/01/11 00:47:59 2022/01/11
【摘要】 文章目录 I . DSL 简介II . Kotlin 函数扩展III . Kotlin 属性扩展 I . DSL 简介 1 . DSL ( Domain ...



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 返回值类型变量
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

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 null
    var maxElem = iterator.next()
    if (!iterator.hasNext()) return maxElem
    var maxValue = selector(maxElem)
    do {
        val e = iterator.next()
        val v = selector(e)
        if (maxValue < v) {
            maxElem = e
            maxValue = v
        }
    } while (iterator.hasNext())
    return maxElem
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22


III . Kotlin 属性扩展



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


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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/105128751

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。