【问题标题】:What is the use of DSL in Koin?Koin 中的 DSL 有什么用?
【发布时间】:2019-12-02 15:25:35
【问题描述】:

在 Dagger 2 中,我们在编译时生成了代码。 根据Koin library website 的说法,Koin 不做任何代码生成,是一个“DSL、轻量级容器和实用 API”。

After reading Martin Fowlers Blog regarding DSL, 在我看来,DSL 可以生成为代码,或在运行时进行解释。

来自马丁斯的文章:

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

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

谢谢

【问题讨论】:

  • Koin 中的 DSL 让 Kotlin 更容易编写。
  • @Froyo 抱歉,但这对我没有多大帮助。你能详细说明一下吗?关注 Martin Fowler 的博客martinfowler.com/bliki/DomainSpecificLanguage.html 他说 DSL 可以转换为代码(代码生成)。或者它可以在运行时进行解释。如果我理解正确,这意味着 Koin DSL 只是 Kotlin 以不同的方式编写,在运行时解释。这也意味着 Koin 带有某种解析器。我做对了吗?

标签: android kotlin dependency-injection dagger-2 koin


【解决方案1】:

internalexternal DSL。引用Fowler

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 可以转换为代码(代码生成)。或者它可以在运行时进行解释。

这是 external DSL 的两个选项。

如果我没听错的话,这意味着 Koin DSL 就是 Kotlin

是的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2023-02-02
    • 2010-10-09
    • 2017-09-07
    • 1970-01-01
    相关资源
    最近更新 更多