Kotlin 一种以服务为基础的APP架构及源码示例
前言
由于工作原因,可能会被调到隔壁组。此架构为隔壁组leader设计,并不是我原创,已取得leader同意,此博文只分享我对此架构的理解。特此声明。
最近看了下Kotlin的一些语法,外加隔壁组采用非常规MVC/MVP/MVVM开发,所以写此Demo,一是为了练习Kotlin语法,二是为了尝试使用隔壁组架构进行开发。由于为了练习Kotlin语法,所以在代码的具体实现上,可能会有些“炫技”的语法。比如能用一种语法实现的功能,Demo用了两种及以上的语法。了解即可,不必深究。还有一部分“非常规”操作,比如直接就能实现的功能,具体实现上却“山路十八弯”,注意,这不属于“语法炫技”的范围!如果觉得“这里不用山路十八弯”,请往架构方面考虑。
Kotlin
这是一款壁纸应用,虽然功能比较简单,但是用Java代码实现起来还是有些代码。除去框架部分,用kotlin实现,能省很多代码。比如属性定义、finViewById、lambda、协程、闭包等等。代码的具体实现没撒好说的,还请自行查看源码。本文的重点是下个部分“服务架构设计”。
服务架构设计
由于公司产品比较多而小,并且有很多共通的功能点,现比较流行的MVC/MVP/MVVM开发模式,运用到实际开发效率不高,所以leader设计了一套开发模式供我们这些菜鸡使用。在开发/维护效率上,简直是贼高!有多高?去年Android组5个人,iOS有25+个。真正的一打五,恐怖如斯!
总体设计
- 以模块划分,这个可以简单理解成“模块化开发”中的模块。每个模块可以是一个页面也可以是几个页面,以业务/功能划分。
- 除主工程外,每个模块以aar包的形式向其他模块提供业务/功能
- 每个模块分为四个部分,这四个部分分别又是4个arr。
- Service: 业务接口定义
- ServiceImpl: 业务接口具体实现
- ViewService: UI接口定义
- ViewServiceImpl: UI接口具体实现
- 所有业务统一管理,针对到**每个**APP,在主工程Application中注册具体实现
- 脚本打包,代码管理
我的一些个人理解
- 模块:不吹不黑,总体设计里就是我对模块的理解…
- 主工程:一般代码很少,只放“主页”相关相关的几个类,甚至主页对应的service/serviceImpl都会提供相应的aar。
模块四元素,四元素遵循“面向接口编程”的理念。每定义一种业务/功能时,先定义好接口规范,这样的话,在其他相似模块或者其他APP相似功能的时候,接口是不用修改的,只需要复用或者重写接口具体实现即可(开闭原则)。这样的话,还有一些好处,合作开发,AB模块通过接口调用,有效降耦合,而且AB模块的开发者并不需要知道对方具体实现。
- Service:业务接口定义,我理解的这个模块大概相当于MVP中的P层。
- ServiceImpl:业务接口具体实现,大概相当于P层的具体实现。P中会持有V的引用,但这里不会,Service/ServiceImpl只负责业务的定义/实现。至于之后做什么,我不管我不管。
- ViewService:UI接口定义,定义当前模块有什么UI相关的功能/业务,比如扫码、登陆等等。
- ViewServiceImpl:UI接口具体实现。在单APP中作用不是很大,多APP相似UI的时候,效率提升巨大。
四元素是此框架很精髓的部分,开发效率高很大一部分是由于四元素的设计。对于不同APP差别不大的模块,可使用相同业务/UI接口,具体APP编写具体实现即可。
- 业务管理:由于多个APP的很多业务/UI接口是差不多的,只是业务/UI实现上会有些差别,所以针对到不同的APP,注册进相应的业务/UI接口实现即可,甚至有些具体实现也是可复用的。
代码管理:每个APP会有很多模块,每个模块下又有四元素,每个模块和四元素都是module/app的形式,AS每次都去构建的话,估计一次打包没个十来分钟搞不定,所以代码管理采用SNAPSHOT+AAR的形式,将每个AAR以SNAPSHOT的形式依赖,这样就不用频繁build每个module/app,每次更新,只更新相应的SNAPSHOT即可。
我理解的大体架构大概就是上面所描述的,当然,为了解耦还会有一些其他的小技巧,不过这些无伤大雅,demo中也体现了一部分,感兴趣可以看下壁纸Demo。
壁纸APP的说明
壁纸APP有两个界面:“主页”和“预览页”,也可以理解为两个模块:“主页模块”和“预览模块”。为了图方便也为了方便读者看代码,这里没有将对网络框架的封装、Util类封装成通用AAR库,没有将预览模块写成单独的module/app,没有将每个service/serviceImpl写成单独的module/app。说来有些讽刺,比较精髓的部分居然被我一笔略过,这点读者明白即可。
碎碎念小心得
对我而言,架构这个东西说起来有些缥缈的感觉。之前照着现有的MVX模式照搬,鲜有考虑为什么要这么写?好处是什么?或者说只是看了别人的讲解-这么做有bulabula好处。但生搬硬套始终是有些生硬,自己理解甚至能设计出合理的架构才是王道。这也是我非常佩服leader的地方,我有些觉得这已经超出了“小聪明”的程度,堪称智慧了。我也在下意识提升自己这方面的能力,一起努力吧~
Demo下载
壁纸APPDemo: https://github.com/yikousamo/wallpaper
Kotlin 一种以服务为基础的APP架构及源码示例相关推荐
- 游戏交流社区BBS论坛APP客户端和网页服务端设计 毕业论文+前后端源码及数据库文件
下载地址:https://download.csdn.net/download/m0_63680064/36065411 项目介绍: 游戏交流社区BBS论坛APP客户端和网页服务端设计 毕业论文+前后 ...
- 代驾APP小程序源码交付 所需功能大全
生活水平的提高,使得车已经是现代人生活中不可或缺的代步工具了,但有时候因为疲劳或者是应酬喝了酒没办法继续驾车,招人代驾就很有必要了,代驾APP小程序就是这样应运而生的.代驾系统开发时,不要具备哪些基本 ...
- 实现app直播商城源码,先从简单的直播系统开始
软硬件环境 ubuntu 16.04 Android Studio 2.1.3 OTT BOx with android 5.1.1 nginx 1.11.3 nginx-rtmp-module vi ...
- 微服务开源框架TARS的RPC源码解析 之 初识TARS C++服务端
作者:Cony 导语:微服务开源框架TARS的RPC调用包含客户端与服务端,<微服务开源框架TARS的RPC源码解析>系列文章将从初识客户端.客户端的同步及异步调用.初识服务端.服务端的工 ...
- 网上超市app开发现成源码对接
网上超市app开发,网上超市app开发现成源码,网上超市app开发源码对接.针对很多人而言,便捷的消费方法,能让客户寻找自已必须的产品.网上超市APP开发设计产品,客户可以网上购买酒水饮品.日用百货商 ...
- 云原生服务网格Istio:原理、实践、架构与源码解析
华为云原生团队600多页的Istio实战精华总结,云原生服务网格Istio:原理.实践.架构与源码解析的电子书. 图书介绍 <云原生服务网格Istio:原理.实践.架构与源码解析>分为原理 ...
- RocketMQ源码(十)—Broker 消息刷盘服务GroupCommitService、FlushRealTimeService、CommitRealTimeService源码深度解析
深入的介绍了broker的消息刷盘服务源码解析,以及高性能的刷盘机制. 学习RocketMQ的时候,我们知道RocketMQ的刷盘策略有两个,同步或者是异步: 1. 同步刷盘:如上图所示,只有消息真正 ...
- Qt利用avilib实现录屏功能_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...
内容概览 1.openlayers6结合geoserver利用WFS服务实现图层编辑功能 2.源代码demo下载 效果图如下: 本篇主要是参照openlayers6结合geoserver利用WFS服务 ...
- arcgis xml 下载 切片_openlayers6结合geoserver利用WFS服务实现图层编辑功能(附源码下载)...
内容概览 1.openlayers6结合geoserver利用WFS服务实现图层编辑功能 2.源代码demo下载 效果图如下: 本篇主要是参照openlayers6结合geoserver利用WFS服务 ...
- 【变色龙】app封装系统源码+完美版在售封装系统
简介: 1.App封装 实现App封装,混合开发App,100多JS接口功能交互. 2.制作小程序 通过接口网站封装成小程序. 安装环境变色龙app封装系统源码 环境:PHP 5.6 MySQL 存储 ...
最新文章
- 查看ocx控件CLSID的方法
- 为WPF和Silverlight的Grid添加边框线
- 深入浅出SQL(1)
- matlab the installer cannot read,MATLAB安装 The installer cannot read the mwinstall.dll… | 学步园...
- 机器学习实战之logistic回归分类
- django-带签名的cookie
- Cocos2dx 小技巧(十五)话说ScrollView的delegate实现过程
- BAT54C 二极管是如何工作的?
- 【机器视觉】独家盘点:详解国内外34家物联网机器视觉技术企业
- go-cqhttp + noneBot群聊机器人 配置开发
- nvidia怎么查看
- cad图转成shp文件并把其平面坐标投影配准成大地坐标(配准针对没有底图的情况)
- 字节跳动半夜给员工发钱,全员沸腾了
- 闲鱼商品详情抓取系统开发/测试完毕,可自动采集闲鱼商品详情信息
- 《Python机器学习——预测分析核心算法》——2.5 用实数值属性预测实数值目标:评估红酒口感...
- Java 中的 T,E,K,V, 别傻傻分不清楚!
- 小程序.silk转MP3格式
- B. Combinatorics Homework(抽屉原理)
- 不允许声明无类型的***
- B. Nick and Array 简单简洁