当前位置: 首页 > news >正文

网站建设的目的及定位功能遵义制作公司网站的公司

网站建设的目的及定位功能,遵义制作公司网站的公司,深圳网站设计十年乐云seo,做网站大图素材DSL(领域特定语言)是Kotlin所带来的强大语法特性之一#xff0c;也是Java中所不存在的功能#xff0c;JetBrain也基于DSL开发出了众多的开源库#xff0c;Kotlin的开发者可以使用DSL来重构许多已有的代码#xff0c;甚至有可能做到彻底抛弃HTML#xff0c;XML#xff0c;…DSL(领域特定语言)是Kotlin所带来的强大语法特性之一也是Java中所不存在的功能JetBrain也基于DSL开发出了众多的开源库Kotlin的开发者可以使用DSL来重构许多已有的代码甚至有可能做到彻底抛弃HTMLXMLSQL等代码的地步。 简单介绍DSL DSL是领域特定语言的英文缩写。那到底什么是领域特定语言 我们最常使用的领域特定语言就是SQL以及正则表达式SQL和正则表达式都只能解决它们特定领域内的问题SQL用于数据库操作而正则表达式则是用来处理文本字符串它们也都有自己的语法但是你无法使用它们在计算机上编写完整的程序所以它们并不是我们常规意义上理解的“编程语言”那些有能力在计算机上编写几乎任何程序的编程语言诸如KotlinJavaPython等等我们有一个专业术语来定义它们叫做图灵完备语言而上面介绍的那些DSL就不是图灵完备的。 Kotlin DSL 的特点 Kotlin DSL 利用 Kotlin 语言的灵活性允许我们创建领域特定语言。它可以让我们编写更简洁、更优雅的代码同时提高代码可读性。 使用到的Kotlin语言特性 Kotlin DSL的例子 我们来举一个Kotlin DSL的例子如果我们使用JetBrain构建Android UI的开源库Anko的话我们可以用DSL重构一份XML代码我们先来看看XML LinearLayoutandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:padding30dpandroid:orientationvertical EditTextandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:hintNameandroid:textSize24sp /EditTextandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:hintPasswordandroid:textSize24sp /Buttonandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:textLoginandroid:textSize26sp //LinearLayout如果换成DSL来编写如下 lineatLayout {orientation LinearLayout.VERTICALpadding dip(30)editText {hint NametextSize 24f}.lparam(wrapContent, wrapContent)editText {hint PasswordtextSize 24f}.lparam(wrapContent, wrapContent)button(Login) {textSize 26f}.lparam(wrapContent, wrapContent)}即使你不是Android开发者也可以轻易的看出两者的异同XML中的元素LinearLayout, EditTextButton等的层级嵌套关系和DSL中的完全一至属性的赋值也是应有尽有这说明如果你想把当前的一些编写起来不那么方便的代码迁移到基于Kotlin DSL的库大多数情况下其实学习成本并不高实际上变化的只是一些简单的语法规则。 我们在开始下一节之前先来看看这一段DSL代码做一个简单的分析并提出几个问题。我可以首先先告诉大家一个结论linearLayout {}editText {}button {}这些东西全部都是Kotlin高阶函数而orientation和padding这些都是Kotlin中的属性学习过Kotlin的高阶函数的你应该知道linearLayout {}大括号的内部实际上是一个lambda表达式它作为一个参数被传递给了函数linearLayout而在这个lambda表达式的外部你是无法引用到orientation和padding属性的同理在editText {}的lambda表达式的外部也是无法引用到hint和textSize属性的。因为orientation是LinearLayout类的属性而hint和textSize是EditText类的属性这也就说明在这些lambda表达式的内部持有了一个对这些类型对象的引用而这样的lambda表达式就是带接收者的lambda。 深入理解带接收者的lambda 对象调用其对应的类内部的方法是所有有面向对象编程经验的开发者都知道的原则但这里要讲清楚带接收者的lambda还是要从这里讲起。我们先来看下面的例子 class A {fun function1() {function2()}fun function2() {// do something...}}// 扩展函数fun A.function3() {function1()function2()}fun main(args: ArrayString) {val a A()a.function1()a.function2()a.function3()}代码很基础function1和function2都是A的成员函数在function1中可以直接调用function2即在同一个类的方法中可以直接调用另一个方法而在A的外面我们则需要创建一个A的对象来调用function1和function2因为在A的内部所有的成员变量/函数都持有一个A类型对象的引用而在A的外部在调用这些成员的时候我们需要知道调用它的到底是哪一个对象这是最基本的类和对象之间的关系我就不再多说了。但在Kotlin中唯一的例外就是扩展函数在扩展函数中调用其接收者的成员函数或属性可以直接调用这是因为在A的外部调用它的扩展函数需要一个A的对象。学过高阶函数和lambda编程后我们都知道函数和lambda在很多时候可以认为是同一种东西都可以把它们看作是一种有类型的类型由参数类型数量顺序以及返回值类型来确定可被执行且可以被保存在一个变量中的代码段所以带接收者的lambda在某些时候可以认为和扩展函数是等价的注意只是某些时候因为lambda和函数在被编译成.class字节码以后是不同的这是另一个话题这里不再展开了假如我们要定义一个A类型作为接收者类型且一个Int类型作为参数无返回值的带接收者的lambda就可以像如下这样定义 val receiver: A.(Int) - Until {// do something...}如果我们要调用执行这个lambda val a A()a.receiver(3)所以Part 1中介绍的那些诸如linearLayout {}editText {}button {}这些函数都是以一个带接收者的lambda作为参数的普通内联函数让我们以editText {}为例来看看它是如何定义的 inline fun ViewManager.editText(init: (AnkoViewDslMarker android.widget.EditText).() - Unit): android.widget.EditText {return ankoView($$Anko$Factories$Sdk25View.EDIT_TEXT, theme 0) { init() }}inline fun T : View ViewManager.ankoView(factory: (ctx: Context) - T, theme: Int, init: T.() - Unit): T {val ctx AnkoInternals.wrapContextIfNeeded(AnkoInternals.getContext(this), theme)val view factory(ctx)view.init()AnkoInternals.addView(this, view)return view}看起来有点复杂启示拆开来看其实很简单首先这是一个扩展函数接收者是ViewManager这样就限制了这个函数的调用范围即只能在某个父布局中被调用随后我们看到参数init就是一个标准的带接收者的lambda而init在函数内部调用ankoView函数的时候又会在它的lambda参数中被调用ankoView函数用来生成一个EditText对象至于内部的原理我们不去分析而editText函数又会将这个EditText对象返回便于函数的调用者获取这个对象的引用最后我们看到整个函数加了inline修饰符即被声明成内联的这样就保证了DSL API的执行效率而执行init这个带接收者lambda的ankoView实际上也是ViewManager的扩展函数而且它也是内联的这里不再做过多的源码深入。我们简单的体验了一下如何声明一个DSL API从Anko来看实际上就是以下三点 1.使用扩展函数来限制函数的调用范围2.使用带接收者的lambda来保证API中的嵌套关系3.使用inline修饰符把这些有lambda表达式作为参数的函数声明成内联的来保证执行效率 我们这里再详细说一下第二点。 我们在编写HTML和XML的时候其中一点非常重要那就是嵌套关系这些嵌套关系即保证了这些元素之间的包含和被包含的关系又保证了HTML或XML的可读性以使用XML来编写Android UI为例如果不使用XML而是直接编写Java代码的话也是可行的但是我们只能使用Java那种从上到下不停new出一个对象然后用对象不停调用不同方法的办法来创建UI当然也是可行的但是这几乎可以说是让代码的可读性瞬间归零这样编写代码即容易出错后期也几乎不可维护。但是现在Kotlin有了带接收者的lambda我们可以在保留嵌套关系的同时使用Kotlin这样的图灵完备语言来编写我们需要的UI这样就实现了Part 1中提到的内部DSL的全部优点。 函数式的对象的invoke约定 Kotlin的约定有很多种而比如使用便捷的get操作以及重载运算符等等invoke约定也仅仅是一种约定而已我们可以把lambda表达式或者函数直接保存在一个变量中然后就像执行函数一样直接执行这个变量这样的变量通常声明的时候都被我们赋值了已经直接定义好的lambda或者通过成员引用而获取到的函数但是别忘了在面向对象编程中一个对象在通常情况下都有自己对应的类那我们能不能定义一个类然后通过构造方法来产生一个对象然后直接执行它呢这正是invoke约定发挥作用的地方。 class A(val str: String) {operator fun invoke() {println(str)}}fun main(args: ArrayString) {val a A(Hello)a()}输出Hello我们只需要在一个类中使用operator来修饰invoke函数这样的类的对象就可以直接像一个保存lambda表达式的变量一样直接调用而调用后执行的函数就是invoke函数。 我们还有另一种方式来实现可调用的对象即让类继承自函数类型然后重写invoke方法 class A : (String) - String {override fun invoke(str: String): String {println(str)return str}}fun main(args: ArrayString) {val a A(Hello)println(a())}输出HelloHello直接让一个类继承自函数类型这样invoke的函数类型就和继承的类型一致了我们也可以像上面那样直接调用A类的对象最终会执行invoke函数。 使用invoke约定可以构建出什么样的DSL API呢在Anko中好像还没有发现这样的例子但是在Gradle的构建脚本中这样的例子就比较常见 dependencies.compile(junit:junit:4.11)dependiences {compile(junit:junit:4.11)}dependiences实际上就是一个对象它既可以直接调用compile方法又能在它的lambda表达式参数内调用compile可见dependiences也是一个使用了invoke约定的类的对象而它接收的是一个带接收者的lambda表达式作为函数参数。 带接收者的lambda和invoke约定是支撑Kotlin DSL的两大语法特性但实际上在Kotlin中众多的语法糖中还有许多特性为你设计DSL的优雅语法提供了可能这其中包括了中辍调用运算符重载括号外的lambda等等等等我们不妨充分发散自己的思维让我们使用这些众多的优雅语法构建一个属于自己的DSL库用来解决编程中某一类特定领域的棘手问题Json数据格式也是一个讲究嵌套的数据格式我们能否充分发挥我们的想象来编写一个基于DSL的库来对Json做点什么呢 那些优秀的DSL开源库 下面介绍的Kotlin DSL开源库都是Kotlin的亲爹JetBrain开发的这说明就目前来看广大开发者应该还没有把DSL的潜力发挥到极致如果您有其它优秀的的DSL库推荐可以给文章留言。 数据库操作Exposed Exposed是JetBrain推出的可以使用DSL代替SQL来操作数据库的开源库项目地址如下Exposed动态构建Android UIAnko Anko也是JetBrain推出的上文已经提到过了它是一款便于Android开发者使用Kotlin进行Android开发的函数库其中使用DSL动态构建Android UI只是其中的一部分功能这个库的Github地址如下Anko动态构建HTML布局kotlinx.html 也是JetBrain官方推出的库用来使用DSL来构建HTML布局从它的包名中含有kotlinx就可以看出来它的受重视程度高于Anko基本上属于Kotlin官方develop kit中的一部分它的Github地址如下 kotlinx.html 除此之外Gradle已经支持使用Kotlin DSL来编写构建脚本使用Gradle的同学也不妨立刻开始尝试。 本文是对在Kotlin开发语言当中的DSL的一些原理和简单使用解析对于修学Kotlin当然还有很多的进阶技术点。下面是一些总结可以在主业点击可以看看详细的内容板块。 最后 Kotlin DSL 是一种强大的工具可以帮助我们编写更简洁、优雅的代码。通过使用 Kotlin DSL我们可以提高代码的可读性、灵活性和类型安全性。现在让我们开始使用 Kotlin DSL探索编程世界。
http://www.yutouwan.com/news/465314/

