字节跳动上千道精选面试题还不刷起来!年薪50W

我究竟要不要学习Kotlin呢?

要回答这个问题,我们先把时间拨回到2017年5月18日,安卓团队在谷歌 I/O 2017 大会上宣布 Kotlin 成为官方头等支持语言。

彼时谷歌技术大牛 Steve Yegge 发表了一篇关于 Kotlin 的使用体会总结文章:“为什么说 Kotlin 比你们用的那些垃圾语言都好?”

一时间这条爆炸性资讯在引发的热议一直持续到了今天。

时间是检验真理的唯一标准,接下来我们来看看国内外技术专家,使用kotlin开发的感受!

Google Android 专家Annyce Davis:“当 Kotlin 出现时,我立刻被它吸引了,因为它的很多语法特性让我想起了 Groovy。它既整洁又精炼。”

Google Android 专家Sebastiano Poggi:“我真的真的很喜欢这门语言。我个人认为它在很多情况下使得编码变成一件愉快的事情,相比之前,同样的情况下用 Java 语言编码将会感到痛苦和繁琐。Kotlin 有时让我觉得自己就像一个 10 倍效率开发者。”

Google Android 专家Jorge Barroso:“Kotlin 迈出了 Android 开发的一大步,在这之前,Android 缺少 Kotlin 所带来的特性,相比于其他的 Java 平台,Android 平台的 Java 开发有些过时,即使现在有在推动 Java 8,但它还是不会变成我们喜欢的现代编程语言。

Google Android 专家Mark Allison:“虽然我也很喜欢 Kotlin,但我不认为它已经足够成熟到能够在线上产品中使用。成熟模式和最佳实践的缺乏,使得 Kotlin 编写的代码可能难以维护。”

Google Android 专家Dmytro Danylyk:对于那些停留在 Android 世界的开发者而言,Kotlin 是一个真正的规则改变者,它拥有很多我喜欢的特性:空类型安全,data classes,属性和懒加载属性,扩展函数,协程,不变性等等。

我很享受使用 Koltin 来编码,因为我没有必要在项目中引入太多的第三方库,Kotlin 已经非常好的提供了大部分的支持。”

实现方案

直接依赖

这种方式实现简单,但是耦合太严重,不方便维护与开发,当工程逐渐增大模块逐渐增多,依赖关系会非常复杂,不推荐这种方式。

事件或广播通信

EventBus: 我们非常熟悉的事件总线型的通信框架,非常灵活,采用注解方式实现,但是难以追溯事件。广播: 安卓的四大组件之一,在一个模块中发送广播设置数据,在另一个模块中注册广播接收数据,使用广播进行数据传递方式广播相对于其他的方式而言消耗资源较多。

总结: BroadcastReceiver、EventBus,非常灵活,模块之间没有任何的耦合,但是代码的可读性差,难以追溯事件,不是很推荐。

路由通信

模块与模块之间不存在依赖关系,而是各自运作,简单的来说就是映射关系的路由通信,也是目前比较主流的一种方案,比较常用的开源框架是阿里的ARouter。

ARouter典型应用

从外部URL映射到内部页面,以及参数传递与解析跨模块页面跳转,模块间解耦拦截跳转过程处理登陆、埋点等逻辑跨模块API调用,通过控制反转来做组件解耦。

面向接口通信

以上几种方式只是简单的介绍,下面就具体说下通过接口解耦通信的方式,首先先看几个问题。

什么是面向接口编程?

接口大家都很熟悉,这里所说的面向接口编程,并不只是所谓的 java 中的 interface,而是指超类型,可以是接口也可以是抽象类。

面向接口比面向对象编程是更先进一步编程思想,而是附属于面向对象编程的体系,属于其中一部分,它是面向对象编程体系中的思想精髓之一。面向接口编程它的核心思想是将抽象与实现分离,从组件的级别来设计代码,达到高内聚低耦合的目的。面向接口编程方法是,先定义底层接口模块,也就是 通信的协议与功能约定 ,是提供方实现对应的功能与能力。在架构中层次分明,不需要关注具体实现,开发中可以通过接口快速制定协议,与提供能力api,对于上层通过接口显露能力,对于下层只需要依赖接口层相当于依赖api。

