Kotlin领域特定语言(DSL)

简介: 一、DSL的概念 只在特定领域内使用的语言 例如: —HTML、Gradle、SQL等等特点: 计算机编程语言 具有语言的表达能力 有限的表达能力 关注某个特定的领域二、下面用DSL来写一个例子吧 需要下面五个类: 三、创建一个Node节点的接口package cn.

一、DSL的概念
只在特定领域内使用的语言
例如:
—HTML、Gradle、SQL等等

特点:
计算机编程语言
具有语言的表达能力
有限的表达能力
关注某个特定的领域

二、下面用DSL来写一个例子吧
需要下面五个类:
这里写图片描述

三、创建一个Node节点的接口

package cn.kotliner.kotlin

/**
 * @author:wangdong
 * @description:1.Node节点的接口
 */
interface Node {
    //每个节点都应该有一个render方法
    //例如对于HTML标签,它的render方法应该输出什么
    fun render(): String
}

四、写一个通用的Tag类,实现这个接口

package cn.kotliner.kotlin

/**
 * @author:wangdong
 * @description:2.通用的tag类
 */
/***
 * 实现了Node接口
 * Tag类需要Open,以便其他类继承
 */
open class Tag(val name: String): Node{

    //1.定义一个Node节点的list
    val children = ArrayList<Node>()
    //定一个表现属性的Map
    val properties = HashMap<String,String>()

    //定义一个String的扩展方法,参数是String
    operator fun String.invoke(value: String){
        properties[this] = value
    }

    //定义一个String加法的拓展
    operator fun String.unaryPlus(){
        children.add(StringNode(this))
    }

    //定义一个添加运算符
    operator fun plus(node: Node){
        children.add(node)
    }

    //定义一个String的扩展方法,参数是Tag.()
    operator fun String.invoke(block: Tag.() -> Unit){
        children.add(Tag(this).apply(block))
    }

    //例如<html id = "htmlId" style = ""><head></head><body></body></html>

    // <html id="htmlId" style=""><head> </head> <body></body></html>
    override fun render(): String {
        return StringBuilder()
                .append("<")
                .append(name)
                .let {
                    stringBuilder ->
                    if(!this.properties.isEmpty()){
                        stringBuilder.append(" ")
                        this.properties.forEach{
                            stringBuilder.append(it.key)
                                    .append("=\"")
                                    .append(it.value)
                                    .append("\" ")
                        }
                    }
                    stringBuilder
                }
                .append(">")
                .let {
                    stringBuilder ->
                    children.map(Node::render).map(stringBuilder::append)
                    stringBuilder
                }
                .append("</$name>")
                .toString()
    }

}

五、写一个主函数

package cn.kotliner.kotlin

/**
 * @author:wangdong
 * @description:3.写一个主函数
 */
fun main(args: Array<String>) {
    //定义一个tag
    //给它添加一个属性
    /*Tag("html").apply {
        properties["id"] = "Htmlid"
        //给节点添加一个tag
        children.add(Tag("head"))
    }.render().let(::println)*/

    //此时代码可以改一下了
    html{
        "id"("HtmlId")
        //给节点添加一个tag
        //children.add(Tag("head"))
        "head"{
            "id"("headId")
        }

        body{

            id = "bodyId"
            `class` = "bodyClass"
            "a"{
                "href"("https://www.kotliner.cn")
                + "Kotlin中文博客"
            }
        }

        "div"{}
    }.render().let(::println)
}

六、写一个Nodes,用来写各种方法

package cn.kotliner.kotlin

/**
 * @author:wangdong
 * @description:4.定一个Nodes
 */
fun html(block: Tag.() -> Unit): Tag{
    //首先new了一个Tag,名字叫html,用它的作用域去调用了一下block,传的this就是Tag("html")
    return Tag("html").apply(block)
}

/**
 * head的拓展方法
 * 要是tag的扩展方法
 * 不需要返回值
 */
fun Tag.head(block: Head.() -> Unit){
    this@head + Head().apply(block)
}
/**
 * body的拓展方法
 */
fun Tag.body(block: Body.() -> Unit){
    this@body + Body().apply(block)
}

/**
 * 定义一个节点
 * 参数content
 * 返回值:Node
 */
class StringNode(val content: String):Node{
    override fun render() = content
}
/**定义头*/
class Head: Tag("head")

/**定义体*/
class Body: Tag("body"){
    var id by MapDelegate(properties)

    var `class` by MapDelegate(properties)
}

七、定义一个MapDelegate用来Set或者Get值

package cn.kotliner.kotlin

import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

/**
 * @author:wangdong
 * @description:5.定义一个mapDelegate
 */

/**
 * map是可读写的
 * 实现一个接口
 */
class MapDelegate(val map: MutableMap<String,String>):ReadWriteProperty<Any,String>{
    /**
     * Returns the value of the property for the given object.
     * @param thisRef the object for which the value is requested.
     * @param property the metadata for the property.
     * @return the property value.
     * 返回值
     */
    override fun getValue(thisRef: Any, property: KProperty<*>): String {
        return map[property.name] ?: ""
    }

