android - Koin 中的 DSL 有什么用?
问题描述
在 Dagger 2 中,我们在编译时进行了代码生成。根据Koin 库网站,Koin 不进行任何代码生成,是一个“DSL、轻量级容器和实用 API”。
在阅读了有关 DSL 的 Martin Fowlers 博客之后,在我看来 DSL 可以生成为代码,或在运行时解释。
来自马丁斯的文章:
DSL 可以通过解释或代码生成来实现。解释(读入 DSL 脚本并在运行时执行)通常是最简单的,但代码生成有时是必不可少的。通常生成的代码本身就是一种高级语言,例如 Java 或 C。
但是如果 Koin 不生成任何代码,Koin 是在运行时解释的吗?这是否意味着 Koin 带有某种解析器?正如我所看到的,没有解析器,那么是不是意味着 Kotlin 本身就是解析器?
谢谢
解决方案
有内部和外部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。
推荐阅读
- asp.net-mvc - 单击按钮时未选择 Casecading 下拉列表
- node.js - 为什么我会收到此错误:SyntaxError: Unexpected token T in JSON at position 0 at JSON.parse (
) 在 XMLHtt…, - geometry - In SwiftUI, how to determine a Circle()'s size to draw a overlay on scale with that circle?
- angular - 在 Angular 6/7 中获取 URL 参数的最佳方法
- javascript - 禁用 iFrame 内的外部内容加载
- python-3.x - sklearn NBClassifier 有一个意外的关键字参数“var_smoothing”
- python - 将文本应用到两个 tkinter RadioButtons
- python - Package not installing correctly to Python environment
- php - 如何在每个帖子中显示多个具有不同数字的元框?
- php - 如何检查数组是否有给定键