面向接口编程的好处?

灵活性高没有依赖具体的实体,实现层可以任意的更改与切换。在模块化中可以相互依赖service(接口层)或依赖多个。‍

‍在模块化中的使用下面对于接口(interface)或api层统称为service,其含义为服务提供者。

对于,每一个 module 都一个独立的工程结构,每个 module 都有自己的 Service ,来统一暴露当前 module 所拥有能力与向外提供的服务。


对于 module 是在同一个工程里的项目结构,service 可以放到统一的一个 Module 下,我们统称为 Mediator,这样做的目的是为了减少 Module 创建与维护。假设你的工程有20个业务 Module 如果都同时增加一个 service 层就会造成 Module 数量翻一倍。由于这里存入的都一些接口类,也是每个业务 Module 向外提供的服务其体量不会太大,这里并只是一个建议并没有标准的做法。

当然也有更复杂的设计,一个 Module 又分不同的 service 实现如图,这里不在展开细说。

实际工程中使用与设计

在实际项目中有很多项目都同时开发两版本Pad与Phone,有的是两独立的工程,有的是在同一个工程内用 flavor 切换不同的工程,下面我就以通过 flavor 切换的工程结构举例。先看下工程的包的结构图:

可以看到 module 结构是分为三个部分,common, pad, phone, 如果每个service 都独立将增加3倍的 Module 数量。

使用一个 Mediator Module 统一管理这这些 service 就很好控制了 module 数量。

Service 创建

在 module_mediator 业务 module 下 common,pad、pone 下分别创建ICommonService, IService(pad), IService(phone)。ICommonService:公共服务。IService(pad):pad服务并继承CommonService。IService(phone):phone服务并继承CommonService。

注:这里为什么不用,PadService与PhoneService,是因为pad与phone版本同时只会存在一个,使用方只需要关心你提供的Service不用在区分版本,而且这里是一个继承关系也可以获取到共用的部分。

Service 实现

依赖 Mediator :

在业务 common\pad\phone module 下分别实现,ICommonService, Service(pad), IService(phone) ,在 common module 创建 CommonServiceImpl 实现 ICommonService,在 pad、phone module 分别创建 ServiceImpl 对应实现 IService 并继承与 CommonServiceImpl。

Service 注册

注册的方式有一般是通过代码用去注册,或通过注解进行注册。可以在 Application 注册也可以在业务 Module 下自己注册,如果使用注解则可以自动注册,具体要看项目怎样实现。例:

解释下 MediatorServiceFacator,它只是一个服务工厂也是一个接口类,作用是负责管理各业务方的 Service 主要功能是注册与获取 Service。上面的代码就是往里注册了一个会员的 Service。

可以看出这个函数只有两个参数,一个是接口class一个是实现类class,第一个参数cls:它会作为 key 来使用,第二个参数implClass:它会作为 value 来使用。

Service 使用

通过 MediatorServiceFacator 懒加载获取service对象,如果业务方没有注册则获取一个空的对象。

注册有 service 没有使用时是不会创建的,如果使用过则会缓存下来,下次调用则直接返回。(第一次是通过反射创建)例:

  1. 在 mediator 模块下会员 CommonService 中 定义了一个模糊查询会员的方法。

  1. 在会员模块下 common 中实现了该功能。

  1. 在会员模块下 pad 中继承了这个实现。

  1. 在其他模块 pad 下使用这个功能。

可以看到获取 Service 只要传对应接口就即可,对于使用方是不用关心实现方,在开发过程中只要先定义好接口,合作的同学就可以进入正常开发了。细心的同学可以看出,返回的数据类型也是一个接口类,为什么不直接返回一个普通 java 类呢?主要原因是通过接口方法达到双方 api 约定,例如 getName() :String 方法是通过方法名返回值达到约定效果,这样不依赖具体实现。

从上面的例子可以看出主要分为三个部分:1、定义接口。2、提供方实现接口。3、使用方都通过服务工厂获取服务使用。对于使用者来是很简单的,不需要关心实现,通过接口可以直接获取到实现,并且获取到结果可以直接使用,不需要做序列化处理。

