`
kingbinchow
  • 浏览: 123193 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android 代码风格指南(转)

阅读更多
http://blog.lytsing.org/archives/39.html
Android的代码风格规则

The rules below are not guidelines or recommendations, but strict rules. Android代码贡献者,如果他们不遵守这些规则,那么一般他们的代码不会被接受。

并非所有现存的代码遵循这些规则,但所有的新代码希望能如此

Java 语言规则

我们遵循标准的Java编码约定。

我们还添加一些规则:

1.异常:不要在没有说明的情况下捕捉和忽略它们。
2.Exceptions : 不要捕捉一般异常, except in library code at the root of the stack.
3.Finalizers :一般不使用它们。
4.Imports : 完全符合引入

Java库规则

这里有一些关于使用android Java库与工具的约定。在某些情况下,该约定在一些重要的方式已经发生了变化,老的代码可能在使用过时的模式或库。当使用这些代码,最好继续保持与已存在的风格一致(参见一致性)当创建新的组件从来不使用废弃库。

Java的风格规则

当所有文件都保持一致的风格时,程序就更容易维护。我们遵循标准的Java编码风格,他们由Sun公司为Java编程语言制定的编码约定,除少数例外,和增加一些。这些风格指南是全面而详细的,在Java社区很常用。

此外,我们执行下面的样式规则:

1.注释/Javadoc :使用标准样式写它
2.简短的方法 :不写超大的方法
3.字段(成员变量):要么是在该文件的顶部,或紧接在使用它们的方法前面。
4.局部变量 :限制作用域
5.引入 :android;第三方按字母顺序排列;java(x)
6.缩进排版 :4个空格,没有制表符(tab)
7.行长度 :100个字符
8.字段命名 : 非公有的,非静态字段以m开头,静态变量以s开头 。
9.括号 :开括号不要独占一行
10.注解 :使用标准的注解。
11.Acronyms are words : Treat acronyms as words in names, yielding XmlHttpRequest , getUrl() , etc.
12.TODO的风格 :“TODO:在这里写描述”
13.一致性 :看看你周围的
14.日志记录 :小心日志记录,它开销很大。


Javatests样式规则

1. 测试方法的命名 :testMethod_specificCase是正确的



--------------------------------------------------------------------------------

Java语言规则

异常:不要忽视

有时很容易编写完全忽略异常的代码,比如:
 void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
    }
}
你绝对不能这样做。

虽然你可能认为你的代码永远不会遇到这个错误条件或处理它并不重要,忽略像上面的异常会在你的代码中给别人埋下地雷,迟早有一天会被绊倒。原则上,你必须在你代码中处理每一个异常。特殊的处理要视情况而定。


任何时候有人使用空的catch子句,他们应该有一个令人毛骨悚然的感觉。
有一定时候,它实际上是正确的事情,但至少你要想一想。在Java中你无法逃避的令人毛骨悚然的感觉。
- James Gosling

可接受的另外一个方案(为了性能考虑)是:

Throw the exception up to the caller of your method.
 void setServerPort(String value) throws NumberFormatException {
    serverPort = Integer.parseInt(value);
} 
# Throw a new exception that’s appropriate to your level of abstraction.
 void setServerPort(String value) throws ConfigurationException {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
        throw new ConfigurationException("Port " + value + " is not valid.");
    } 
# Handle the error gracefully and substitute an appropriate value in the catch {} block.
 /** Set port. If value is not a valid number, 80 is substituted. */
void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
        serverPort = 80;  // default port for server
    } 
# Catch the Exception and throw a new RuntimeException. This is dangerous: only do it if you are positive that if this error occurs, the appropriate thing to do is crash.
 /** Set port. If value is not a valid number, die. */
void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
        throw new RuntimeException("port " + value " is invalid, ", e);
    }

异常: 不要捕捉一般异常

有时候人们容易为了偷懒,在捕捉异常时会这样做:
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!
} 
你不应该这样做。

--------------------------------------------------------------------------------

Finalizers

它是什么: 当一个对象被垃圾回收时,Finalizers能够去执行某段代码。

优点: 可以方便清理,特别是外部资源。

缺点: 不能保证finalizer什么时候会调用,或甚至根本上没被调用。

--------------------------------------------------------------------------------

Imports

在imports使用通配符

它是什么 :当你想使用foo包中的Bar类,这有两种可能的方式导入它:
1.import foo.*;
2.import foo.Bar;

1#的优点 :大大减少了import声明的数目。

2#的优点 :很明显的看到哪些类实际在用,对于维护者而言,代码更具有可读性。

决定 :使用样式#2 import 所有的Android代码。

一个明确的例外是用于Java标准库(使用java.util .*,java.io. *,等等)和单元测试代码(junit.framework .*)。

--------------------------------------------------------------------------------


注释/Javadoc

所有的文件应该有一个在顶部版权声明。 然后紧接着是包和引入语气,每一块以空白行分隔。再下来是类或接口的声明。 在Javadoc注释,描述的类或接口的用途。
/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.internal.foo;

import android.os.Blah;
import android.view.Yada;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Does X and Y and provides an abstraction for Z.
 */
public class Foo {
    ...
} 
--------------------------------------------------------------------------------



简短的方法

这在一定程度上是可行的,方法应该保持小而直观的反应它的功能。然而得承认,长的方法有时是比较适当的,因此没有死限制放在方法的长度。如果一个方法超过40行,想想是否可以在没有危害程序结构上进行拆分。

--------------------------------------------------------------------------------

局部变量

局部变量的作用范围应保持最小( Effective Java Item 29)。这样,增加代码的可读性和可维护性,降低错误的可能性。

每个变量应该在最里面的代码块声明,括入变量的所有使用。 局部变量应该先声明后使用,尽量在声明局部变量的同时初始化。如果你还没有足够的信息来初始化变量,你应该推迟声明,直到你需要声明它的时候。
// Instantiate class cl, which represents some sort of Set
Set s = null;
try {
    s = (Set) cl.newInstance();
} catch(IllegalAccessException e) {
    throw new IllegalArgumentException(cl + " not accessible");
} catch(InstantiationException e) {
    throw new IllegalArgumentException(cl + " not instantiable");
}

// Exercise the set
s.addAll(Arrays.asList(args)); 
But even this case can be avoided by encapsulating the try-catch block in a method:
 Set createSet(Class cl) {
    // Instantiate class cl, which represents some sort of Set
    try {
        return (Set) cl.newInstance();
    } catch(IllegalAccessException e) {
        throw new IllegalArgumentException(cl + " not accessible");
    } catch(InstantiationException e) {
        throw new IllegalArgumentException(cl + " not instantiable");
    }
}
...
// Exercise the set
Set s = createSet(cl);
s.addAll(Arrays.asList(args)); 
Loop variables should be declared in the for statement itself unless there is a compelling reason to do otherwise:

循环变量应该for里面声明,除非有令人信服的理由不这样做:
for (int i = 0; i < n; i++) {
    doSomething(i);
}

for (Iterator i = c.iterator(); i.hasNext(); ) {
    doSomethingElse(i.next());
} 
--------------------------------------------------------------------------------

Imports
 


--------------------------------------------------------------------------------


缩进

我们使用4个空格作为块缩进。我们从不使用制表符(tab)。 如有疑问,请与你周围的代码保持一致。我们使用8个空格作为换行缩进,包括函数调用,赋值。

例如,这是正确的:
Instrument i
        = someLongExpression(that, wouldNotFit, on, one, line); 

这是不正确的:
 Instrument i
    = someLongExpression(that, wouldNotFit, on, one, line); 

域(Field)命名
■非公有,非静态字段命名以m开头。
■静态域命名以s开头。
■其他字段以小写字母开头。
■public static final 字段(常量) 全部大写,并用下划线连起来。

例如:
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;
} 



花括号

花括号没有独自一行,它们与它前面的代码占同一行,所以:
class MyClass {
    int func() {
        if (something) {
            // ...
        } else if (somethingElse) {
            // ...
        } else {
            // ...
        }
    }
} 
We require braces around the statements for a conditional. Except, if the entire conditional (the condition and the body) fit on one line, you may (but are not obligated to) put it all on one line. That is, this is legal:
 if (condition) {
    body; // 正确
}

if (condition) body; // 正确 

但是,这是不合规范的:
 if (condition)
    body; // 槽糕 


行长度

每一行代码中的文本应在最多100个字符。

There has been lots of discussion about this rule and the decision remains that 100 characters is the maximum.

例外:如果一个注释行包含一个示例命令或文字网址超过100个字符,该行可能会超过100个字符,方便于剪切与粘贴。

例外:import 行可以超过这个限制,因为人们很少见到他们.这也简化了书写工具。

Java 1.5的注解

Eclipse 代码格式化

你可以导入development/ide/eclipse下的文件,使得Eclipse按照Android代码风格规则。选择 “Window › Preferences › Java › Code Style,使用 “Formatter › Import” ,导入android-formatting.xml,”Organize Imports › Import” 导入 android.importorder.

eclipse tab 设置为4个空格:
Preferences -> General -> Editors -> Text Editors:
Insert spaces for tabs




If you enjoyed this post, make sure you subscribe to my RSS feed!
分享到:
评论

相关推荐

    Android代码风格指南

    Android代码风格指南,规范了android编程。

    最全面的 Android 编码规范指南.docx

    这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范。该文档仅供参考,只要形成一个统一的风格,见量知其意就可。

    android-code-style-guidelines-in-Korean:为贡献者翻译代码风格指南

    Android 开发者的代码风格指南下面列出的规则是严格的规则,而不是简单的指导方针或建议。 不遵守这些规则的 Android 项目的代码贡献通常不会被接受。 并非所有现有代码都符合这些规则,但预计新代码将遵循这些规则...

    安卓android指南针程序源代码

    Android指南针程序源代码代码介绍:指南针程序页面设计的很漂亮只在将它装进手机就不用担心会迷路了,而且源代码的代码风格还好,易读性可想而知非常。而且从代码中可以很容易明

    Android代码-Musicoco

    Android 手机本地音乐文件播放器,应用在单独的服务进程中控制音乐播放,目前以实现功能如下:通过耳机和通知栏快捷控制音乐播放、创建歌单、本地歌曲搜索、记忆播放、自动切换到夜间模式、定时停止播放、应用主题...

    Android 初学中阶高阶书籍_集合打包2

    Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,Android日历完整实现,Android摄像头的应 用,Android实现GPS定位,Android通过JNI调用驱动程序,Android网络开发详解,android写的google map api ...

    Android 初学中阶高阶书籍_集合打包3

    Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,Android日历完整实现,Android摄像头的应 用,Android实现GPS定位,Android通过JNI调用驱动程序,Android网络开发详解,android写的google map api ...

    Android代码-symphony

    界面风格老式,没有跟上时代发展的步伐 缺少创新、好玩的特性,缺少现代化的交互元素和用户体验 缺乏考虑实际运营需求,管理功能过于单一 细节不够精致、缺乏长期维护 客户案例 社区版: AIQ-机器学习 宽客网 ...

    Android程序设计基础

    该资料是《Android基础教程》的源代码 对应的书籍资料见: Android基础教程(你的第一本Android书) 基本信息 原书名: Hello, Android: Introducing Google's Mobile Development Platform 原出版社: Pragmatic ...

    自定义Android对话框风格

    兼容Holo风格和Android设计指南 只要改变一些颜色资源就能够改变所有对话框的风格 Same look for Android 2.2+ 与原生的Android DialogFragments有相同的API 使用SimpleDialogFragment 类,只要一行代码就展示一个...

    程序员面试刷题的书哪个好-CodeStyleGuidelines:代码风格指南

    Android启用Android的代码检查,在Filter里Exclude filter files中添加项目根目录下的findbugs-android-exclude.xml,这是需要跳过检查的文件配置。 Android Parcelable code generator 自动生成Parcelable接口实现...

    Android插件

    CheckStyle-IDEA 是一个检查代码风格的插件,比如像命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,你们可以遵从像Google Oracle 的Java 代码指南 ,当然也可以按照自己的规则来设置配置文件,从而有效...

    android-coding-standard

    官方 DBG Android 代码风格指南。 本风格指南概述了 DBG Android Team 的编码约定! 介绍 我们制作这个风格指南的原因是为了让我们的项目中的代码保持良好和一致——即使我们有许多不同的作者在每个项目上工作。 ...

    Android移动应用开发(第3版)卷Ⅰ基础篇 (Shane Conder, Lauren Darcey) PDF扫描版

    附录还包含了Android开发常用工具(模拟器、DDMS和Eclipse)的使用指南。  《Android移动应用开发(第3版)卷Ⅰ:基础篇》卷Ⅰ以及本书的卷Ⅱ,不仅适合Android应用程序开发人员阅读,还能为QA测试人员提供指导。另外,...

    android-coding-convention:Android 编码约定

    这个编码约定的第一部分直接取自谷歌提供的代码风格指南,我不声称它是我自己的工作! Java 语言规则 我们遵循标准的 Java 编码约定。 我们添加一些规则: 不要忽略异常 有时很想编写完全忽略这样的异常的代码: ...

    style-guides:蓝图的 Rails、Django、iOS 和 Android 风格指南

    风格指南 作为一个每学期都有多个新项目的成长型组织,保持良好的编码风格很重要,这样项目将可维护,我们的代码可重用。 这些指南分为相关规则的几个部分。 大多数规则都包含了基本原理; 如果不是,则假定原因很...

    JAVA人脸登录源码-java-style-guide:raywenderlich.com的官方Java风格指南

    我们创建了这个风格指南来保持我们教程中的代码一致。 我们的首要目标是简洁、易读和简单。 您还应该查看和样式指南。 灵感 这个风格指南是现有 Java 语言风格指南和以教程可读性为重点的 Swift 风格指南的混合体。 ...

    AWTK开发手册-AWTK开发实践指南-中文手册.pdf

    AWTK开发手册-AWTK开发实践指南-中文手册.pdf AWTK = Toolkit AnyWhere 随着手机、智能手表等便携式设备的普及,用户对 GUI 的要求越来越高,嵌入式系统对高性能、高可靠性、低功耗、美观炫酷的 GUI 的需求也...

    Conduit_Android_Kotlin

    我竭尽全力坚持最新的社区风格指南和最佳实践,但不得不在RealWorld规范和Medium.com的常规移动版式之间进行调整。 发展 该项目是使用 概念 该RealWorld应用尝试显示以下Android概念: 100%Kotlin代码库 MVVM...

Global site tag (gtag.js) - Google Analytics