Android开发架构规范
前言
在开发中,一个良好的开发习惯以及一个开发规范可能会让你少走很多弯路,也会一定程度上的提高代码的可读性,可维护性和可拓展性。当随着需求的不断变更,需要维护项目的时候。当随着项目的代码量的提升,需要重构的时候。你会明白一个好的开发规范多么多么的重要。
这里整理一下自己android开发中的一些规范。希望对各位有帮助。
命名规范
包命名规范
- 包名全部采用小写
- 主包名采用[公司性质].[公司名称].[项目名称]的命名方式
如果根据不同情况进行分包的话,可以将包名分别命名为util,view, adapter等。
代码命名规范
命名规则有很多高大上的名词,比如大驼峰,小驼峰,匈牙利命名法。其实最简单的就是按照谷歌命名学习。
- 常量、枚举等均采用大写形式,用下划线区分各单词。使用static final
例如:private static final String TAG_FOR_ACTIVITY = "XXXX";
- 类名、接口名、枚举名。第一个和后面的单词都要第一个字母大写
例如:MainActivity
,PersonalLoginActivity
- 资源文件命名
例如:activity_main.xml
,ic_launcher.png
注意图片文件命名只能用小写字母、数字,否则会导致R文件无法编译出来。也是比较费心的。 - 继承自安卓组件的类,一般采用父类名作为后缀,
例如:class LoginActivity extends Activity{}
- 自定义异常必须以
Exception
结尾 - 全局变量添加所有者前缀:实例成员变量前缀m(表示member),类静态变量前缀s(表示static),
例如:protected Subscription mSubscription;
- 控件变量添加组件前缀,顺序在所有者前缀之后,控件缩写button->btn,textview ->txw,listview->lst等
例如:全局名称mBtnNext
局部名称btnNext
- 构造方法采用递增方式(参数多的写在后面),参数少的调用参数多的构造函数。这样也减少初始化代码。比如开源库
PagerSlidingTabStrip
更多命名规范
之前收藏的这篇文章比较全。Android 命名规范 (提高代码可以读性)
编程规范
- 源文件编码格式为 UTF-8。
- java代码中不出现中文,最多注释中可以出现中文
- 服务端可以实现的,就不要放在客户端
- 引用第三方库要慎重,避免应用大容量的第三方库,导致客户端包非常大
- 处理应用全局异常和错误,将错误以邮件的形式发送给服务端
- 图片的.9处理
- 使用静态变量方式实现界面间共享要慎重
- 单元测试(逻辑测试、界面测试)
- 不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突
- activity中在一个View.OnClickListener中处理所有的逻辑
- strings.xml中使用%1$s实现字符串的通配
- 数据一定要效验,例如字符型转数字型,如果转换失败一定要有缺省值;服务端响应数据是否有效判断
- 对于未完成的方法,使用TODO加以标记
- 若功能已完成,但存在效率等潜在问题时,使用XXX加以标记
- 若代码存在严重问题或仅用于调试,使用FIXME加以标记
- values目录下文件名称较固定,不得随意更改
代码提交规范
我们使用的无论是git,还是svn都需要遵守下面这些规范,个人比较倾向于git。
- 工作目录要及时更新,不要和服务器有太大的差别
- 提交代码时,如果出现冲突,必须仔细分析解决,不可以强行提交
- 提交代码之前先在本地进行测试,确保项目能编译通过,且能够正常运行,不可盲目提交
- 必须保证服务器上的版本是正确的,项目有错误时,不要进行提交
- 提交之前先更新
- 提交时注意不要提交本地自动生成的文件,比如我们Android Studio项目中的
idea
,build
文件夹是不需要提交的。 - 不要提交自己不明白的代码
- 提前协调好项目组成员的工作计划,减少冲突
- 对提交的信息采用明晰的标注(写注释)
使用git以及github,相信stormzhang的从0开始学习 GitHub 系列会对你有很大的帮助。
架构规范
这是我整个系列文章从零开始搭建android框架系列的重点,所以这里放在最后面。
架构方式
是选择MVP,MVC,MVVM ,Flux还是clean 架构?
,+dagger2?+rxjava?+Retrofit/okhtttp?+loader?+databinding?+contentProvider?
谷歌官方架构示例android-architecture,以及我之前github中整理的架构合集能给你答案。
开源库的选取以及封装。
对开源库的选取,一般都需要选择比较稳定的版本,还有作者在维护的项目
,比如这里在github搜索image,出现的安卓中的图片加载库。除了考虑star,还要考虑作者对issue的解决,以及开发者的知名度等各方面。
选取之后,一定的封装是必要的。
网络图片加载的封装这篇文章可能会从图片加载封装的角度给你讲讲封装的必要性。
架构提示
这里尽量写出自己想到的点。
抽象层面上:
- 提高架构的拓展性是有必要的。
以前的框架可能会出现功能不足的情况,但是因为这点是不可预见的,所以我们选择框架时一定要了解好框架本身的扩展性如何,或者对框架有较深的理解,能够自己扩展框架, - 提高架构的稳定性
- 架构的文档也是必不可少的。
具体操作时:
activity和fragment里面都会有许多重复的操作以及操作步骤,所以我们都需要提供一个BaseActivity和BaseFragment,让所有的activity和fragment都继承这个基类。
来看看我们BaseActivity中都提供了哪些操作:必要的注释真的会一定程度上的降低你的工作量,而不是提高。
比如说我使用Rxjava做加载数据的操作。这里面的流程可能稍显复杂,但是能够step1, step2的写在上面,能够让别人看懂,自己维护也方便。数据提供统一的入口。
无论是在mvp,mvc,还是mvvm中,提供一个统一的数据入口,都可以让代码变得更加易于维护。
比如,我使用的DataManager,里面的http还是preference,还是eventpost ,还是database ,都在DataManger里面进行操作,我们只需要与DataManger打交道。多用组合, 少用继承
提取方法, 去除重复代码。
比如在我的架构中,我会吧imageloader单独的抽取出来作为一个widget,把对RecyclerView的封装单独抽取出来,把下拉刷新上拉加载抽取出来。如下图:对于必要的工具类抽取也很重要,这在以后的项目中是可以重用的。
不要使用魔鬼数字/字符串/尺寸值/颜色值,正确的命名等
比如日间模式和夜间模式的对应颜色值,一看就很清晰了。引入Dagger2 减少模块之间的耦合性
Dagger2 是一个依赖注入框架,使用代码自动生成创建依赖关系需要的代码。减少很多模板化的代码,更易于测试,降低耦合,创建可复用可互换的模块。
参考之前的文章 Google官方MVP+Dagger2架构详解为你的项目引入Rxjava+RxAndroid这些响应式编程吧。极大的减少逻辑代码,让你爱上写代码停不下来。
通过引入 Event Bus(事件总线,这个项目使用的是otto)。它允许我们在Data Layer中发送事件,以便View Layer中的多个组件都能够订阅到这些事件。比如DataManager
中的退出登录方法可以发送一个事件,订阅这个事件的多个Activity在接收到该事件后就能够更改它们的UI视图,从而显示一个登出状态。
当然你也可以有很多的选择,EventBus,Otto,自定义RxBus等。减少回调。添加日志打印,用于查找错误等。
logger 以及timber是我推荐的。
需要使用BuildConfig.DEBUG标记对Log进行封装,只在调试时输出重要信息,正式版不输出TODO more
参考文章
Android进阶之路——安卓编程规范
Google官方MVP+Dagger2架构详解
网络图片加载的封装
Good-Android-development-habits
Android Project Guidelines
原文: http://www.jianshu.com/p/99239b9c1630
Android开发架构规范相关推荐
- android底层 考试 华清,Android开发架构你真的了解吗—华清创客学院
原标题:Android开发架构你真的了解吗-华清创客学院 华清创客学院讲师:我在网上翻过很多关于架构的文章,android也好,iOS也好,谈的更多的都是对工程结构的划分,涉及架构的部分非常少. 很多 ...
- Android开发编码规范pdf文件下载
Android开发编码规范.pdf文件下载 Android开发编码规范.pdf文件下载. 公司要求成立统一的开发流程和编码规范,希望每个人的编码一致,风格一致,这样有利于提高开发效率,于是我从网上整理 ...
- Android 开发架构-MVC MVP MVVM详解
何为架构 架构,即程序的逻辑组织结构,是指导开发过程中划分程序逻辑模块的关键,好的架构要使程序达到高内聚低耦合的设计目标.例如一个人,身体的骨骼即为身体的架构,有了基本骨架之后,才可以决定在头颅里开发 ...
- android开发架构总结一——常用的第三方库
android开发中,一般都会导入一些第三方库来实现一些复杂功能,而不用自己重复造轮子,以下是自己在开发过程中,一些常用的第三方库: 1. 网络请求: (1)Retrofit2.1.0 compile ...
- android 开发 命名规范
转自:http://www.cnblogs.com/ycxyyzw/p/4103284.html 标识符命名法 标识符命名法最要有四种: 1 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外,其 ...
- Android开发基础规范(二)
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52614696 前言:Androi ...
- Android开发基础规范(一)
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52602487 前言:Androi ...
- 无规矩不成方圆,代码规范到底有多重要?(附阿里最新Android开发代码规范手册)
前言 代码规范是我们每个程序员要做的事,假设我们按照自己的喜好来写代码,那么很可能出现的问题就是我看不懂你的代码或者你看不懂我的代码,这样会给后续维护形成巨大的障碍.这个时候问题来了,如何让代码不分你 ...
- 【软件开发规范六】《Android开发编码规范》
目录 一.工程包命名 二.类文件命名 三. 图片等资源文件命名 四.程序中变量 常量命名 一.工程包命名 工程包名 com. 公司名称简写.应用名称简写(拼音或者英文).activity 放工程的主 ...
最新文章
- pythonbyte连接_Python3之字节串bytes与字节数组bytearray的使用详解
- asp.net中长内容自动分页的实现
- 新一代 Linux 文件系统 btrfs 简介
- struct类型重定义 不同的基类型_汇总贴:STEP7的复杂数据类型有哪些?
- 与大家分享一个我最近开始用的不错的JavaScript IDE
- WEB文件上传之JQuery ajaxfileupload插件使用(二)
- FFmpeg--命令详解
- 管理用户和PROFILE——管理用户——修改用户
- linuxweb服务器域名网站,linux web服务器目录
- shell笔记[转]
- 《移动浪潮》读书笔记
- swagger如何屏蔽某些接口,不对外公开--使用@ApiIgnore
- photoshop 插件_适用于Web设计人员的10+个免费Photoshop插件
- 怎么复制一台虚拟机到另外一台电脑上
- android手机连接esp32视频
- SSH远程登录与控制
- 爬虫之爬取易班推文信息
- 基于色彩恒常( color constancy)特性的Frankle-McCann Retinex图像增强。
- 不经意传输协议快速入门
- 面试问题:如何开展接口测试
热门文章
- MongoDB 进阶-关联查询
- Spring3注解@Component、@Repository、@Service、@Controller区别
- 详解Python中的下划线
- [C++调试笔记]初始化3种粒子数据initmaxw
- MindSpore!这款刚刚开源的深度学习框架我爱了!
- 撒花!吴恩达《Machine Learning Yearning》完结!
- 独立成分分析ICA系列4:ICA的最优估计方法综述
- [OS复习]虚拟存储管理技术 1
- go语言中append函数的使用
- 实验四 [bx]和loop的使用+段前缀