移动App模块化设计
三层架构
- 基础层:构建程序骨架,处理原始数据的IO
- 业务层:控制数据流并进行加工
- UI层
层次不等于文件组织,也不等于模块划分。一般按照界面划分模块后,同属该模块的业务层和UI层都放在同一目录下(还可以有子目录)。一个模块不会被层次限死,最多三层都可以跨越。
划分层次的意义是高于业务模块看待耦合问题。业务模块内部一般是MVC、MVP、MVVM式设计,可是这些设计模式没解答跨模块的可依赖性。大部分人会认可基础层可被所有代码依赖,但少有人明确UI层可依赖所有业务层代码(例如A页面可依赖B页面的model)。模块间完全解耦肯定是完美的,业界有不少消息框架、组件化框架来帮助解决。但请一定注意,这些东西会提高复杂度和开发维护成本,在代码量和团队人数还不多的时候不宜使用。
基础层
这层的目录命名可以叫base
或foundation
,叫common
并不准确。如果设计得好,这部分东西是不关联具体业务的,多数可以跨项目使用,由业务层做定制化后为所属项目服务。
这层可以进一步细分成3种类型。
数据IO
- 设置:持久化存储,key,升级时持久化数据迁移,变化通知
- 颜色:换肤,渐变色
- 图片:换肤,编解码
- 文本:富文本处理,多语言
- 调试:Log、debug辅助、宏开关
- 加解密:AES、DES、RSA……
- 编解码:base64,URLEncode/Decode,zip
- 数据结构:JSON,XML,Protocol Buffer
- 数据算法:MD5,SHA1
- 网络:网络类型判断,缓存,下载,后端api交互
- 线程/进程管理:worker线程,线程消息,锁
- 系统信息:版本判断、屏幕分辨率、内存容量、磁盘容量、修改系统设置
- 文件管理:路径、备份
- 字符串:格式化(日期、时间、钱币、小数),转码(unicode),正则表达式,特殊数字检测(电话号码)
- 常量值,一般是业务用的,例如url地址
程序骨架
- 消息框架
- 页面路由
- 组件化框架
- 插件化框架
功能逻辑
它们都可视为component:
- 初始化:被其他程序调用,(android)创建快捷方式
- 升级:首次安装与覆盖安装的判断
- 用户信息:第三方登录
- 广告
- 统计埋点
- 推送
- 崩溃:注册crash handler
- 二维码
- 分享
- 支付
- LBS
- 相册
- 相机
- 指纹
- deeplink,第三方调起与被调起
字符串常量
有3种放置方式:
- xml或
Localizable.strings
:需要通过系统API获取实际的值,原生支持(国际化)多语言 - 统一放在一个定义常量的文件中:可直接引用常量;多语言方案要自己再实现
- 分散在使用的代码中:所见即所得,无法换语言
没有哪种方式绝对地优越。在无高级需求的情况下,越方便的方式越好。
(颜色值和图片换肤的处理和这个差不多。)
网络模块
网络模块可分4层:
- 基础层:可以是4种东西
- 系统网络框架
- 封装了系统框架的第三方库
- 在socket层重新实现的第三方库
- 自己实现的网络框架
- 通用层:简化接口,定义通用回调,统一加入必须的参数
- API层:与后端接口对应的函数集,函数内再调用通用层的接口
- 封装层:方便其它模块调用。例如需要同时调用3个API且全部返回数据后合并回调,可以把这个逻辑做成1个函数
(层次是功能意义逻辑的划分,不代表每层都有一个类来封装上一层,有时候同一个类内的函数集就是一层)
设置模块
“设置”有几种含义:
- 准确的“设置”是指Setting,值在运行时初始化且是可改变的。
- 配置是Configuration,其值确定后是不变的。值来源于配置文件或服务器下发。
- profile和preference都有跟某个用户绑定的意思,是用户的偏好,每个用户可以不一样。
他们又可分成是否需要持久化保存,所以会有RuntimeSetting和ArchivedSetting两个类。RuntimeSetting一般是个单例,数据只保存在内存中,没必要用key-value来访问,直接由成员变量表示即可。
View层组件
组件化最原始目的是跨模块复用,现在发展成解耦的手段之一了。这些组件是可跨项目使用的:
- Toast
- Alert、多选框等多种弹窗
- 通知栏
- WebView,做好了通用设置和样式,包括加载进度和出错展示等
不可复用的例子:
- 启动闪屏
- 新手教育、更新说明
其它思路
- iOS预编译头文件(.pch)尽量不用,有些模块不应该依赖那么多东西
- 来自第三方的代码都不要改,做成pod(iOS)或library(android),可以随时覆盖式升级。应在其基础上做扩展,不行就再封装一层
- 初始化流程可以有专门的controller来负责,简化app入口函数的内容
- 一个自定义view(例如弹窗)应该与业务无关,所有的展示内容和设置都应该由外部传入。
- 应该让设计师做好规范化,颜色定义是一套风格,所以颜色值不会很多
- 同一模块内的类,根据是否可跨项目重用,应区分文件保存。例如SettingModel是可重用的,但SettingKeys是具体到业务的,应分放到两个文件
移动App模块化设计相关推荐
- 基于ASP.NET Core的模块化设计: 虚拟文件系统
土牛亲自录制的本文介绍视频 Abp中文网(https://cn.abp.io/)提供翻译字幕 基于ASP.NET Core的模块化设计: 虚拟文件系统 简介 创建模块化的应用程序很困难. 构建模块化的 ...
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
本文转载自https://www.tianmaying.com/tutorial/AndroidMVC,原文作者周鸿博. 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开 ...
- 移动app html手势实现的,移动app交互设计:如何把“手势流”装进手机
在智能交互中,手势已成为新的"点击". 现在每次打开手机里的app.游戏时,都需要用到点击.拖.拉等动作.单看点击的话,设计师与开发者只需要考虑用户点击屏幕哪里体验更好.但是手势不 ...
- MVC---Android App的设计架构:MVC,MVP,MVVM与架构经验谈
转载自: http://www.tianmaying.com/tutorial/AndroidMVC 1.架构设计的目的 通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合.这样做的好处是使 ...
- 驴妈妈客户端频道页模块化设计思路
Hello ,iOSTips的读者朋友们大家好,我是来自驴妈妈的[傅说君],喜欢一本正经的傅说八道.由于老峰已经放假出去浪了,今天的文章由我来分享,Trust me,傅说君分享的都是干货,嗯比老峰的干 ...
- 大学生心理健康APP的设计与实现
摘 要:大学生群体本该是象牙塔中的学习者,是祖国未来的支柱,是民族复兴的期望所在,但是近几年大学生心理健康问题日益严峻,例如情感问题,原生家庭的问题,学业问题,与同学相处所带来的问题,这些问题对于学 ...
- 基于Android的校园社交平台,1万1 字基于Android平台的校园社交App的设计与实现 ).docx...
基于Android平台的校园社交App的设计与实现 目 录 WPSOffice_Level1 摘 要1 1557579957_WPSOffice_Level1 Abstract2 420680369_ ...
- 展示型app用什么型号服务器,APP版式设计教程:信息展示型UI界面设计的四种类型...
作为一名专业的APP设计师,版式设计也是我们日常设计当中的一项基本功. 那你到底对版式设计有多深的理解呢? 你现在可以摸着旁边妹子的手说,什么是版式设计ma ? 版式设计又分为哪几种呢? 这个时候妹子 ...
- springboot+基于vue的响应式代购商城APP的设计与实现 毕业设计-附源码191654
Springboot响应式代购商城APP 摘 要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用.简单的流程.便捷可靠的支付方式.快捷 ...
最新文章
- 【模型蒸馏】从入门到放弃:深度学习中的模型蒸馏技术
- 查看docker 容器的ip地址
- 机器学习实践:TensorFlow最后一个epoch训练损失函数显著增大
- 在Json解析过程中,我为什么用object1.optInt ,和 object1.optString
- mui aniShow 动画属性
- python 数据清洗 豆瓣电影_Python高阶操作--关于数据清洗
- P版openstack-nova-compute中日志报错无法同步resource_provider
- Java 日志管理最佳实践
- 一文读懂FFT,海宁窗(hann)和汉明窗(hamming)的区别,如何选择窗函数
- 微信小程序开发的基本流程
- html5漂亮的登录与注册界面设计,翻转式用户登录注册界面设计
- Android Activity 的详细启动过程分析
- 直播平台源代码快速搭建视频直播平台
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.B)- FlexSPI NOR连接方式大全(RT1160/1170)...
- Js常用40个页面效果
- Ubantu18.04
- 今天我被微软狠狠地雷翻了
- 【MySQL】绿色版下载配置教程(Windows)
- paypal付款,PayPal Subscribe和PayPal Check Out的区别
- C# 二维码 和条形码生成