科特林 如何使我成为生产力更高的软件开发人员

科特林 如何使我成为生产力更高的软件开发人员

我已经编写JVM代码已有七年多了,主要是使用Java。大约两年前,当我拿起Kotlin时,情况发生了变化。到现在为止,我或多或少完全放弃了Java语言,转而支持Kotlin。我这样做是因为我觉得这门语言更有生产力。它使我更加专注于业务逻辑,而不是强迫我一遍又一遍地编写样板代码。在这篇文章中,我告诉您Kotlin如何使我成为更有生产力的开发人员。
我当然比对Java更了解Kotlin。 FWIW,几年前,我已经被Oracle认证为Java专家。尽管如此,Kotlin仍然成为我的本机编程语言,我也想鼓励您也考虑一下。当我谈论我的Kotlin生产率时,这可能是基于个人观点。在1.0发布之前,我很早就开始学习该语言,这时我处于一种特殊的境地,从那时起就一直担任该语言的老师。尽管如此,我确信支持Kotlin的某些论点适用于你们中的更多人,所以让我们看看我在说什么。

我的JVM背景

几年来,我大量使用Java,并用该语言编写了许多高效的代码。 Java是我的第一语言,那时我对其他语言还不太了解。尽管没有见过许多其他语言,但使用Java时我从未真正感到过快乐,当Java 8于2014年问世时,这种情况就改变了。我们的代码库。在某些情况下,我不应该这样做,但是它正在渗入Java边缘,我喜欢它。那时,我开始研究其他JVM语言,并开始学习Scala。我首先阅读了它的文档,起初很有趣,但随后很快就变得令人恐惧。我从来没有真正给过它一个适当的机会,但回首过去,我不后悔仅仅过了几周就把它收了起来。

科特林

我不太记得我第一次听说Kotlin的地方。我唯一的一件事 请记住,JetBrains与其一起被提及。我一直是他们产品的粉丝,因此很明显,我不得不研究他们创建的语言。除了Scala之外,Kotlin的文档非常易于消化,当我阅读它时也从未感到恐惧。我记得我仅仅几天就疯狂地阅读了其中的内容,其中有两个我不太直接理解的话题,后来被加为书签。这些主题之一是支持领域,另一主题可能与授权支持有关。
使Kotlin变得超级容易的另一件事是IntelliJ的出色支持。我通过IDE和文档学习了该语言。我完全推荐的另一种资源是这本书 行动中的科特林 这也帮助我更好地了解了语言的内部原理。

标准图书馆

科特林 has a fantastic standard library. If you think that Java also 做 es, I can assure you that it is much weaker than 科特林 's. You won't need external libraries for everyday tasks like checking whether a String is blank 要么 copying streams around. 科特林 provides all that and much more. It comes with an extremely sophisticated collections API, defines commonly needed extension functions on default types and finally gives the developer the option to add their own functions via extensions. You can find an excellent 文章 on a bunch of standard functions 这里 例如。

功能丰富的语言

这一点应该很明显。尤其是当您来自Java之类的语言时,您会为Kotlin提供的明快功能感到高兴。考虑一下null安全性,扩展功能,更简单的泛型或其由以下人员提供的醒目的并发方法: 协程 例如-它们都使我们更具生产力,并使语言更加令人愉悦。

科特林 很直观

由于出色的标准库和丰富的功能集,Kotlin是一种非常直观的语言。通常,您可以尝试对给定类型执行一些操作,并查看IDE建议的现有功能。然后,经常会发现您要查找的功能已经定义。这样的例子是 字符串:: substringBefore, 文件扩展名 要么 Iterable :: toSet .

功能风格

当我们谈论标准库以及该语言本身的直观性时,我们还想提及该语言的功能方面。在这一部分中,我特别希望专注于功能。您可能已经知道,职能是Kotlin中的一等公民。您可以声明包含它们的变量,将它们传递,甚至从其他函数返回函数。您可以在每个Kotlin代码库中找到lambda(未声明和直接传递的函数)。它们在Kotlin标准库中也被大量使用。其中一个例子是非常有用的作用域函数集,您可以了解 这里 。当然,lambda是集合API的重要组成部分,即 科特林 .collections, as well. I can't even tell 怎么样 many times I use these functions in my day to day work. It somewhat gives me the creeps when I think about transforming collections within traditional for loops and 怎么样 difficult it was to perform similar tasks in Java, especially before Java 8. Let's see an example in action. Let's assume we have some table/grid data modeled as follows:


data class Grid(val rows: List<Row>)
data class Row(val data: List<Column<*>>)
data class Column<T>(val name: String, val value: T)

A Grid has multiple Rows which consists of multiple Columns. The task would be to calculate the totals for every given column identified 通过 its name:


有趣的calculateTotals(数据:网格)= data.rows
    .flatMap(Row :: data) 
    .groupingBy(列<*>::name)
    .fold(0.0){累加器,(_,value)->
        累加器+当(值){
            是数字-> value.toDouble()
             否则- > 0.0
        }
    }

