前言

在编程世界里,主流语言的诞生往往都充满着故事性和趣味性。

JavaScript,其原型 “Mocha” 在短短十天内就被设计出来了, 原因是设计者起初想使用一个更简单的语言来代替 Java 去开发网页。

Scala,是由大学里的一位科学家Martin Odersky创建的,他想把函数式编程中的概念搬到 Java 这个面向对象编程的世界中。最终 Scala 成功的结合了这两个编程范式,并走出学院,广泛的应用到了商业领域上。

Java, 最早是在90年代初,为互动电视和机顶盒而设计的。它由一个在 Sun 公司工作的名为 "The Green Team "的团队所设计。但是 Java 的语言设计对当年有线数字技术行业来说,太过优秀、前卫了,以致于它声名大噪,在编程界引发了一场革新。

很多语言设计的初衷和我们今天的用途完全不同,它们一开始往往都是一些试验性的产物,这一点在今天仍然可以看到。而 Kotlin的故事与上述的不同之处在于:

  1. Kotlin 设计的初衷,是成为一个能写大型应用的通用语言;

  2. Kotlin 的设计者并不急于求成,从2010年开发,直到2016年2月才发布了第一个稳定版本。在此期间发生了翻天覆地的变化,如果你能拿到一些早期的代码,那你会发现它和我们现在所用的大有不同。

****

Kotlin 是为务实(pragmatic)而生的实用主义语言,相较于那些学术性或业余性的语言,它从来没有去应用新概念和原理的野心。但也不是完全没有,Kotlin引入了一些新的概念,例如:属性委托。 即使如此,Kotlin 的设计团队还是比较严谨的,他们不仅会分析这些新概念可以在 Kotlin 上使用,也会思考其如何在在其他语言上工作。正所谓“见贤思齐焉,见不贤而内自省也”,他们还很喜欢去了解其他语言的优缺点,并以此为基础对 Kotlin 进行优化。对于 Kotlin 团队隶属的 JetBrain 公司来说,这是一个非常好的策略,因为他们同时也是 IDE 的开发者,他们有各种各样的数据和理论知识,也有各种语言专家,能把自家产品做好做大。

由于 IDE 和语言是同一家公司做的,这使得 Kotlin 与其他语言不同 ---- 语言和 IDE 的结合达到了一个新的境界。 IntelliJ、Eclipse 的代码分析器(Code Analysis)都是使用编译代码相同的编译器来完成的。 得益于这一点, Kotlin 不需要调整IDE,就可以自由地引入更高级的智能转化和类型推断。 Kotlin 设计团队也在不断通过优化 IntelliJ 的 warning 机制和 lint 来帮助开发人员更丝滑的编程。

因为这样的机制,本书不需要再去讲解一些经典的语法优化,因为 IDE可以自动地、精准地将其标的出来,你需做的就是照着 IDE 的提示去优化,便可达到效果。

Kotlin 之哲学

每种语言都有其设计哲学,Kotlin 设计哲学的中心思想是实用主义,这意味着 Kotlin 所有的选择都需要满足商业述求,比如:

  1. 生产力: 应用程序能够快速的被开发和迭代

  2. 可扩展性:随着应用程序的迭代,其开发成本并不会变得更加高,相反可能会更低

  3. 可维护性:程序维护起来更简单

  4. 可靠性: 应用程序按预期运行,错误更少

  5. 高效: 程序运行速度快, 而且在内存、CPU等资源消耗上更少

我们的编程社区,已经为了满足这些述求而花费了很多时间,我们基于平时开发的痛点,发明了许多工具和技术。比如为了防止有人在修改一个功能时,意外的修改了另一个功能的值而产生错误,我们开发了自动测试工具。或者用单一职责原则(SOLID),来赋予程序单一行为,可以帮助我们解决同样的问题。在本书中,我们将会提到许多这样的规则。