    /**
     * Sets the value of the property for the given object.
     * @param thisRef the object for which the value is requested.
     * @param property the metadata for the property.
     * @param value the value to set.
     * 设置值
     */
    override fun setValue(thisRef: Any, property: KProperty<*>, value: String) {
        map[property.name] = value
    }
}

八、运行一下主方法
得到的输出结果:

<html id="HtmlId" ><head id="headId" ></head><body id="bodyId" class="bodyClass" ><a href="https://www.kotliner.cn" >Kotlin中文博客</a></body></html>

好啦,结束啦!

目录
相关文章
|
7月前
|
XML 编译器 Android开发
Kotlin DSL 实战:像 Compose 一样写代码
Kotlin DSL 实战:像 Compose 一样写代码
178 0
|
XML 自然语言处理 Java
Kotlin 使用DSL构建语法结构 看这一篇就够了~
Kotlin 使用DSL构建语法结构 看这一篇就够了~
2081 0
Kotlin 使用DSL构建语法结构 看这一篇就够了~
|
4月前
|
安全 Java Android开发
探索安卓开发的未来:Kotlin语言的崛起与挑战
在这篇文章中,我们将深入探讨Kotlin语言在安卓开发领域的应用及其对传统Java开发的颠覆性影响。通过分析Kotlin的特性、社区支持以及在实际项目中的应用案例,我们揭示了这一现代编程语言如何为开发者提供更简洁、更安全的编程体验,并讨论了它在面对性能优化和向后兼容性时所面临的挑战。文章旨在为读者呈现一个全面的视角,评估Kotlin作为未来安卓开发主流语言的可能性。
77 1
|
5月前
|
安全 Java Android开发
探索Android应用开发中的Kotlin语言
【7月更文挑战第19天】在移动应用开发的浩瀚宇宙中,Kotlin这颗新星以其简洁、安全与现代化的特性,正迅速在Android开发者之间获得青睐。从基本的语法结构到高级的编程技巧,本文将引导读者穿梭于Kotlin的世界,揭示其如何优化Android应用的开发流程并提升代码的可读性与维护性。我们将一起探究Kotlin的核心概念,包括它的数据类型、类和接口、可见性修饰符以及高阶函数等特性,并了解这些特性是如何在实际项目中得以应用的。无论你是刚入门的新手还是寻求进阶的开发者,这篇文章都将为你提供有价值的见解和实践指导。
|
4月前
|
Java 网络安全 UED
运用 Kotlin 语言,优化局域网管控软件
在数字化时代,Kotlin语言以其简洁高效的特性,成为优化局域网管控软件的新选择。Kotlin不仅与Java高度兼容,还引入扩展函数等新特性,使代码更精炼易读。通过简洁的语法和强大的函数式编程支持,Kotlin能有效提升开发效率及软件性能。例如,简单的网络连接检测与设备扫描功能即可轻松实现。此外,Kotlin的协程支持让异步编程更为高效,进一步提高了软件响应速度和用户体验。随着Kotlin的发展,其在局域网管控领域的应用将愈发广泛。
37 0
|
5月前
|
安全 Java Android开发
探索安卓应用开发中的Kotlin语言优势
【7月更文挑战第8天】 在安卓开发的广阔天地中,Kotlin以其优雅的语法、现代化的特性和高效的性能成为了开发者的新宠。本文将深入探讨Kotlin在安卓应用开发中所展现的独特魅力,从语言特性到实际应用案例,揭示其如何简化代码编写、提升开发效率,并增强应用性能。通过对比分析,我们将一同见证Kotlin如何在众多编程语言中脱颖而出,成为安卓开发领域的一股清新之风。
256 11
|
5月前
|
Java Android开发 开发者
探索安卓应用开发的未来:Kotlin语言的崛起与挑战
【7月更文挑战第8天】随着移动设备在人们日常生活中扮演着越来越重要的角色,安卓应用开发的技术趋势和编程语言选择对开发者来说变得至关重要。本文将深入探讨Kotlin语言如何成为安卓开发的首选,分析其带来的优势及面临的挑战,并预测其未来的发展方向。
|
5月前
|
安全 Java 数据库
Spring Boot中的Kotlin语言支持
Spring Boot中的Kotlin语言支持
|
7月前
|
安全 Swift Android开发
构建移动应用:Swift vs Kotlin —— 两大主流语言的对决
【5月更文挑战第11天】Swift与Kotlin在移动应用开发中各有优势。Swift是iOS开发的首选,以其简洁语法、高性能和类型安全著称;而Kotlin是Android的官方推荐语言,以其与Java的无缝互操作、空安全特性和简洁代码受到青睐。两者在语法简洁性、性能和社区支持上表现优秀,但平台兼容性不同。开发者应根据项目需求和目标平台选择合适的语言。
|
7月前
|
移动开发 Java Android开发
Android应用开发:Kotlin语言的优势与实践
【5月更文挑战第7天】 在移动开发的世界中,Android平台的Kotlin语言以其高效、简洁的语法和强大的功能吸引了众多开发者。本文将深入探讨Kotlin语言的核心优势,并通过实际案例展示如何在Android应用开发中有效地运用这一现代编程语言。我们将从语言特性出发,逐步分析其在提升开发效率、改善代码质量以及增强应用性能方面的具体表现,为读者提供一个全面而细致的Kotlin应用开发指南。