使用Kotlin标准库中的函数,我们可以执行以下操作:
1.使用以下命令收集单个集合中所有行的所有列 flatMap
2.使用以下名称将这些列分组 groupingBy
3.通过汇总它们的值来累积分组的列

上面仅是一个简单的示例,很好地演示了如何使用给定的收集功能。如前所述,我每天都在使用这些功能,我广泛使用它,并且我不想再错过了。

您需要编写更少的代码

函数式编程风格最重要的优点之一是,您必须总体上减少编写代码的事实。您使用所谓的内部迭代,而不是指定如何显式迭代给定集合。循环一开始听起来很简单,每个人都应该能够正确应用它们。尽管如此,它们仍然容易引起难以发现的错误,这是样板代码的常见问题。功能性API的想法是,您可以专注于 什么 而不是 怎么样 和thus 做 n't iterate collections explicitly but rather use functions like map, filter etc. which handle the iteration for you.

更少的样板-更少的错误

样板代码可能是错误的根源;自然,您需要编写的代码越多,就可以创建更多的潜在错误。由于Kotlin消除了许多繁琐的样板代码的必要性,因此该语言通常使您引入的逻辑错误更少。一个很好的例子是单例模式。正确实施它并不像您想象的那么简单。您必须处理对单例的同时访问,这使得难以实现此类对象的初始化代码。有多种解决此问题的方法,如果手动编写,所有这些方法都可能导致潜在问题。科特林,通过其 object 构造 ,为开发人员抽象了此代码,不需要您每次都编写重复代码。

易于调试和维护

尽管在Java中,您必须花费大量时间阅读和理解样板代码,但由于已经提到的相同原因,在Kotlin中这并不是什么大问题:一组复杂的功能和一个更简洁的语言。将现有的Java代码库移至Kotlin可以通过以下方式减少代码量: ~40% 如果正确完成。当然,这使Kotlin代码更易于阅读,调试和维护。公平地说,如果不小心使用丰富的功能集,可能会导致难以阅读的代码。因此,不要为您编写代码,而是为将来必须维护的人员编写代码。

很有趣

上述所有原因使Kotlin成为一种有趣的语言。实用,简洁和直观的语言是程序员可以想到的最佳工具,并且您不应该使用其他任何工具。获得乐趣会自动提高生产力。

在称自己为Kotlin开发人员之前应该做什么

我想指出,我认为准确了解您的工具集非常有帮助。我花了很多时间学习Kotlin,主要是它的工作原理和它提供的功能,每个人在编写认真的Kotlin代码之前应该做的事情。作为Java开发人员,您可以快速编写编译Kotlin代码,但这与编写惯用的Kotlin代码仍然有所不同。一直没有足够的时间在Google上搜索StackOverflow帖子。在开始之前,您应该结合一些基本技术。我建议您学习完整的Kotlin文档,只需几天即可完成。最重要的是,这本书 行动中的科特林 是您可以找到的最佳资源,我强烈推荐它。

结论

放弃使用Java来支持Kotlin可以提高我的编程技能,并使我的工作效率总体提高。与Java相比,我感到更开心,引入了更少的错误并减少了错误。我不想说只有Kotlin可以为您做到这一点。但是,也许是时候开始使用一种更现代的语言,以扩大您的视野并提高生产效率。