有了路由通信我们为什么还使用面向接口编程?

路由模式虽然很好的解决了耦合的问题,但他的方法调用都是静态的,对于传参与返回值只能是基本类型,如果是对象需要做序列化与反序列化处理,对性能有一定影响。类似在调后台接口一样,同时降低了代码的可读性, 对于 app 而言所有 Module 都是在同一个应用下,没有必要做这些序列化操作。

对于复杂业务不好处理,例如一个业务需要多次通信,路由模式则不好处理,而通过接口通信则可以容易解决。例如:一个读卡的操作,业务方需要对它有开启、关闭、暂停等多个状态的操作。通过接口则可以直接返回一个读卡的 service 控制器, 这样可以直接进行相应的控制操作。

从上面代码中可以看出,上层回调结果的同时并回调了一个控制接口,这样就提供使用方一个反向操作的能力。

最后

针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

  • Android前沿技术大纲

  • 全套体系化高级架构视频

资料领取:点赞+点击GitHub免费获取

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、混合式开发(ReactNative+Weex)全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个集成目前Android主流优秀第三方组件、优秀好用的自定义控件、实用工具类封装、 以及一些APP共通模块(比如:版本更新、意见反馈、引导界面等等)的开发包,帮助程序员 快速开发自己的APP 已集成第三方开源组件: 网络请求库android-async-http 图片异步加载库universal-image-loader Sqlite数据库操作ormlite-android 社会化分享ShareSDK+短信验证码 Zxing二维码库 百度地图定位SDK 谷歌依赖注入库RoboGuice WebService调用库ksoap2 XML解析XStream 动画开源库nineoldandroids 表单验证库android-validation-komensky 更多优秀开源库等待集成... 已封装工具类: HTTP网络通信工具类(ToolHTTP.java),get/post请求,支持多种接口回调 SOAP协议通信工具类(ToolSOAP.java),基于异步回调请求WebService接口 Sqlite数据库操作工具类(ToolDatabase.java),获取DAO、创建表、删除表等API 提示信息对话框工具类(ToolAlert.java),已集成泡泡、土司、对话框三种提示 文件操作工具类(ToolFile.java),assets/raw/xml/shrePerface/等文件读写API 地图定位工具类(ToolLocation.java),读取GPS状态、请求定位、获取经纬度等方法 社会化分享工具类(ToolShareSDK.java),各大开发平台分享API操作 短信验证码工具类(ToolMSM.java),移动/联通/电信三网发送手机短信验证码、异步回调验 证结果 字符串操作工具类(ToolString.java),生成UUID、非空非NULL逻辑判断、生成MD5等常用共 通方法 数据操作工具类(ToolData.java),自动递归获取表单数据封装成Map、本地数据分页共通方 法等 图片操作工具类(ToolPicture.java),生成二维码、验证码、灰度、合成、圆角、水印等操 作 读取本地资源工具类(ToolResource.java),反射本地资源文件API,避免依赖R文件,方便 jar形式发布 Android单位转换工具类(ToolUnit.java),sp/dp/px互转 自定义Toast工具类(ToolToast.java),自定义背景色、字体颜色、大小、边框等 Properties操作工具类(ToolProperties.java),读写Properties文件操作 网络操作工具类(ToolNetwork.java),获取网络信息、更改切换网络等相关操作 日期操作工具类(ToolDateTime.java),获取日期、日期加减、格式化日期、日期转换等操作 XML操作工具类(ToolXml.java),基于DOM/XMLPullPaser模式解析、生成XML操作 XMPP操作工具类(ToolXMPP.java),基于XMPP协议的相关API操作 适配字体工具类(ToolAutoFit.java),代码根据设备密度自动缩放View的字体大小 LOG相关工具类(ToolLog.java) 功能待续-->切入记录异常日志,并存储文件或上传至服务 器 已封装/收集自定义控件: 兼容低版本的SwitchButton 追加自定义属性Value的CheckBox/RadioButton/RadioGroup/SingleSpinner 圆角提示信息TipsView 圆角图片RoundImageView 自定义样式风格Progres

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值