学Kotlin其实要看:http://kotlinlang.org/docs/kotlin-docs.pdf

在线版是不完整的!!!少了一些章节,会有点难看懂后面的文档。

我选择了WordPress里的错误消息管理类wp-error.php为对象,没有依赖其他具体场景和类,所以比较适合移植和对比。

代码是前几天整理的,为了便于在线查看,把它贴到Git上了。代码查看地址:http://git.oschina.net/web3d/kotpress/blob/master/Error.kt

为了简化逻辑,将Error类中要保存的data、code全部设定为String类型。

基础知识

1.语感

上帝说,要有光,从此就有光了;奥巴马说,编程语言是门外语,从此,我们也是精通多种外语的人啦。

Kotlin从代码的语感上,是有着python的风格的,像:

if (obj is String)  return obj.length

if (x in 1..y - 1) println("OK")

是不是很接近英文原生语句?

2.变量

局部变量分为可变变量和不变变量,分别用 var(variable) 和 val(?)来声明。

variable

内存中的变量初始化,一般要经过两步,声明变量类型、开辟内存空间;赋值初始化。

var y: Int;
y = 10;

目前多数语言的写法,都是一句话完成这两步。

var y: Int = 10;

而Kotlin中更简洁的写法是:

var y = 10;

y 被赋值时,会被自动推断(inferred)为整型Int,这种写法有点亲切感了。

注:类型自动推断是强静态类型语言范围的一种特性。自动推断类型的能力让很多编程任务变得容易,让程序员可以忽略类型标注的同时仍然允许类型检查。类型推导不是Go语言首创,但是现代语言中,Go中运用广泛,Kotlin也引入了这种特性。

Kotlin是静态类型的,如果想将y重新赋值为其它类型如字符串是不行的:

y = "13"

Val

val 基本特性和用法与var相同,但有点类似我们一般语言中常量的概念:被初始化赋值一次后,不能再重新赋值;与常量不同的是,它可以作为局部变量。如:

val y = 10

如果继续在后面:

y = 12

编译器就会报错。

当然,不能重新赋值不是说变量所代表的对象包含的值不能变,下文的数组对象array,同样是通过val声明的,但它里面包含的值是可以继续操作的。

刚从PHP转过来的话,应该还有点适应不了:要熟悉和记忆各种数据类型和集合类型;每次声明一个变量,还要想这个变量是否可变,太烧脑了。但这就是一种更朴实的思维方式,前面多想想,后面的代码就会更可靠,不会因为一些意外的操作造成数据的值或类型被破坏。

类的普通属性应该都用 var 来声明,因为可能要在某个方法中将另一个对象赋给它;但局部变量应当尽可能用val。

3.类型推导

Java里面定义一个字符串类型的一维数组列表要这样写:

ArrayList<String> array = new ArrayList<String>();

Kotlin里面:

Kotlin可与Java互通,所以,它也可以写成类似上面的形式:

val array: ArrayList<String> = ArrayList<String>();//没有new关键词
array.add("abc")

但Kotlin风格的写法为:

val array = arrayListOf<String>();

array.add("abc")

PHP里面:

$array = [];
$array[] = 'abc';

4.this

和Java一样,Kotlin中大多数时候,this可以省略,这是现代编程语言都支持的特性。

像PHP、Python这种都需要有个指代对象去访问。

5.empty/Blank

再牛掰的语言,可能也解决不了空字符串的问题;一个字符串对象就是可以包含空字符串、或者可能含有多个空格的字符串。但逻辑上,他们是无效的数据!所以几乎每个有字符串的地方,可能都要判断一下,尤其是做键名等名称标识的场景。

WordPress这个Error类就是典型场景。错误消息是按错误代码 => 错误消息 的格式存储的,如果以空字符串为键名,它到底代表什么含义,无法明确得知。所以我们就要判断是否为empty,但php里的empty判断在这真正有用吗,如果这个键名里包含的字符全是空格呢?所以像Java和Kotlin中的String对象除了isEmtpy()方法外都会有个isBlank()的判断。

但在演示代码中,我反复斟酌后,还是去掉了相关判断,因为几乎这个类每个方法里都得加,这样没有美感,不科学。

6.句尾分号可省略

单行语句多数情况可以省略分号

7.烧脑的Exception

PHP中,我们还没有养成抛出异常、然后捕捉异常的编程习惯。一般都是通过多种返回值类型或范围去判断结果,是成功还是失败、正常还是异常。到了Kotlin这类静态类型语言中,方法返回值也是需要一种确定的类型,那么失败或异常就只能通过抛出异常的方式去做了。异常的捕捉如果不到位的话,就很容易出现不健壮的体验,动不动的崩溃了。