编程社区还发现了一些不那么抽象的特性,能够支持更高层次的业务需求,Kotlin 团队收集了那些在语言设计方面很重要的特性,并将它们作为所有设计决策的参考点。这些特性有:

  • 安全性

  • 可读性

  • 强大的代码重用性

  • 工具友好性

  • 与其他语言的互操作性

我想再补充一个通常不会被提起的特性,但是在所有的设计决策中都能有其身影,即:

  • 程序的性能

这些述求并不只是在语言设计开始时就有的。它们之所以能够被赋予到 Kotlin 上,是因为每一个特性都经过了充分的考量,这些特性都非常强烈的反映在 Kotlin 语言上,这可能也是 Kotlin 保持Beta测试状态将近6年的成果。在此期间,Kotlin 的各处都在发生变化。要使编程语言设计出高级特性,需要花费大量时间,而 Kotlin 设计团队在这方面上做的很好。

此书的目的

为了发挥 Kotlin 的真正优势,我们需要正确地使用它,仅仅是了解其特性和标准库(stdlib)是不够的。本书的主要目标是解释如何使用 Kotlin 各式各样的特性来写出安全、易读、可扩展和高效的代码。这本书是为了帮助开发人员更好地编写代码而写的,所以它也涉及到许多程序员的通用规则,如果你很细心,那你会发现书中有多处引经据典,比如《代码整洁之道》、《Effective Java》、《计算机程序的构造和解释》、《代码大全》等等。本书会尽可能多的编写关于 Kotlin 的最佳实战相关的知识,不管这些知识源自于哪里。

可以称这本书是最佳实践的集合。由于 Kotlin 自身的特性,本书和 《Effective X》 系列的其他书籍会有所不同。

Efftive Java 讲解了许多关于 Java 内部问题的警告,而 Kotlin 中,大部分的问题都被 Kotlin 团队解决了。与 Java 不同的是,Kotlin 并不用担心弃用某些东西并在将来修复它。在最坏的情况下,Kotlin 团队可以通过其公司推出的强大的 IDE,来完成几乎所有的迁移工作,以解决问题。

《Effective X》 系列的其他书籍会给出一些关于使用某些函数或构造的提示, 但是这些提示在Kotlin中很少会用到,因为它们中的大多数会被 IntelliJ 标识出来, 少部分的提示会被我留在这本书中。这本书的不同点: 它专注于更高层次的良好实践,这些实践来自于权威机构、Kotlin 的创建者,以及我作为全球国际公司的开发者、顾问和培训师的经验。

适合人群

本书不会讲解任何基础的语法知识,本书是假设你已经拥有了足够的知识和技能的基础上进行 Kotlin 开发。《Effective Kotlin》是为有经验的 Kotlin 开发人员准备的。

