private Button m_btnSwitch = null;
public class SampleCode
{
/** 圆周率 */
public static final double PI = 3.1415926535897932384626433832795;
/** 整型值 */
private int m_nValue = 0;
/** 字符值 */
private char m_cValue = '0';
/** 浮点值 */
private float m_fValue = 0.0f;
/** 双精度值 */
private double m_dValue = 0.0;
/** 布尔值 */
private boolean m_bValue = true;
/** 字符串值 */
private String m_strValue = "";
/** 是否为 16 进制 */
protected boolean m_bHex = false;
/**
* 获取整型值
* @return
*/
public int getNValue()
{
return m_nValue;
}
/**
* 获取字符串值
* @return
*/
public String getStrValue()
{
return m_strValue;
}
/**
* 设置整型值
* @param n
*/
public void setNValue(final int n)
{
m_nValue = n;
}
/**
* 设置字符串值
* @param str
*/
public void setStrValue(final String str)
{
if (str == null) return;
m_strValue = str;
}
/**
* 是否为 16 进制
* @return
*/
public boolean isHex()
{
return m_bHex;
}
/**
* 构造函数
* @param n 整型值
*/
public SampleCode(final int n)
{
// 整型值
m_nValue = n;
}
/**
* 加法
* @param n 整数
*/
private void add(final int n)
{
m_nValue += n;
}
/**
* 加法
* @param n1 整数 1
* @param n2 整数 2
* @return 结果
*/
public int add(final int n1, final int n2)
{
return n1 + n2;
}
/**
* 加法
* @param n 整数
* @param ns 整数数组
* @return 是否相加成功
*/
public boolean add(final int n, final int[] ns)
{
try
{
if (n < 1 || n > ns.length)
{
return false;
}
m_nValue = 0;
for (int i = 0; i < n; i++)
{
// 加法
add(ns[i]);
}
}
catch (Exception e)
{
e.printStackTrace();
return false;
}
return true;
}
}
package cn.tbtech.codingruler;
/**
* 类的基本描述写在这里...
*
*
1. 代码
*
* - 1.1. 请使用 UTF-8 格式来编写代码, 避免出现中文乱码
*
- 1.2. 代码缩进必须使用 Tab, 而不能使用空格, 且代码布局尽量对齐
*
- 1.3. 代码中不允许出现警告(Java 代码中无法消除的警告要用 @SuppressWarnings)
*
- 1.4. 去掉无用的包(命名空间), 方法(函数), 变量(字段)等, 减少僵尸代码
*
- 1.5. 在 Eclipse 中使用 Lint 工具来查看并消除警告和错误
*
- 1.6. 在 Eclipse 中使用 Ctrl+Shift+F 来格式化代码, 然后再进行调整
*
- 1.7. 在 Eclipse 中使用 Ctrl+Shift+O 来格式化 import 包
*
*
* 2. 命名规则
* 2.1. 基本原则
*
* - 2.1.1. 变量, 方法, 类和接口等, 其命名要表义, 不能使用 name1, name2 等无直接意义的命名
*
- 2.1.2. 命名不能太长, 适当使用简写或缩写, 如 nMaximumNumber 简写为 nMaxNum
*
- 2.1.3. 方法名以小写字母开始, 其后每个单词首字母大写(即使用驼峰表示法), 如 doSomething
*
- 2.1.4. 方法名避免使用相似或者仅在大小写上有区别的名字
*
- 2.1.5. 方法名避免使用数字, 但可用 2 代替 to, 用 4 代替 for 等, 如 str2int
*
*
* 2.2. 类, 接口
*
* - 2.2.1. 所有单词首字母都大写, 使用能确切表示该类, 接口含义, 功能等的词, 一般采用名词
*
- 2.2.2. 接口带 I 或 On 等前缀, 或 Listener 等后缀, 如 OnClickListener
*
*
* 2.3. 常量, 变量
*
* - 2.3.1. 常量全部大写, 在单词与单词之间用下划线连接, 如 MAX_NUMBER
*
- 2.3.2. 变量前使用前缀 m_ 标识为成员变量, 如果是静态成员变量则为 ms_, 如 m_strUserName, ms_instance
*
- 2.3.3. 普通变量使用前缀 n, f, d, b, bt, str 等标识变量的数据类型, 如 nNum, strName
*
- 2.3.4. 某些局部变量可以根据实际情况灵活变通, 比如用于循环中的 i, j, k 等变量
*
- 2.3.5. 代码中禁止使用硬编码, 应把一些数字或字符串定义成常用量, 如圆周率等
*
- 2.3.6. 对于废弃不用的函数, 为了保持兼容性, 通常添加 @Deprecated, 如 {@link #doSomething()}
*
*
* 3. 注释
* 请参考 {@link #SampleCode} 类的注释
*
* - 3.1. 所有的注释, 不分编程语言(C, C++, Java, Objective-C 等), 均采用 Javadoc 格式
*
- 3.2. 在代码的关键函数部分, 逻辑处理部分, 复杂算法部分等, 必须添加注释
*
- 3.3. 代码中的注释尽量做到"宁多勿少", 必要的时候还必须配套相应的说明文档
*
- 3.4. 常量注释, 参见 {@link #PUB_VAR}
*
- 3.5. 变量注释, 参见 {@link #m_object0}
*
- 3.6. 函数注释, 参见 {@link #doSomething(boolean, double, String)}
*
- 3.7. 注释语言, 根据项目的要求来决定应该使用中文还是英文, 对于容易产生歧义的注释推荐使用英文
*
- 3.8. 标点符号, 如果使用中文进行注释, 为了保持对齐应该使用英文标点符号
*
*
* 4. Class 内部顺序和逻辑
*
* - 4.1. 每个 class 都应该按照一定的逻辑结构来排列成员变量, 方法, 内部类等, 从而达到良好的可读性
*
- 4.2. 总体上来说, 要按照先 private, 然后 protected, 最后 public, 先常量后变量
*
- 4.3. 函数的排布也应该有一个逻辑的先后顺序, 由轻到重, 或按照调用关系的先后顺序排列
*
- 4.4. 以下顺序可供参考:
* 定义 TAG, 一般为 private(可选)
* 定义 private 常量
* 定义 protected 常量
* 定义 public 常量
* 定义 private 变量
* 定义 protected 变量
* 定义 public get 方法
* 定义 public set 方法
* 定义 class 的构造方法
* 定义 private 方法
* 定义 protected 方法
* 定义 public 方法
* 定义 private 内部类, 参见 {@link #CodingRulerInternal}
*
*
* 5. 表达式与语句
* 5.1. 基本原则: 采用紧凑型风格来编写代码
* 5.2. 细则
*
* - 5.2.1. 条件表示式, 参见 {@link #conditionFun()}
*
- 5.2.2. switch 语句, 参见 {@link #switchFun()}
*
- 5.2.3. 循环语句, 参见 {@link #circulationFun()}
*
- 5.2.4. 错误与异常, 参见 {@link #exceptionFun()}
*
- 5.2.5. 其它, 参见 {@link #doSomething(boolean, double, String)}
*
*/
@SuppressWarnings("unused")
public class CodingRuler
{
/** TAG */
private final String TAG = getClass().getSimpleName();
/** 私有常量 MSG_NONE 的注释(同类型的常量可以分块并紧凑定义) */
private static final int MSG_NONE = 0; // 注意初始化值 0, 1, 2 的对齐
/** 私有常量 MSG_SUCCESS 的注释 */
private static final int MSG_SUCCESS = 1; // 运算符(+ - * / = | & 等)两端必须有空格
/** 私有常量 MSG_FAILED 的注释 */
private static final int MSG_FAILED = 2;
/** 保护常量的注释 */
protected static final String PRO_VAR = "protected";
/** 公有常量的注释 */
public static final String PUB_VAR = "public";
/** 私有成员变量 m_object0 的注释(同类型的成员变量可以分块并紧凑定义) */
private Object m_object0 = null;
/** 私有成员变量 m_object1 的注释 */
private Object m_object1 = null;
/** 私有成员变量 m_object2 的注释 */
private Object m_object2 = null;
/** 保护成员变量的注释 */
protected Object m_object3 = null;
/**
* 对于注释多于一行的, 采用这种方式
* 定义该变量
*/
protected Object m_object4 = null;
/**
* get 方法描述...
* @return
*/
public Object getObject0()
{
return m_object0;
}
/**
* set 方法描述...
*
* 1. 如果是 get 或 set 函数, 函数体可以只有一行, 且可以不用写参数说明和返回值说明
* 2. 如果变量为 boolean(布尔) 型, 则 get 函数一般写为 is 前缀, 如 m_bHex 变量的函数写为 isHex()
* 3. 除了数组初始化之外, 其余用到花括号"{}"的, 必须另起一行
* 4. 比如不能使用类似 if (bClose) { 这样的代码行, 必须把 { 另起一行
* @param obj
*/
public void setObject0(Object obj)
{
m_object0 = obj;
}
/**
* 构造方法
*/
public CodingRuler()
{
// ...
}
/**
* if 条件表达式原则
* 1. 通常 if 语句必须用花括号"{}"包括起来, 如果只有一句, 且为简单赋值或返回等, 可以使用不带 {} 的语句
* 2. 在含有多种运算符的表达式中, 使用圆括号来避免运算符优先级问题
* 3. 当判断条件很多时, 请将其它条件换行
*/
private void conditionFun()
{
boolean bCondition1 = true;
boolean bCondition2 = false;
boolean bCondition3 = false;
boolean bCondition4 = false;
boolean bCondition5 = false;
boolean bCondition6 = false;
if (bCondition1)
{
// Implementation...
}
if (bCondition1)
{
// Implementation...
}
else
{
// Implementation...
}
if (bCondition1)
{
// Implementation...
}
else if (bCondition2)
{
// Implementation...
}
else
{
// Implementation...
}
// 使用不带 {} 的语句
if (bCondition1) bCondition3 = true;
// 使用不带 {} 的语句
if (!bCondition2) return; // 注意, 非运算符 ! 的两端不需要空格
if ((bCondition1 == bCondition2) || (bCondition3 == bCondition4) || (bCondition5 == bCondition6))
{
}
}
/**
* switch 语句原则
* 1. switch 语句中, break 与下一条 case 之间, 空一行
* 2. 对于不需要 break 语句的, 请相连使用
* 3. 请默认写上 default 语句, 保持完整性
* 4. 在每一个 case 语句上写注释
*/
private void switchFun()
{
int nMsg = MSG_NONE;
switch (nMsg)
{
// 无
// 失败
case MSG_NONE:
case MSG_FAILED:
break;
// 成功
case MSG_SUCCESS:
break;
default:
break;
}
}
/**
* 循环表达式原则
* 1. 尽量使用 for each 语句代替原始的 for 语句
* 2. 循环中必须有终止循环的条件或语句, 避免死循环
* 3. 循环要尽可能的短, 把长循环的内容抽取到方法中去
* 4. 嵌套层数不应超过 3 层, 要让循环清晰可读
* 5. for 之后的花括号"{}"必须另起一行, while, do-while 等与之类似
*/
private void circulationFun()
{
// 除了数组初始化之外, 其余用到花括号"{}"的, 必须另起一行
int nArray[] = { 1, 2, 3, 4, 5 };
for (int nData : nArray)
{
// Implementation...
}
int nLength = nArray.length;
for (int i = 0; i < nLength; i++)
{
// Implementation...
}
boolean bCondition = true;
while (bCondition)
{
// Implementation...
}
do
{
// Implementation...
}
while (bCondition);
}
/**
* 异常捕获原则
* 1. 捕捉异常是为了处理它, 通常在异常 catch 块中输出异常信息
* 2. 资源释放的工作, 可以放到 finally 块部分去做, 如关闭 OutputStream 等
* 3. 一般在遇到 IO 操作, 控制硬件, 数组操作, 复杂运算等, 推荐在函数中增加异常处理
* 4. 如果程序要求高度的稳定性, 即决不允许出现死机, 中断等情况, 则在函数中增加异常处理
*/
private void exceptionFun()
{
try
{
// Implementation...
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
// ...
}
}
/**
* 私有方法描述...
*/
@Deprecated
private void doSomething()
{
// Implementation...
}
/**
* 保护方法描述...
*
* 1. 参数间隔的逗号","之后必须有空格(Objective-C 语言为冒号":")
* 2. 在 Eclipse 中, 注释函数时, 在函数行之前输入"/**"后, 回车, 即可自动生成注释样式
* 3. 函数的注释, 不分编程语言(C, C++, Java, Objective-C 等), 均采用 Javadoc 格式
* 4. @param 为参数说明
* 5. @return 为返回值说明
* @param nParam1 参数 1 描述...
* @param fParam2 参数 2 描述...
* @return 返回值说明
*/
protected boolean doSomething(final int nParam1, final float fParam2)
{
// Implementation...
return true;
}
/**
* 公有方法描述...
*
* 1. 对于不许在函数内部改变的参数, 则必须使用 final 描述(C 语言 const), 如 bParam1 和 dParam2
* 2. 对于可能在函数内部改变的参数, 则不能使用 final 描述, 如 strParamX
* @param bParam1 参数 1 描述...
* @param dParam2 参数 2 描述...
* @param strParamX 参数 X 描述... (注意: 请将参数, 描述都对齐)
* @return 返回值说明
*/
public String doSomething(final boolean bParam1, final double dParam2, String strParamX)
{
strParamX = "My values changed!";
// Implementation...
return strParamX;
}
/**
* 内部类...
*/
private class CodingRulerInternal
{
// ...
}
}