`
kingbinchow
  • 浏览: 124802 次
  • 性别: 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代码风格通常遵循Google提供的Android ...

    (我认为的)Android代码风格

    此外,还可以参考Google的官方Android开发风格指南(Android Style Guide),它提供了更详细的编码规范,包括Java语言规范、XML规范以及项目的组织结构等。遵循这些规范能帮助开发者编写出更加专业且易于维护的代码...

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

    * 代码风格规范是为了让代码更加易于阅读和理解。 * 使用统一的编码风格,避免使用混乱的风格。 注释 * 注释是非常重要的,它可以帮助其他开发者快速了解代码的意图和实现。 * 使用 Java Doc 生成文档注释,以方便...

    Google Android 程序设计指南

    《Google Android程序设计指南》中的源码能帮助读者通过实践加深理解,通过分析和修改这些代码,可以更好地掌握Android开发的精髓。总之,Android程序设计是一门深度与广度兼具的技术,不断学习和实践才能成为一名...

    android 开发中文指南pdf

    3. 应用程序基础:Android应用基于Java语言开发,使用aapt工具打包应用程序资源和代码成为APK文件。APK文件是Android平台上用于分发和安装应用程序的文件格式。 4. 应用程序组件:介绍了Android应用中四大核心组件...

    Android编码规范指南.docx

    【Android编码规范指南】 在Android应用开发中,遵循一套统一的编码规范是非常重要的,它能够提高代码的可读性、可维护性和团队协作效率。这篇文档主要基于Google的Java编程风格,提供了Android编码的一些基本准则...

    Android代码-style简单学习应用示例.zip

    - Android开发中,Google提供了官方的Android代码风格指南,称为Android Studio的Android Lint工具,它能检查并提示代码中的风格问题。 2. **命名规范** - 类名:使用大驼峰命名法,如ActivityName、FragmentName...

    Android Studio使用指南中文版

    可以根据个人喜好和需求调整代码风格、快捷键、检查规则等设置,以提高开发效率和舒适度。 总之,Android Studio作为现代Android开发的首选工具,提供了全面的开发、调试和优化功能,让开发者能够高效地创建高质量...

    android开源项目指南

    此外,指南还为参与者提供了关于代码风格的指导,以确保代码的质量和一致性。 总的来说,Android开源项目指南是一个全面的资源,它不仅帮助开发者和维护者理解Android开源项目的理念和目标,还提供了实用的指导来...

    Android编程指南(中文)

    ### Android编程指南知识点详解 #### 一、应用程序基础 - Application Fundamentals **1. 关键类** Android 应用程序的基础构建块是一组核心类,它们定义了应用程序的行为和交互方式。 - **Activity**: Activity...

    android_code_style

    1. **代码风格指南**:Google为Android开发提供了一套官方的代码风格指南,称为"Android Code Style Guidelines"。这套指南包含了命名规范、注释规则、布局结构等方面的具体指导,例如类名应采用名词,变量名应清晰...

    Android中文开发指南

    Android是一个开放源代码的移动操作系统,它提供了丰富的API供开发者使用。本指南将详细介绍Android应用程序的基本概念和技术要点,特别适合初级开发者入门。 #### 二、应用程序基础 Android应用程序由一系列组件...

    Android-Android代码规范可在组内推行

    "Android-Code-Style-master"可能是一个包含Android代码风格指南和自动化工具的项目,它可能提供了用于检查和格式化代码的配置文件,例如`.editorconfig`和`.gradle`文件,以及可能的Android Lint规则定制。...

    Android Gradle用户指南

    ### Android Gradle 用户指南知识点详解 #### 一、Gradle构建系统概述 **目标与优势:** - **目标:** - **简化代码与资源复用:**Gradle旨在简化跨项目共享代码和资源的过程,使得开发人员能够更加高效地进行...

    android开发指南中文版

    ### Android开发指南中文版知识点详解 #### 应用程序基础 **关键类** 在Android开发中,有几个核心类是必须了解的,它们分别是`Application`、`Activity`、`Service`、`BroadcastReceiver`和`ContentProvider`。...

    Android代码-Android

    在Android开发领域,Android代码是构建应用程序的基础。这个压缩包“Android-master”很可能包含了某个Android项目的源代码,通常这样的命名代表这是一个GitHub仓库的主分支。接下来,我们将深入探讨Android开发中的...

    Android指南针程序

    【Android指南针程序】 在移动设备领域,Android操作系统以其开源性和强大的可定制性深受开发者喜爱。本项目专注于创建一个仿小米MIUI系统的指南针应用程序,旨在为用户提供精准、流畅的导航体验。指南针是户外活动...

Global site tag (gtag.js) - Google Analytics