相关文章:

  • 婴儿网站建设住栏目安卓应用软件开发方向
  • wordpress目录页去掉西安网站优化培训
  • 营销型的网站企业外贸建站系统源码
  • 重庆网站哪里好html界面设计工具
  • 网站建设制作一个网站的费用工程建设有哪些
  • 做资源网站违法吗佛山网站优化效果
  • 网站统计热力图建站新体验
  • 韩漫网站建设阜阳市城乡建设网站
  • 建设社区服务网站的论文中国建设银行官网电脑版
  • 网站建设费用 开办费学做转手绘的网站
  • 网站不能访问的原因百度快照怎么弄
  • 专题网站建设策划书建站公司网站模板
  • 做网站一般是什么工作淮安营销型网站建设
  • 网站推广和宣传的方法一份完整的活动策划
  • 聊城房地产网站建设电商erp
  • 婚恋网站系统wordpress自助
  • wordpress自定义注册插件关键词自然排名优化
  • 深圳网站设计制vivo手机为什么建设网站
  • 爱站网关键词挖掘机企业网站推广的线上渠道有哪些?
  • wordpress给后台增加功能邢台视频优化效果
  • 网站建设 提成多少sem管理工具
  • 青创网站首页百度站长之家工具
  • 网站移动端适配怎么做wordpress 好不好
  • id注册网站做壁纸网站
  • 网站seo技术能不能赚钱婚纱摄影影楼
  • ui网站界面设计模板手机网站的模板下载软件
  • 网站开发和前端是一样吗wordpress怎样加快访问
  • 快速做网站费用莆田市秀屿区建设局网站
  • 湛江网站网站建设响应式网站是什么
  • rust做网站南京自助网站推广建站