移动开发之开发规范篇
开发规范篇
##前言
程序猿这条路干久了,就会越发的觉得好习惯的重要性,在这之前,和大部分新手一样,觉得省时省事最重要,但现在慢慢注重这些了,一个好的编码习惯真的会是我们一辈子的财富。在学习的过程中,学会了慢慢积累这些东西,今天就汇总一下,并且以后会持续更新中。
编码之前,思路先行。
我之前总会有一个坏习惯就是,很多问题没想清楚,就动手敲代码了,结果大部分情况都是无功而返,好点的情况是亡羊补牢,遇到问题就再解决。其实有时候大部分的问题我们细心想一想都可以避免,好的思路可以引导出好的设计,这也就是为什么有设计模式的原因。
这里我贴出谷歌官方风格指南,这里包含了许多语言:C++ Style Guide, Objective-C Style Guide, Java Style
Guide,Python Style Guide, Shell Style Guide, HTML/CSS Style
Guide, JavaScript Style Guide, AngularJS Style Guide, Common Lisp Style Guide, and Vimscript Style Guide等,大家都可以做为参考。
Java/Android篇
这里我可以引用官方指南:Java代码约定,我们尽可能的遵循官方的代码规范,这里是Android官方给出的一些建议:Android开发者代码风格指南需翻墙,而下面是我整理的一些:
- 驼峰式命名(大小写交替),常量大写,多个字母间下划线分割;多用常见缩写。
- 使用Javadoc识别的注释。
- 局部变量随用随声明(我们要尽量缩小变量的作用域)。
- 每行的字符不要过长,以100个为限,当然可以在这左右浮动。
- 缩进用4个空格符来代替Tab。
- 私有变量的名称我们用m开头。
- 不要省略大括号{},尤其是在条件判断语句后面,还有就是前大括号不要另起一行,我们遵循Java的规范,如果是C++的话,我们要遵循C++的编码规范,前大括号另起一行。
- 对于异常,我们的try catch尽可能的少的包含代码。
- 代码里尽可能不出现中文,最好中文统一写在strings.xml中。
- 布局文件中的id命名:view缩写_模块名称_view的逻辑名称。
- strings.xml中的id命名:activity名称功能模块名称逻辑名称/activity名称逻辑名称/common逻辑名称。
- 尽可能的将layout中不断重现的style提出通用的style样式,然后放到styles.xml中。
- 一些服务端处理的逻辑,我们尽可能的放到服务端,让客户端尽量只做数据展示的工作,把其主要精力放在UI和用户体验上面去,而不要去费大量精力去处理繁琐的业务逻辑。
- 尽可能的使用资源来代替图片,再或者用.9图片处理。
- 避免使用过多的第三方库,造成客户端包变大。
- 擅用字符串通配符。
- 注意listview的性能优化;注意内存泄露问题,尤其在处理图片、线程、游标等资源时。
- 尽可能少的使用静态变量来作为类之间传值。
- 资源文件的优化,擅用merge及include,以及viewstub等
- 资源文件避免嵌套更多的层次,如需RelativeLayout或许是更好地选择。
- 对于复杂页面的排版可以借用webview组件与html5来结合。
####附:常见命名缩写规则表
|名称|缩写|
|—|—|
|icon|ic(主要用在app的图标)|
|color|cl(主要用于颜色值)|
|divider|di(主要用于分隔线,不仅包括Listview中的divider,还包括普通布局中的线)|
|selector|sl(主要用于某一view多种状态,不仅包括Listview中的selector,还包括按钮的selector)|
|average|avg|
|background|bg(主要用于布局和子布局的背景)|
|buffer|buf|
|control|ctrl|
|delete|del|
|document|doc|
|error|err|
|escape|esc|
|increment|inc|
|infomation|info|
|initial |init|
|image|img|
|Internationalization|I18N|
|length|len|
|library|lib|
|message|msg|
|password|pwd|
|position|pos|
|server|srv|
|string|str|
|temp|tmp|
|window|wnd/win|
程序中使用单词缩写原则:不要用缩写,除非该缩写是约定俗成的
类命名
类型 | 命名 |
---|---|
activity | Activity为后缀标识 |
adapter | Adapter为后缀标识 |
service | Service为后缀标识 |
BroadcastReceive | receiver为后缀标识 |
ContentProvider | 以provider为后缀标识 |
基础类 | 以Base为前缀标识 |
工具类 | 以Utils或Helper为后缀标识 |
封装类 | 以Wrapper为后缀标识 |
解析或处理 | 以Paser或Handler为后缀标识 |
####接口多以able或ible结尾。
####方法常见通用命名
|方法|说明|
|—|—|
|initXX()|初始化相关方法,使用init为前缀标识,如初始化布局initView()|
|isXX()|checkXX()方法返回值为boolean型的请使用is或check为前缀标识|
|getXX()|返回某个值的方法,使用get为前缀标识|
|processXX() |对数据进行处理的方法,尽量使用process为前缀标识|
|displayXX()|弹出提示框和提示信息,使用display为前缀标识|
|saveXX()|与保存数据相关的,使用sav为e前缀标识|
|resetXX()|对数据重组的,使用reset前缀标识|
|clearXX()|清除数据相关的|
|removeXXX() |清除数据相关的|
|drawXXX()|绘制数据或效果相关的,使用draw前缀标识|
####变量采用驼峰法则,常量全部大写,多个单词下划线分割。
####资源文件命名规则
|名称|功能描述|
|—|—|
|btnxx|按钮图片使用btn整体效果|
|btn_xxnormal|按钮图片使用btn正常情况效果|
|btn_xxpress|按钮图片使用btn点击时候效果|
|bgXX|背景图片使用bg功能_说明|
|defXX|默认图片使用def功能_说明|
|icXX|图标图片使用icon功能_说明|
|segXX|具有分隔特征的图片使用seg功能_说明|
|selXX|选择图标使用sel功能_说明|
####布局文件
|类型|命名|
|—|—|
|整个活动页面|activity功能模块|
|整个片段页面|fragment功能模块|
|对话框|dlg功能模块|
|弹出框|ppw功能模块|
|列表项|item功能模块|
|包含项|include功能模块|
####动画布局文件
动画命名 | 写法 |
---|---|
fade_in | 淡入 |
fade_out | 淡出 |
push_down_in | 从下方推入 |
push_down_out | 从下方推出 |
push_left | 推向左方 |
slide_in_from_top | 从头部滑动进入 |
zoom_enter | 变形进入 |
slide_in | 滑动进入 |
shrink_to_middle | 中间缩小 |
####资源文件命名
尽量遵循官方命名规范, 多个可按功能划分。如color_功能.xml
####控件缩写
|控件|缩写|
|—|—|
|LinearLayout|ll|
|RelativeLayout|rl|
|TextView|tv|
|Button|btn|
|ImageButton|imgBtn|
|ImageView|iv|
|CheckBox|chk/cb|
|RadioButton|rdoBtn|
|analogClock|anaClk|
|DigtalClock|dgtClk|
|DatePicker|dtPk|
|EditText|edtTxt|
|TimePicker|tmPk|
|ToggleButton|tglBtn|
|ProgressBar|proBar|
|SeekBar|skBar|
|AutoCompleteTextView|autoTxt|
|ZoomControls|zmCtl|
|VideoView|vdoVi|
|WebView|webVi|
|RatingBar|ratBar|
|Tab|tab|
|Spinner|spn|
|Chronometer|cmt|
|ScollView|sclVi|
|TextSwitch|txtSwt|
|ImageSwitch|imgSwt|
|ListView|lv|
|ExpandableList|epdLt|
|MapView|mapVi|
以上仅供参考,部分整理自地址大家有更好的表示方法只要合理均可
###iOS篇
先说下苹果官方的代码规范:地址,另外除了前面介绍的谷歌官方指南以外,这里我也推荐GitHub的风格,swift地址还有Objective-C地址,下面是我整理的一些:
- 关于指针位置的写法,我还是建议和官方保持一致:即*号紧靠变量名
NSString *string
。 - 我们缩进同样使用空格;
- 每行代码字符长度建议不要超过100个,超过的则换行处理,这个和Android其实是一样的,这个可以在Xcode里面进行设置:通过 “Xcode => Preferences => TextEditing => 勾选Show Page Guide =》输入100 => OK” 。
- 方法在声明时:在 – 或 + 和返回值之间留1个空格,记得*前的空格是必须的,方法名和第一个参数间则不要留空格,参数过长,则各占一行,这一点对于方法的调用也同样适用,如果参数过多,每个参数应各占一行。在有多行参数的情况下,每行参数前的冒号应对齐。当第一行的函数关键字比其后面行的关键字短时,后面的行应缩进四个空格。保证后续的关键字垂直对齐,而不应该采用冒号对齐的方式。如:
- (id)initWithString:(NSString *)string;
- 对于类型标识符建议和官方保持一致,之间不留空格。
- 类名以首字母大写来分割单词,和驼峰有点像。
- 在应用级别的代码里尽量不使用类名前缀,编写多个应用间的共用代码我们按照官方的使用类名前缀。
- getter的方法名不要用get开头,和变量保持一致。
- 使用权限控制符@public 和@private 应缩进两个空格。
- 在类型标识符与协议的名之间不应该有空格。此协议使用的规范适用于类的声明、成员变量的声明以及方法的声明,如果申明中包含多个protocal且超出一行时换行,缩进两个空格。
- @property与左括号之间留一个空格。@property和@synthesize的缩进级别与@interface或者@implementation的缩进级别相同。@property的声明语句应该紧跟在类的成员变量声明语句块的后面。@synthesize的实现语句应该紧跟在@implementation语句之后。
- Category的命名应该包含2-3个字符的前缀,用于说明Category是属于具体的某个工程的,Category的左括号与类名之间应该留一个空格的间隔。
- 关于方法声明中应尽量单词缩写。
- 变量名应使用小写开头的驼峰法命名,类成员变量名应该以一个下划线开始,这点和Android不同之处,常量(预定义,枚举,局部常量等)使用小写k开头的驼峰法。
以上可能有不完善的地方,欢迎吐槽指正,后续会慢慢完善。
###JavaScript篇
- 变量要尽可能的先声明后使用,尽管javascript是一种弱语言,但这样做除了易读外,也可以发现那些被声明为全局的变量。
- 我们尽可能的减少使用全局变量,声明变量时放在函数头部。
- 全局变量我们也应该全部大写。
- 使用{}代替new Object()。使用[]代替new Array()。
- 使用===和!==操作符会相对好点。==和!=操作符会进行类型强制转换。 特别是, 不要将==用于与错值比较( false,null,undefined,“”,0,NaN)。
- 谷歌官方给的代码规范还是比较全面的:地址,大部分情况我还是参考这个;
总结
代码规范是我一直比较重视的东西,这里面还有许多没总结到,所以后续文章还会持续更新中。
移动开发者/技术爱好者/喜欢开源与分享,你也可以关注微信公众号MobDevGroup,移动开发在线分享:MobDevGroup