基本代码的命名
image.png image.png-
1.对象类型变量用m开头
-
2.基本数据类型则不用m开头
-
3.常量可以使用统一的开头
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/1102/6736.html
文件命名
命名的前提是见名知意
类命名:应该以驼峰式(UpperCamelCase),比如:LoginActivity、HomeFragment、ListView
资源命名:命名应该以lowercase_underscore(小写下划线的形式)。
1.Drawable files(图片文件)
作为选择器背景图片的命名:
image.png
image.png
image.png
2.Layout files(布局文件)
布局文件名应该对应的组件来命名
image.png3.Menu files(菜单文件)
菜单文件的命名跟布局文件的命名也是一样,都应该与对应的组件名字保持对应。比如,我们定义了一个菜单文件用在UserActivity,所以这个菜单文件的名字应该叫做activity_user。不以menu开头是因为这个菜单文件本身就放在了menu目录下,就不需要加上menu以区分。
4.Values files
values目录下的文件名称都应该以复数的形式命名。例如:strings.xml、colors.xml、styles.xml。如果我们需要自定义view的自定义属性,则应该命名为attrs.xml
Java language rules
1.Don't ignore exceptions
// 字符串转 long 整型
public static long parseLong(String value, long defaultValue) {
long resultValue = defaultValue;
try {
resultValue = Long.parseLong(value);
} catch (Exception e) {
e.printStackTrace();
return resultValue;
}
return resultValue;
}
2.Don't catch generic exception
try {
someComplicatedIOFunction(); // may throw IOException
someComplicatedParsingFunction(); // may throw ParsingException
someComplicatedSecurityFunction(); // may throw SecurityException
// phew, made it all the way
} catch (Exception e) { // I'll just catch all exceptions
handleError(); // with one generic handler!
}
分别捕获每个异常
3.Fully qualify imports
import foo.*; // bad
import foo.Bar; // good
Java style rules
1.Fields definition and naming
成员变量或常量应该被定义在文件的开头并遵循如下规则:
-
私有的非静态field命名应该以m开头
-
私有的静态的field命名应该以s开头
-
其它成员fields应该以小写字母开头
-
静态final fields型常量应该全为大写字母并用下划线连接 ALL_CAPS_WITH_UNDERSCORES
public class MyClass {
public static final int SOME_CONSTANT = 42;
public int publicField;
private static MyClass sSingleton;
int mPackagePrivate;
private int mPrivate;
protected int mProtected;
}
2.Treat acronyms as words(视缩写为单词)
image.png代码段用4个空格缩进###User spaces for indentation(用空格缩进)
if (x == 1) {
x++;
}
用8个空格进行换行缩进
int i = getIntegerExpression(that, wouldNotFit, on, one, line);
3.User standard brace style
使用标准的花括号样式
class MyClass {
int func() {
if (something) {
// ...
} else if (somethingElse) {
// ...
} else {
// ...
}
}
}
如果判断语句一行就能写完,就没必要用花括号
if (condition) { body(); // good}if (condition)
body(); // bad!
4.Limit variable scope(限制局部变量的范围)
局部变量的的范围应保持在最低限度的。这样做可以增加代码的可读性和可维护性,减少出错的可能性。最里面的块中声明的每个变量应该包含所有变量的使用。
5.Order import statements(导入包的排序)
一般IDE比如androidStudio,都已经自动遵守这个规则。具体排序如下
- Android imports(android 包)
2.第三方类库
3.java和javax包
4.项目内的包
并且为了匹配IDE的设置,还应遵守如下规则:
1.同一分组内,按字母顺序进行排序。
2.分组之间应该用空行分隔。
6.Logging guidelines
日志等级:
-
Log.v(String tag, String msg) (verbose)
-
Log.d(String tag, String msg) (debug)
-
Log.i(String tag, String msg) (information)
-
Log.w(String tag, String msg) (warning)
-
Log.e(String tag, String msg) (error)
egg:
public class MyClass {
private static final String TAG = MyClass.class.getSimpleName();
public myMethod() {
Log.e(TAG, "My error message");
}
}
日志一般会在正式上线之后全部关掉。也可以在开发阶段控制log是否显示:
if (BuildConfig.DEBUG) Log.d(TAG, "The value of x is " + x);
7.Class member ordering(类成员的顺序)
主要是为了提高代码可读性
1.常量
2.成员变量
3.构造函数
4.重写的方法和回调函数(public or private)
5.public methods
6.private methods
7.Inner classes or interfaces
举个例子来说:
public class MainActivity extends Activity {
private String mTitle;
private TextView mTextViewTitle;
public void setTitle(String title) {
mTitle = title;
}
@Override
public void onCreate() {
...
}
private void setUpView() {
...
}
static class AnInnerClass {
}
}
如果一个类是继承系统类,则重写的方法的排序都是很有可读性的
public class MainActivity extends Activity {
//Order matches Activity lifecycle
@Override
public void onCreate() {}
@Override
public void onResume() {}
@Override
public void onPause() {}
@Override
public void onDestroy() {}
}
8.Parameter ordering in methods
android中如果一个函数的参数包括context,则context必须作为参数的第一位,回调接口一般放置在最后一位
// Context always goes first
public User loadUser(Context context, int userId);
// Callbacks always go last
public void loadUserAsync(Context context, int userId, UserCallback callback);
9.String constants,naming,and values
当使用android中 SharedPreferences,Bundle,Intent等键值对类型api时,键值必须使用常用,命名规则如下:
10.Line length limit
一行的代码最好不要超过120个字符,如果超过了一行则应该使用创建一个临时变量或者将一行写成多行。例子如下:
int longName = anotherVeryLongVariable + anEvenLongerOne - thisRidiculousLongOne // bad
+ theFinalOne;
int longName =
anotherVeryLongVariable + anEvenLongerOne - thisRidiculousLongOne + theFinalOne; // good
Picasso.with(context).load("http://ribot.co.uk/images/sexyjoe.jpg").into(imageView); // bad
Picasso.with(context)
.load("http://ribot.co.uk/images/sexyjoe.jpg") // good
.into(imageView);
loadPicture(context, "http://ribot.co.uk/images/sexyjoe.jpg", mImageViewProfilePicture, clickListener, "Title of the picture"); // bad
loadPicture(context,
"http://ribot.co.uk/images/sexyjoe.jpg",
mImageViewProfilePicture,
clickListener,
"Title of the picture"); // good
XML styles
1.ID的命名
2.strings的命名:
3.Styles和Themes的命名
应该以驼峰的形式
4.values中排序
应该将相近的相似的属性放在一起
1.View ID
2.Style
3.Layout width and layout height
4.Other layout attributes, sorted alphabetically
5.Remaining attributes,sorted alphabetically
网友评论