用Kotlin改写PHP程序是什么样的体验的更多相关文章

  1. [ACM训练] ACM中巧用文件的输入输出来改写acm程序的输入输出 + ACM中八大输入输出格式

    ACM中巧用文件的输入输出来改写acm程序的输入输出 经常有见大神们使用文件来代替ACM程序中的IO,尤其是当程序IO比较复杂时,可以使自己能够更专注于代码的测试,而不是怎样敲输入. C/C++代码中 ...

  2. Rio手把手教学:如何打造容器化应用程序的一站式部署体验

    11月19日,业界应用最为广泛的Kubernetes管理平台创建者Rancher Labs(以下简称Rancher)宣布Rio发布了beta版本,这是基于Kubernetes的应用程序部署引擎.它于今 ...

  3. Kotlin调用Java程序解析

    Kotlin跟Java是百分百兼容的,换言之,也就是它们俩是可以互操作的,也就是Java可以调Kotlin,Koltin可以调Java,所以下面来看一下在Kotlin中如何来调用Java代码: 咱们来 ...

  4. Kotlin编写Processing程序(使用函数式编程思维和面向接口方式)

    写一例Kotlin编写的Processing程序,充分调用函数式编程思维和面向接口的编程思维,供自己和读者参考学习. 初衷 想要实现一行行的文字排版功能,每一行作为一个单位,可制定显示的位置.大小.文 ...

  5. Kotlin调用Java程序重点分析

    在上一次https://www.cnblogs.com/webor2006/p/11530801.html中学习了Kotlin调用Java的使用方式及一些注意点,这次继续其这个场景进一步学习. 数组( ...

  6. 身边有个漂亮的java女程序员是什么体验?

    程序员都是一些追求完美的人.女程序员细致认真,不仅能写代码而且注释详尽清晰.能做好单元测试BUG最少.能写标准规范的设计文件不会对不上模块编号也不会少了类或接口说明,提交代码不会忘记写LOG,不会和测 ...

  7. 【JDBC】Java程序的数据库初体验

    JDBC是什么 JDBC是一种能够用来执行SQL语句的Java API[接口]. 它是Java提供的一种规范,让各大数据库厂商遵循此规范完成自己的数据库连接驱动[实现接口]. JDBC的入门程序(这里 ...

  8. Java 程序员快速上手 Kotlin 11 招

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:霍丙乾 近经常会收到一些 "用 Kotlin 怎么写" 的问题,作为有经验的程序员, ...

  9. mpvue 初体验之改写车标速查小程序

    前文 说到我开发了一个简单的小程序叫做 车标速查(代码以及二维码详见 这里),本文简单讲讲如何将这个小程序转为 mpvue 开发(最终 成果 ) mpvue 官网的 文档 真的是非常简单,不,应该说是 ...

随机推荐

  1. 老司机学新平台 - Xamarin Forms开发框架之MvvmCross插件精选

    在前两篇老司机学Xamarin系列中,简单介绍了Xamarin开发环境的搭建以及Prism和MvvmCross这两个开发框架.不同的框架,往往不仅仅使用不同的架构风格,同时社区活跃度不同,各种功能模块 ...

  2. TODO:Node.js pm2使用方法

    TODO:Node.js pm2使用方法 pm2 是一个带有负载均衡功能的Node应用的进程管理器. 当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完 ...

  3. 【PRINCE2是什么】PRINCE2认证之七大原则(3)

    我们先来回顾一下,PRINCE2七大原则分别是持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁. 第三个原则:明确定义的角色和职责. 项目离不开人员,错误的人来了,合适的人没 ...

  4. Android开发学习之路-Android Studio开发小技巧

    上一次发过了一个介绍Studio的,这里再发一个补充下. 我们都知道,Android Studio的功能是非常强大的,也是很智能的.如果有人告诉你学Android开发要用命令行,你可以告诉他Andro ...

  5. 前段播放 流媒体(RTMP,RTSP,HLS)

    前言 最近项目需要流媒体的播放,后端一共提供了 三种流数据(RTSP,RTMP,HLS),在不同的场景可能会使用到不同方式播放,就需要做到适配, 支持所有的流数据播放.花了一段时间研究,在这里和大家分 ...

  6. SpringMVC常用的注解

    1. @Controller @Controller用于标识控制层主键,负责注册一个bean到spring上下文,bean的ID默认为首字母小写的类名称,用户也可以自定义. 例如: 方式一:  @Co ...

  7. python中configparser模块

    python中的configparse模块的使用 主要用来解析一些常用的配置,比如数据配置等. 例如:有一个dbconfig.ini的文件 [section_db1] db = test_db1 ho ...

  8. .NET平台机器学习资源汇总,有你想要的么?

    接触机器学习1年多了,由于只会用C#堆代码,所以只关注.NET平台的资源,一边积累,一边收集,一边学习,所以在本站第101篇博客到来之际,分享给大家.部分用过的 ,会有稍微详细点的说明,其他没用过的, ...

  9. JavaScript操作Cookie

    在Web开发中,我们经常使用Cookie保存一些不是非常敏高的数据.比如“下次自动登录”,“广告显示”等功能.定义是:某些网站为了辨别用户身份而存储在用户本地终端(主要是浏览器)上的数据.定义域RFC ...

  10. java中的list时间排序

    最初设想使用:时间long型 private void testTimes() throws InterruptedException{ Calendar cal=Calendar.getInstan ...