以科特林为例

Recently, my wife picked up a Kindle Fire, and I figured it would be fun to write an app for it. In fact, you may recall that I’ve been trying to make a library app for her for a long time. Well, what a better way to give it another chance than by taking Kotlin for a spin.

Mobile App Development

My relationship with mobile app development has been rather brief. In fact, my one and only experience with it was my last semester of undergrad in 2016 when I built an Android app to interact with a smart lock.

那时,我只熟悉Java,C,Verilog和x86。 根据记录,这是追求计算机工程学位的人的预期成绩。 无论如何,除了这些语言之外,我没有太多经验,因此我选择了Android途径来利用我的Java经验。

对于那些好奇的人,我们使用了Arduino来驱动电磁锁。 Arduino具有蓝牙附件,我们曾通过Android移动应用程序与蓝牙锁进行通信。 老实说,该项目是非常基本的,但是与多学科团队一起从头开始设计时,我感到非常有趣。

快进到今天,您会发现变化不大-至少直到最近才发生变化。 作为一个多语言的人,我决定不仅要尝试移动应用程序开发,还要尝试在Kotlin工作。

Revisiting PopLibrary

早在2016年初,我决定为当时的女友Morgan制作一个图书馆应用程序PopLibrary。 她希望可以使用某种东西来对自己的藏书进行基本分类,以便像图书馆一样将其借给学生。

The Path to Failure

为了使事情变得有趣,我决定扩展该工具,以便有可能从中赚钱。 特别是,我希望提供与Morgan一样的所有相同功能,并增加书本推荐等功能。 然后,这些建议将被绑定到我的Amazon Associates帐户中,这将使我赚大钱-或至少是我想的那样。

事实证明,在过去的两年中,我无法实现该应用程序。 我想我只是不具备编写完整堆栈应用程序的技能,而这种现实从未真正实现过。毕竟,我尝试过三个不同的时间来实现PopLibrary:

  • C#中的Windows应用JavaFX应用Laravel Web应用

经过三次尝试,我放弃了。 然后,摩根(Morgan)购买了Kindle Fire,让我又一次兴奋了。 无论出于什么原因,我都觉得事情可能有所不同。

Shifting Requirements

在三次失败之后,我决定这次要实施Morgan首先要的所有功能。 然后,我将尝试看看我是否可以赚一些钱。 话虽如此,PopLibrary应该能够执行以下操作:

  • 显示用户拥有的书籍列表允许用户添加和编辑自己的书籍(书名,图像等)本地保留书籍数据(长期目标:云存储)提供搜索和过滤器功能以更改显示哪些书籍允许用户借书给其他用户使用相机扫描条形码

至此,我已经实现了前几个功能,并且我只在该应用上工作了大约两天。 有经验值得!

Kotlin Impressions

话虽如此,我确定您不是来这里了解我的项目的。 您来这里的原因可能有很多,例如:

  • 找出是否值得检查Kotlin看初学者对语言的看法分享一些成长中的痛苦

不管是什么原因,到目前为止,这是我对Kotlin的看法。

Save Yourself from Null

