目录:
一》Android开发代码规范
二》开源项目学习方法
Android开发代码规范
1.命名基本原则
在面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的。比如,大小写的区分,使用不同字母开头等等。但究其本,追其源,在为一个资源其名称的时候,应该本着描述性以及唯一性这两大特征来命名,才能保证资源之间不冲突,并且每一个都便于记忆。
对于理解应用程序的逻辑流,命名方案是最有影响力的一种帮助。名称应该说明“什么”而不是“如何”。命名原则是:使名称足够长以便有一定的意义,并且足够短以避免冗长。唯一名称在编程上仅用于将各项区分开。以下几点是规范的命名方法。
2.命名基本规范
2.1.编程基本命名规范
(1)避免难懂的名称,如属性名xxK8,这样的名称会导致多义性。
(2) 在面向对象的语言中,在类属性的名称中包含类名是多余的,如Book.BookTitle,而是应该使用Book.Title。
(3)在允许函数重载的语言中,所有重载都应该执行相似的函数。
(4)使用动词-名词的方法来命名对给定对象执行特定操作的例程,如CalculateInvoiceTotal()。(例程是某个系统对外提供的功能接口或服务的集合)
(5)只要合适,在变量名的末尾或开头加计算限定符(Avg、Sum、Min、Max、Index)。
(6)在变量名中使用互补对,如min/max、begin/end和open/close。
(7)布尔变量名应该包含Is,这意味着Yes/No 或 True/False 值,如 fileIsFound。
(8)即使对于可能仅出现在几个代码行中的生存期很短的变量,仍然使用有意义的名 称。仅对于短循环索引使用单字母变量名,如 i 或 j。
(9)为了帮助区分变量和例程,对例程名称使用Pascal大小写处理 (CalculateInvoiceTotal),其中每个单词的第 一个字母都是大写的。对于变量名,使用 camel大小写处理 (documentFormatType),其中除了第一个单词外每个单词的第一个字母都是大写的。
(10)不要使用原义数字或原义字符串,而是使用命名常数,NUM_DAYS_IN_WEEK ,以便于维护和理解。
2.2.分类命名规范
(1)包的命名
Java包的名字都是由小写单词组成。但是由于Java面向对象编程的特性,每一名Java程序员都可以编写属于自己的Java包,为了保障每个Java包命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以程序员一般采用自己在互联网上的域名称作为自己程序包的唯一前缀。
例如: net.frontfree.javagroup
(2)类的命名
类的名字必须由大写字母开头而单词中的其他字母均为小写;如果类名称由多个单词组成,则每个单词的首字母均应为大写例如TestPage;如果类名称中包含单词缩写,则这个缩写词的每个字母均应大写,如:XMLExample,还有一点命名技巧就是由于类是设计用来代表对象的,所以在命名类时应尽量选择名词。
例如: Circle
(3)方法的命名
方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头。
例如: sendMessge
(4).常量的命名
常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词。
例如: MAX_VALUE
(5)参数的命名
参数的命名规范和方法的命名规范相同,而且为了避免阅读程序时造成迷惑,请在尽量保证参数名称为一个单词的情况下使参数的命名尽可能明确。
(6)Javadoc注释
Java除了可以采用我们常见的注释方式之外,Java语言规范还定义了一种特殊的注释,也就是我们所说的Javadoc注释,它是用来记录我们代码中的API的。Javadoc注释是一种多行注释,以/**开头,而以*/结束,注释可以包含一些HTML标记符和专门的关键词。使用Javadoc注释的好处是编写的注释可以被自动转为在线文档,省去了单独编写程序文档的麻烦。
例如:
/**
* This is an example of
* Javadoc
*
* @author darchon
* @version 0.1, 10/11/2002
*/
在每个程序的最开始部分,一般都用Javadoc注释对程序的总体描述以及版权信息,之后在主程序中可以为每个类、接口、方法、字段添加Javadoc注释,每个注释的开头部分先用一句话概括该类、接口、方法、字段所完成的功能,这句话应单独占据一行以突出其概括作用,在这句话后面可以跟随更加详细的描述段落。在描述性段落之后还可以跟随一些以Javadoc注释标签开头的特殊段落,例如上面例子中的@auther和@version,这些段落将在生成文档中以特定方式显示。
虽然为一个设计低劣的程序添加注释不会使其变成好的程序,但是如果按照编程规范编写程序并且为程序添加良好的注释却可以帮助你编写出设计完美,运行效率高且易于理解的程序,尤其是在多人合作完成同一项目时编程规范就变得更加重要。俗话说“磨刀不误砍柴工”,花费一点时间去适应一下Java编程规范是有好处的。
3.分类命名规范
3.1.基本数据类型命名规范
Integer:int+描述 Char:chr+描述 Boolean:bln+描述
Long:lng+描述 Short:shr +描述 Double:dbl+描述
String:str+描述 Float:flt+描述 Single:sng+描述
DataTime:dt+描述 Array:arr+描述 Object:obj+描述
如:String srtName;
3.2.控件命名规范
TextView :txt_+描述 |
Button :btn_+描述 |
ImageButton :imgBtn_+描述 |
ImageView :imgView_+描述 |
CheckBox :chk_+描述 |
RadioButton :rdoBtn_+描述 |
AnalogClock :anaClk_+描述 |
DigitalClock :DgtClk_+描述 |
DatePicker :dtPk_+描述 |
TimePicker :tmPk _+描述 |
ToggleButton :tglBtn_+描述 |
EditText:edtTxt_+描述 |
ProgressBar:lcb_+描述 |
SeekBar:skBar _+描述 |
AutoCompleteTextView:autoTxt_+描述 |
MultiAutoCompleteTextView:mlAutoTxt_+描述 |
ZoomControls:zmCtrl_+描述 |
Include:ind_+描述 |
VideoView:vdoVi_+描述 |
WebView:webVi_+描述 |
RatingBar:ratBar_+描述 |
Tab:tab__+描述 |
Spinner:spn_+描述 |
Chronometer:Cmt_+描述 |
ScrollView:sclVi_+描述 |
TextSwitcher:txtSwt_+描述 |
Gallery:gal_+描述 |
ImageSwitcher:imgSwt_+描述 |
GridView:gV_+描述 |
ListView:lVi_+描述 |
ExpandableList: epdLt_+描述 |
MapView: mapVi_+描述 |
控件说明如下:
•TextView - 文本显示控件
•Button - 按钮控件
•ImageButton - 图片按钮控件
•ImageView - 图片显示控件
•CheckBox - 复选框控件
•RadioButton - 单选框控件
•AnalogClock - 钟表(带表盘的那种)控件
•DigitalClock - 电子表控件
•DatePicker - 日期选择控件
•TimePicker - 时间选择控件
•ToggleButton - 双状态按钮控件
•EditText - 可编辑文本控件
•ProgressBar - 进度条控件
•SeekBar - 可拖动的进度条控件
•AutoCompleteTextView - 支持自动完成功能的可编辑文本控件
•MultiAutoCompleteTextView - 支持自动完成功能的可编辑文本控件,允许输入多值(多值之间会自动地用指定的分隔符 分开)
•ZoomControls - 放大/缩小按钮控件
•Include - 整合控件
•VideoView - 视频播放控件
•WebView - 浏览器控件
•RatingBar - 评分控件
•Tab - 选项卡控件
•Spinner - 下拉框控件
•Chronometer - 计时器控件
•ScrollView - 滚动条控件
•TextSwitcher - 文字转换器控件(改变文字时增加一些动画效果)
•Gallery –画廊控件
•ImageSwitcher - 图片转换器控件(改变图片时增加一些动画效果)
•GridView - 网格控件
•ListView - 列表控件
•ExpandableList - 支持展开/收缩功能的列表控件
3.3.变量命名规范
变量命名:前缀+类型描述+意义描述
前缀:
成员变量:m_*** 局部变量:l_*** 形参:a_***
常量:大写_*** 枚举值:em_***
3.4.程序规范
工程的命名为:描述
应用程序名的命名为:描述+App
4.代码书写规范
(1)建立标准的缩进大小(如四个空格),并一致地使用此标准。用规定的缩进对齐代码节。
(2)在发布源代码的硬拷贝版本时使用特定的字体以及字号(新宋体、小五号)。
(3)在括号对对齐的位置垂直对齐左括号和右括号,如:
for (i=0; i<100; i++)
{
;
}
(4)沿逻辑结构行缩进代码使代码更易于阅读和理解,如:
if(expression)
{
if(expression )
{
//
//此处填写你的代码块;
//
}
else
{
//
//此处填写你的代码块;
//
}
}
(5)为注释和代码建立最大的行长度,以避免不得不滚动源代码编辑器,并且可以提供整齐的硬拷贝表示形式。
(6)当一行内容太长而必须换行时,在后面换行代码中要使用缩进格式,如下:
string inserString ="Insert Into TableName(username,password,email,sex,address) "
+"Values( 'Soholife ', 'chenyp ', '[email protected] ', 'male ', '深圳福田 ') ";
(7)每一行上放置的语句避免超过一条。特殊循环如for(i =0;i<100;i++)等除外。
(8)编写SQL语句时,对于关键字使用全部大写,对于数据库元素(如表、列和视图)使用大小写混合。例如SELECT * FROM Table1;
(9)将每个主要的SQL子句放在不同的行上,这样更容易阅读和编辑语句,例如:
SELECT FirstName, LastName
FROM Customers
WHERE State = 'WA '
(10)在物理文件之间在逻辑上划分源代码。
(11)使用空白为源代码提供结构线索。这样做会创建代码“段”,有助于读者理解软件的逻辑分段
(12)将大的复杂代码段分为较小的、易于理解的模块。
5.注释
软件文档以两种形式存在:外部的和内部的。外部文档(如规范、帮助文件和设计文档)在源代码的外部维护。内部文档由开发人员在开发时在源代码中编写的注释组成。
不考虑外部文档的可用性,由于硬拷贝文档可能会放错地方,源代码清单应该能够独立存在。外部文档应该由规范、设计文档、更改请求、错误历史记录和使用的编码标准组成。 以下几点是规范的注释方法:
(1)一个工程应有一个统一的头文件注释,以说明整个工程的信息、创建日期、版本等等
(2)对重要的程序加注释进行说明
(3)修改代码或删除时,将原代码用注释的方法屏蔽,同时要加开发者自身对修改操作的注释。格式为:
//原代码
//Added/(Modified/ Deleted) by 开发者姓名 年-月-日;
//因为业务原因修改的,要注明修改或删除原因)
新代码
(4)使用XML文档格式,如下面方法的注释:
/// <summary>
/// 得到某人的年龄
/// </summary>
/// <param name= "userName "> 用户名 </param>
/// <returns> 用户年龄 </returns>
public int GetUserAge(string userName)
{
//
//此处写你的程序代码
//
}
(5)避免杂乱的注释,而是应该使用空白将注释同代码分开。
(6)移除所有临时或无关的注释,以避免在日后的维护工作中产生混乱。
(7)注释应对代码进行准确的说明,不应存在歧义。
(8)在整个应用程序中,使用具有一致的标点和结构的统一样式来构造注释。
学习各种开源项目,已经成为很多朋友不可回避的工作内容了。笔者本人也是如此。在接触并学习了若干个开源项目之后,笔者试图对自己工作过程中的若干体会加以总结,以期对一些希望借鉴的朋友有所裨益。
需要说明的是,笔者本人接触的开源项目大多属于计算机系统领域,例如Linux kernel,KVM,QEMU,OpenStack等。因此,此处介绍的经验必定也有些局限。请读者们自行分辨,区别对待。
对于一个开源项目,可以将与之相关的各种知识和技能的学习大致划分为如下五个层次:
第一层次:了解项目的基本概念、基本用途、逻辑结构、基本原理、产生背景、应用场景等基本知识。
这个层次的基本定位其实就是“科普”。如果对于一个项目只需要有些基本了解,且短期内并不需要上手进行实际技术工作,则学习到这个层次也就可以先应付一下了。
第二层次:掌握项目的基本安装流程和使用方法。
这个层次的基本定位是“入门”,以便对这个项目获得直观认识,对其安装和使用获得亲身体验。如果只是需要以as-is方式使用这个项目,则初步学习到这个层次即可。
第三层次:了解代码的组织,找到各个主要逻辑/功能模块与代码文件之间的对应关系,通过代码分析走通几个关键的、有代表性的执行流程。
这个层次的基本定位是“深入”,开始理解这个项目的实际实现,能够真正将项目的功能、工作原理和代码实现对应起来,获得对这个项目工作过程的直观认识。这个层次是学习开源项目代码的真正开始。如果希望基于这一项目进行应用开发,或者针对与这一项目密切相关的其他项目进行工作时,则对项目本身的代码进行这一层次的理解,会很有帮助。
第四层次:了解该项目所有代码模块、程序文件的作用,走通所有主要执行流程。
这个层次的基本定位是“掌握”,能够比较全面、系统地理解这个项目的设计和实现,并且熟悉项目各个部分的代码。如果希望对项目进行深度定制修改,或者对社区有所贡献,则应当以达到这个层次作为目标。
第五层次:钻研、领悟该项目的各种设计思想与代码实现细节。
这个层次的基本定位是“精通”,精益求精,学无止境。这是大神们追求的境界。如果希望成为项目社区的重要贡献者乃至核心贡献者,则应当以这个层次作为努力的目标。
综上,对于一个开源项目的学习过程可以大致分为五个层次。至于到底要学习到什么阶段,投入多少相关精力,则完全取决于学习的目的。
学习一个开源项目需要的知识基础主要包括:
1)该项目涉及的技术领域的背景知识
举例而言,分析Linux Kenrel,则应该了解操作系统原理;学习OpenStack,则应该知道什么是云计算。如果没有这些背景知识作为基础,上来就死磕源代码,只能是事倍功半。
2) 该项目开发使用的语言及其各种开发调试工具
这个就无需多言了。
3) 英语
很遗憾,目前为止真正流行的开源项目大部分不是起源于国内。因此,除了学习个别极其流行、文档完备的项目之外,大家还是需要自行搜集阅读英文资料参考。学好英语很重要。
当然,到底需要准备多少知识基础,完全取决于学习的目的和层次。如果只是想科普一下,也就不必太过麻烦了。
学习一个项目的过程,其实就是由表及里了解分析它的过程。上述提及的五个学习层次便组成了这样一个逐渐深入的过程。在此基础之上,学习、分析代码的过程,也可以尝试做到由表及里、逐渐深入。
在刚开始接触一个项目的时候,我们看到的其实就是一个黑盒子。根据文档,我们一定会发现盒子上具有若干对外接口。通常而言,这些接口可以被分为三类:
因此,在分析一个开源项目的代码时,可以围绕重要的配置、控制、数据接口展开分析工作,特别应该注意理解一个关键的接口背后隐藏的操作流程。例如,针对数据接口,至少应当走通一条完整的数据输入输出流程,也即在代码中找到数据从输入接口进入盒子后,经过各种处理、转发步骤,最终从输出接口被传输出去的整个执行过程。一旦走通了这样一条流程,则可以将与数据处理相关的各个主要模块、主要步骤贯穿起来,并将逻辑模块图上和文档中的抽象概念对应到代码实现之中,可以有效推进对于项目的深入理解。
在实践这一思路的过程中,笔者建议可以优先从控制接口和数据接口中各自选择一二重要者进行背后的执行流程详细分析,力争找到其中每一步的函数调用及数据传递关系(对于一些系统、应用库提供的底层函数可以先行跳过以节省时间)。这一工作完成之后,则第1节中第三层次的学习目标即可初步达成。
配置接口在不同的项目中的重要程度不同。对于一些架构极为灵活、配置空间甚大的项目(如OpenStack的Ceilometer),则可以适当多花些时间加以研究,否则简单了解即可。
对于这个学习思路,下文中还将结合实例进行进一步的说明。
以下是笔者的一些零散建议,供大家参考。
1)做好记录
在刚刚入手开始学习某个项目的源代码时,其实很有点破译密码的感觉。大量的数据结构和函数方法散落在代码的各个角落里,等待着学习者将它们贯穿到一个个重要的执行流程中。因此,在分析学习的过程中,无论有什么零散收获,都值得认真记录下来。珍珠自然会串成项链的。
2)不要过分纠缠于细节
立志搞懂一个项目的每行源代码是值得尊敬的,但至少在刚刚入手的时候是没有必要的。如果过于纠缠于代码的实现细节,则可能很快就被搞得头晕眼花不胜其烦了(看英文资料的时候,每遇到一个不认识的词都要立刻查词典么?)。不妨避免细节上的过度纠缠,还是先尽快走通关键的执行流程,将项目的骨干框架搭起来,然后再以此为参照,就可以清晰判断什么代码值得深入分析,什么地方可以简单略过了。
3)想像和联想很重要
如前所述,从零开始搞懂一个项目的代码,就像破译密码。因此,不妨展开合理的想象和联想,将各个零散的发现和理解联系起来,并加以分析印证。在这个过程中,对项目所在领域的背景知识、对项目本身的逻辑框架和工作原理等方面的理解,都是想像和联想的参照与指导。此外,一些关键的函数名、变量名等等都是联想的hint。本质上,编程语言也是语言,而程序代码就是说明文。在分析代码时,一定要超越语言和代码的细节去理解被说明的事物本身。
4)该搜就搜
分析代码的时候,很容易出现的情况就是,一个执行流程走到半截找不到下一步了。。。在这种情况下,当然首先还是推荐采用各种调试工具的单步执行功能加以跟踪。如果暂时不会,或者种种原因只能进行静态代码分析,那么该搜就搜吧。各种IDE工具的文本搜索都能用,哪怕是grep也行。至于到底以什么为搜索关键词,就需要琢磨琢磨了。
5)外事不决问google,内事不决问百度
如题,不解释。
建一个群,方便大家交流:蹦蹦哒Android <群号:423923313>