首页 > 解决方案 > Koin 中的 DSL 有什么用?

问题描述

在 Dagger 2 中,我们在编译时进行了代码生成。根据Koin 库网站,Koin 不进行任何代码生成,是一个“DSL、轻量级容器和实用 API”。

在阅读了有关 DSL 的 Martin Fowlers 博客之后,在我看来 DSL 可以生成为代码,或在运行时解释。

来自马丁斯的文章:

DSL 可以通过解释或代码生成来实现。解释(读入 DSL 脚本并在运行时执行)通常是最简单的,但代码生成有时是必不可少的。通常生成的代码本身就是一种高级语言,例如 Java 或 C。

但是如果 Koin 不生成任何代码,Koin 是在运行时解释的吗?这是否意味着 Koin 带有某种解析器?正如我所看到的,没有解析器,那么是不是意味着 Kotlin 本身就是解析器?

谢谢

标签: androidkotlindependency-injectiondagger-2koin

解决方案


内部外部DSL。引用福勒的话:

DSL 有两种主要形式:外部和内部。外部 DSL 是一种独立于宿主通用语言进行解析的语言:很好的例子包括正则表达式和 CSS。外部 DSL 在 Unix 社区中有着悠久的传统。内部 DSL 是宿主通用语言中 API 的一种特殊形式,通常被称为流式接口。模拟库(例如 JMock)定义测试期望的方式就是很好的例子,Ruby on Rails 使用的许多机制也是如此。内部 DSL 也有着悠久的使用传统,尤其是在 Lisp 社区中。

外部 DSL(有时,并非总是)涉及代码生成;Koin 是一个内部 DSL,它不是。

在 Martin Fowler 的博客https://martinfowler.com/bliki/DomainSpecificLanguage.html之后,他说 DSL 可以转换为代码(代码生成)。或者它可以在运行时进行解释。

这是外部DSL 的两个选项。

如果我理解正确,这意味着 Koin DSL 就是 Kotlin

是的。

不同的写法,在运行时解释。

不,它只是 Kotlin,使用 Kotlin 编译器编译的。内部 DSL 和库之间没有大的区别。如果它使您的代码具有足够的可读性,则可以将其视为 DSL。


推荐阅读