我乐于使用的几乎每种语言(C,C#,Java,Python,JavaScript,PHP等)都具有这种概念空值。 对我来说,空值才有意义。 毕竟,当引用类型不存在时,它是一个完美的价值。 例如,如果您向用户提供表单,而他们选择不填写某些可选元素,则这些元素的值应为空值-不是一些任意值。

Well, at least, that was my understanding of null. I didn’t realize that it could be such an issue. In fact, there’s been a ton of literature regarding null as one of the biggest mistakes in computer science. Oddly enough, I hadn’t heard about this animosity toward null until I was writing my Hello w ^orld in Swift article in 2017.

Introducing Nullable

由于空值可能带来的问题,许多现代语言都试图删除它们。 至少,像Kotlin和Swift这样的语言已经包装了空值在对象中引入了一些安全检查。 换句话说,除非您要NullPointerExceptions(NPE),否则不再需要它们。

特别是在Kotlin中,您可以将任何变量设置为可为空使用问号:

var count: Int? = null

在这里,我们创建了一个名为计数类型真的吗 meaning 计数 could be a number or 空值。 使用时计数,您可能要在其上调用诸如减量方法之类的方法:

count.dec()

理想情况下,此方法将减少计数,但是计数实际上不是数字,而是空值. In most languages, we’d get an NPE,但是Kotlin will actually fail to compile. To accomodate for this, we have to change the syntax slightly:

count?.dec()

在这里,我们对计数。 如果计数是空值,整个链条将返回空值,但我们不会获得NPE。

Nullable in Practice

现在,这是一个很棒的功能空值讨厌的人,但我发现它有时会使生活变得更艰难。 例如,我创建了一个书该类看起来类似于以下内容:

data class Book( 
  val isbn13: String? = null, 
  val title: String? = null, 
  val author: String? = null, 
  val editor: String? = null, 
  val language: String? = null, 
  val coverImageURL: String? = null, 
  val pageCount: Int? = null, 
  val dateOfPublication: Date? = null
) { }

我已将每个字段设置为可为空因为我不想用任意数据填充这些字段。 换句话说,我不想将String字段设置为空字符串或其他任意数据,因为我必须记住该默认值,以便以后进行检查。 相反,我将所有未填写的字段保留为空,并在出现空问题时进行处理。

也就是说,我遇到了几个问题。 例如,如果我想检查标题中是否包含字符串,则可以这样写:

title?.contains("Gatsby", true)

当然,这里的问题是该表达式可能返回true,false或null。 在像JavaScript这样的语言中,条件可能能够解决这种歧义,但Kotlin则无法。 结果,我们基本上必须使用猫王操作员:

title?.contains("Gatsby", true) ?: false

换句话说,如果标题是空值然后表达式返回false。

现在,假设有某种条件可以检查其中一些条件。 很快,我们得到了一个混乱的表达式,该表达式要求猫王运算符处理任何类型的null可能性。 我最终将上面的表达式包装在一个函数中,并使用OR运算符将各种可能性链接在一起:

checkContains(title, str) 
  || checkContains(author, str) 
  || checkContains(editor, str) 
  || checkContains(language, str)

显然,这不理想,但是没有NPE! 我想象更多经验丰富的Kotlin开发人员将有更好的方法来解决此问题,但我只是想让应用程序运行。

Compare Objects with Operator Overloading

虽然Kotlin对我来说最有趣的功能是零安全,但我不得不说操作员重载紧随其后。 通常,我会完全反对运算符重载,因为它会给语言带来不必要的复杂性,但是我认为Kotlin在此功能方面做得很好。

不幸的是,为了对功能有所了解,您需要对Java的工作原理有所了解。 特别是,您需要熟悉等于()对象的方法和相比于()可比接口的方法。

Object Equivalence

在Java中,所有对象都有一个等于()方法,因此可以针对另一个对象测试它们是否相等。 当然,除了等于()是个==运算符,但它有不同的用途。 除了测试两个对象是否相等之外,==操作员测试两个对象是否具有相同的标识。 换句话说,如果两个对象具有相同的标识,则它们实际上是一个具有多个别名的对象。

在科特林,==普遍用于平等。 同时,身份检查是通过===操作员。 结果是,==和等于()是同义词。 一旦实施了等于()方法,我们可以使用==运算符代替:

val x = Date(1000)
val y = Date(1000)
x.equals(y) // Evaluates equality based on equals() 
implementation x == y // Does the same exact thing

事实证明,IntelliJ实际上是通过操作员来推广该方法,我是一个忠实的拥护者。 但是,等等,情况会变得更好!

Object Comparison

在Java中,当我们想要比较两个对象(例如,出于排序目的)时,我们通常会确保实现可比接口。 作为该接口的一部分,我们必须覆盖相比于()该方法接受一对对象并返回表示它们之间关系的数字。 当两个对象相等时,该方法应返回0。同时,当调用对象是“更大”的对象时,该方法应返回一个正数,否则返回一个负数。

确定哪个对象“更大”取决于我们使用的对象类型。 例如,字符串“ apple”小于字符串“ carrot”,因为字母顺序指示“ apple”排在最前面。 换一种说法,相比于应该表现如下:

"apple".compareTo("carrot") // Returns some negative number
"carrot".compareTo("apple") // Returns some positive number

好歹,相比于有点令人困惑,而且Kotlin通过引入一些操作员,在减轻这种混乱方面做得很好。 使用与上述相同的示例,我们可以使用关系运算符比较“苹果”和“胡萝卜”:

"apple" > "carrot" // false
"apple" < "carrot" // true

就我个人而言,我用它来按书目分类法对书籍进行分类。 在我的项目中Lexile是一个实现可比。 为了比较它们,我使用它们的数值:

override fun compareTo(other: Lexile): Int { 
  return this.toInteger() - other.toInteger()
}

然后,我可以比较两个Lexile对象如下:

val lex1 = Lexile(270, Lexile.LexileType.NA)
val lex2 = Lexile(400, Lexile.LexileType.NA)
assertTrue(lex1 < lex2)

现在,我认为这很酷。

Say Goodbye to Verbosity

人们对Java的最大抱怨之一就是该语言的冗长性。 特别是,变量定义需要大量的细节:

ArrayList<Integer> myList = new ArrayList<Integer>()

为了创建此列表,我们必须指定很多信息:

  • 类型两次通用类型,两次名称关键字(新)运算子(=)建设者

当然,这行代码的长度可以成倍增长,具体取决于类型名称的长度,嵌套泛型类型的数量以及构造函数的大小等因素。

为了解决这个问题,Kotlin引入了更简洁的语法:

val list = arrayListOf<Int>()

显然,这里发生了很多事情,但是请务必注意缺少冗余信息。 我们没有指定类型,但是我们可以选择。 此外,数组列表容易得多:

val list = arrayListOf<Int>(5, 6, 8, -4)

现在,虽然减少的冗长性很好,但我还要指出,Kotlin还引入了两个新的关键字:值和变种。 我们用值 when we want to mark a 变种iable as immutable or read-only (think 最后 from Java)和变种 to mark a 变种iable as mutable.

Mastering the Art of Flow Control

如果我从使用编程语言中学到了什么,那么就有大量的流控制机制。 例如,有if语句和循环仅适用于初学者。 然后,有一些有趣的机制,例如goto和switch语句,它们提供了更多的流控制选项。

话虽如此,Kotlin向我介绍了另一种流控制机制:什么时候。 本质上是开关语句,但是我发现语法要干净得多:

override fun toString(): String { 
  return when (this.type) { 
    LexileType.NA -> level.toString() + "L" 
    else -> type.name + level.toString() + "L" 
  }
}

通过这种方法,我们覆盖了toString()在两种可能的情况下返回字符串的方法:

  • 类型是NA类型是其他

特别是,我们返回a的结果什么时候接受此对象类型的语句(相同Lexile班级)。 如果类型为NA,则返回一些字符串。 否则,我们返回其他字符串。

我认为,什么时候语句很聪明,因为它删除了您可能会在一个开关语句:中断,返回等。自然地,我已经使用了它们很多,因为IntelliJ实际上比if语句链更喜欢它们。 而且,我只是觉得它们很酷。

The Verdict

截至目前,我非常喜欢Kotlin。 空安全功能很难解决,但其他所有功能都很棒。 Kotlin是我对Java的所有爱好,以及对Python等高级语言的所有爱好。 有了大部分样板,我觉得我可以真正快速地构建某些东西,同时也依赖于已编译语言标准的所有出色的静态分析实用程序。

话虽如此,我们很快就会发现我的感受。 我可能正处于蜜月期,但我真的很喜欢这种语言。 这让我想起了我刚开始使用C#时的感受—两者都是对Java的重大改进。

由于这是我第一次真正地深入研究这种语言,因此我实际上没有任何文章可推荐。 无论如何,这里有几篇文章我很想引起更多关注:

Also, if you enjoyed this article, give it a share! By the time it publishes, I will probably have a totally different opinion on the subject, so let’s also have a dialogue. For those of you that want to foster some community, make your way over to the members page and sign up! For the less committed, there’s also a newsletter. As always, thanks for stopping by!

The post Ťaking Kotlin for a Spin appeared first on Ťhe Renegade Coder.

from: https://dev.to//renegadecoder94/taking-kotlin-for-a-spin-1322

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值