我假定即使是有一定经验的 Kotlin 开发人员也有可能不知道某些特性,因此我会解释这些概念,如:

  • 属性(Property

  • 平台类型(Platform type

  • 具名实参(Named arguments

  • 属性委托(Property delegation

  • DSL语法 (DSL creation

  • 内联类和内联函数(Inline classes and function

我希望这本书能够成为 Kotlin 开发人员的编程指南,来帮助你成为一个了不起的 Kotlin 开发人员。

目录设计

本书根据 Kotlin 特性和原理分成三个部分:

  • 良好的代码编写 讲解更多关于编写高质量代码的通用规则。 这部分是为每个 Kotlin 开发人员准备的,无论他们的项目有多大。 从 安全性开始,然后到代码可读性。 将安全性相关的规则放到第一章是有意而为之,因为我相信所有的开发人员都认为程序的正确性是至关重要的。 而可读性则在放在另一个章节讲解,因为代码不仅是给编译器看的,也是给程序员看的。就算我们是独自开发,我们也希望代码易读、不言自明。

  • 良好的程序设计 适用于和别的开发人员协同工作一起设计项目或库的场景,会讲到一些约定俗成的规则。最终,这些规则也能反映到安全性和可读性上。 这一部分在开始时会比较抽象,但这样反而可以讨论一些其他讲代码质量的书所经常忽略的主题。本节还介绍如何去建立一套可塑性强的代码,为未来的项目的迭代做好准备,因此对于创建大型项目的开发者来说极为尤其重要。

  • 性能 该部分是为那些关心程序性能的开发人员而准备的。这里介绍的大多数规则并不以开发时间或可读性为代价,所以它们适合于所有人。但对于那些实现高性能应用程序、库或数百万用户应用程序的开发人员来说,这些规则至关重要。

以上面三个部分细化,对本书章节排布如下:

第一部分:良好的代码

  • 第一章: 安全性

  • 第二章: 可读性

第二部分:良好的设计

  • 第三章: 可重用性

  • 第四章: 设计抽象

  • 第五章: 对象的创建

  • 第六章: 类的设计

第三部分: 性能

  • 第七章:让开发成本更低

  • 第八章:高效的集合处理

每一章都会包含多个条目,就像教条一样。对于这些条目的标题,我都会去解释其原理。一旦你弄清了它原理是什么,那么以后你只要看到了标题就知道其内容是啥了。 比如第一条规则是 “限制可变性”,对于第一次接触这个规则的人来说可能会觉得比较神秘, 但对于熟悉这本书的人来说,以后有人在 Code Review 时在你的代码旁边注释了这一句话,你就会知道犯了什么错误。最后,编程建议被设计成这种条目的形式,再配合其说明,应该可以给出一个清晰的指导原则来帮助你写出良好的、自然的代码。

章节的组织

各章往往以其他项目中使用的最重要的概念开始。举一个非常明显的例子:第2章:可读性,它以第11项:为可读性而设计开始,这同样也适用于:

  • 第七章第一个条目(第45条):减少不必要的对象创建

  • 第三章第一个条目(第19条):不要重复造轮子

  • 第一章第一个条目(第1条):限制可变性

章节也可以以一个其他部分不太相关的内容作为结尾,但是会呈现一个重要的知识,比如:

  • 第一章最后一个条目: 编写单元测试

  • 第二章最后一个条目: 遵守编程习惯

  • 第三章最后一个条目: 通过提取公共模块在不同平台之间重用

如何阅读这本书

这本书该如何阅读呢?用你喜欢的方式即可。但是不要在不同章节间来回切换阅读。在某种程度上来说,一些条目知识是建立在另一些条目知识基础上。 尽管良好的知识呈现方式应该是独立的,应该以一种不依赖于其他章节的独立理解方式存在。话虽如此,关于本书你应该从头开始阅读章节,因为这些章节组成了本书的流程架构。

选择你想要的开始的章节,之后你也可以回到其他的章节阅读。如果你对某项条目或者章节感到厌烦,那就跳过它。这本书编写的时候很轻松愉快,所以你也应该怀着同样的心情去阅读它。

标签

想要为每一种人群写书是不可能的,而本书主要是写给有经验的 Kotlin 开发人员,他们中的许多人已经熟悉最佳编程实战,并寻找 Kotlin 进阶用法以提高自身。 尽管如此,我还是会写一些可能并不是 Kotlin 特有的编程规则,或者一些对资深开发者来说习以为常的规则。为了明确这些内容,我会在这些条目的开头去添加标签注释:

  • 非 Kotlin 特有条目(Not Kotlin-specific):并非 Kotlin 特有的规则,这些编程规则你同样可以运用到其他编程语言,例如 Java、 C#、Swift(如条目 10、19、26、27、36)

  • 基础型条目(Basics):对于一些经验丰富的 Kotlin 开发人员来说,这些条目可能很听起来很基础,因为其他实战书籍已经介绍了这些建议,而且社区也能理解和接纳这些建议。(如条目10、18、19、20、25、26、27)

  • 拓展教育类条目 (Edu):这类条目比较少涉及到实战,它致力于教授高级的Kotlin功能,这些功能对有经验的Kotlin开发者很有用。如果你已经了解这些特性,请跳过此类项目(即第21、22、24、32项)

Last updated