18个想法 “ 科特林 如何使我成为生产力更高的软件开发人员

  • 扬·弗拉基米尔·莫斯特尔

    同样,我将Java保留到2016年年底,但从未回头
    Java8也让我研究其他语言,实际上是Dart,所以它已经是Java8语法的一种改进,尽管空安全性很尴尬并且许多功能概念花了一些时间,但我偶然遇到了Kotlin并立即被钩住了。习惯。

    期待多平台变得更加成熟,Android上的KotlinJVM,KotlinJS和Kotlin已经很棒,最终感觉就像我’m实际上解决了业务问题,而不是被空检查和其他样板程序所困扰。

  • 彼得

    很多你’此处列出的ve已经存在于.NET中,并且已经存在了一段时间。一世’永远不会真正理解行业对Java的痴迷,直到有人对它为什么做出真正确定的论点’仍在使用,我’我只是假设它’的原因是,许多遗留的东西都在Java中,而开发人员(和管理人员)却没有’不想将时间或金钱投入到切换平台上,尤其是从IntelliJ到Visual Studio。

    也许我’是错的,Java是一种很棒的语言– but I’能够使用ASP.NET编写RESTful服务,其代码只有等效Java所用代码的一半– based service.

    • 马丁·沃斯(Martijn Vos)

      不,Java不是那么好。 JVM很棒。 Java只是无处不在。它比以前的版本更好,并且在JVM中,它提供了一个稳定而灵活的平台来进行开发。但是Java语言过于冗长,并且受许多错误决策的影响。与现有Java代码轻松交互的新JVM语言将是一个好主意。

      在过去,我希望Groovy(不错,但是太慢)或Scala(快速,漂亮,但有时也很恐怖)是那个好主意。我没有’尚未与Kotlin合作,但听起来可能是Java,Groovy和Scala之间的完美中间地带。

    • 你不’看不到Java开发人员将在dotNet论坛上涂抹其平台。但是每当有一篇文章称赞JVM语言时,都会出现dotNot孤独的游侠说net更好,等等等等。我们’对微软不感兴趣’创建的仅用于窃取Java的copycat平台’s mindshare.

      • 莫吉米尔

        只需尝试学习一些有关C#的知识并对其进行一些实际的实践,您就会发现产品差异很大,因此您的答案就不能被认真对待。 C#实际上是一种非常创新的语言,如果他们复制了一些想法,’对所有人都有好处。毕竟,谁今天不复制…

  • 嘿,谢谢您分享自己对Kotlin语言的感受和体会!

    我喜欢您已经提到的所有内容:

    科特林 的直观性,
    功能丰富的实用标准库,
    发挥一流公民的作用,而不会出现类似斯卡拉的并发症
    样板更少:我可以专注于业务逻辑而不是无关紧要的细节,
    更多地关注“什么”而不是“如何”,
    它的乐趣更大(我最初来自Python,Ruby,Scala和Clojure等非Java语言,因此在Kotlin中编程时会感到“宾至如归”)。

    最重要的是,我想提一下Kotlin的以下特色,这些特色使我的生活更简单:

    与JVM生态系统的双向互操作性,这使我可以使用成熟的库和框架;
    类型推断(不仅针对局部变量):您可以选择何时在代码中指定更多类型细节以及何时将其隐藏,因为从读者的角度来看,它们只是杂乱无章的;
    不变性是操作的默认方式:“ val”是仅在必要时升级到“ var”之前的默认选项,“ listOf”是仅在需要时升级到“ mutableListOf”之前的默认选项;
    很少使用DSL来解决非常特殊的问题(以及用于库);
    命名参数和默认参数值的组合对于减少重复和使调用非常可读非常有用,并使它们仅关注对读者重要的内容;
    在进行任何类型检查之后进行智能广播,使您无需进行直接的类型转换(或可为空的可拆包),而无需重复进行操作:在其他类型的语言中,这是一个非常烦人的问题,而Kotlin则很好地解决了这一问题;
    最后但并非最不重要的一点是,尽管Kotlin是一种简洁的语言,但它并不能一路走来(例如Scala或其他语言),而是在非常简洁的情况下找到了一个很好的平衡,它可以使开发人员最大化代码的可读性,并且不妨碍这样做。如果过于简洁或不够简洁,那么编写可读代码并专注于业务逻辑将变得更具挑战性。

    在Kotlin上工作了2年后,我不得不回到Java项目,而没有机会进行Kotlin转换(情况,不要问!),使用流,可选内容和样板非常痛苦,这正推动着我疯了,非常难过。

    我期待Kotlin在后端获得更多的全球采用。

  • 托尼·C

    去年,我一直在使用Kotlin进行Android开发,还使用过Kotlin / Native / 科特林 Multiplatform!
    科特林 的优点已经被记录在案,但是另一个好处是Kotlin到C的接口,这绝非易事。用Kotlin本机编写Mac App时,我能够调用Objective-C API或posix C API,动态分配C内存并从CString到Kotlin Strings进行隐蔽。结果是代码易读,有趣且快速!我的桌面应用程序(测试工具)创建了Android模拟器,安装/卸载了APK,并使用以下命令将数据传递给正在运行的Android应用程序“adb and am”退出Android SDK。我叫Android SDK“adb”从Kotlin Native使用system(),它是一个和我一样古老的C函数。我喜欢这种语言,并且会拒绝每天不进行Kotlin编码的任何工作。我注意到,直到开发人员花了一周的时间,它很难表达出Kotlin的帮助,这足以使他们成为Kotlin的狂热分子!不仅仅是一个“better Java”是一个很棒的跨平台开发解决方案!

  • 麦克风

    谢谢你的分享。大约2年前也切换了,并在Kotlin上训练了3个团队。他们的经历是相似的。唐’除非必须这样做,否则不要编写Java代码。

    对于书籍,同意Kotlin in Action是很棒的。一世’d还建议读者阅读Venkat Subramaniam的新书。“Programming 科特林 ”在实用程序员(The Pragmatic Bookshelf)上结束。它’在Beta中,但也完整。涵盖1.3,包括协程。

  • ya

    感谢提供这篇好文章!我是一名Java开发人员,今年开始学习Kotlin。

    我有一个关于阅读的小问题“Kotlin in Action ”这本书,要真正理解并进行练习需要多长时间?

  • JHelp

    有趣的calculateTotals(数据:网格)= data.rows
    .flatMap(Row :: data)
    .groupingBy(列<*>::name)
    .fold(0.0){累加器,(_,value)->
    累加器+当(值){
    是数字-> value.toDouble()
    否则- > 0.0
    }
    }

    可能看起来很酷,但您知道该怎么做吗“flatMap” and “groupBy” ?

    您很幸运有一个小的列表,因为每种方法都会创建一个新列表或新地图,并且已经完成许多复制。因此,在内存和性能方面令人恐惧。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *