阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 1197|回复: 0

[转帖] Android编程风格

[复制链接]
  • TA的每日心情
    开心
    2012-3-7 10:15
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2012-1-6 10:27:40 | 显示全部楼层 |阅读模式
    基本规范

            异常
          
            1, 尽量不要使用try catch捕获异常,而是显式的抛出一个异常。
            2, 使用try catch 一定要在catch语句中做好相应的处理,不能留空。
            3, 不要捕获Exception类型的异常

    Java代码:
     
     privatefinalHandlermAttachmentEditorHandler=newHandler(){
      
      @Override
      publicvoidhandleMessage(Messagemsg){
      
      switch(msg.what){
      
      caseAttachmentEditor.MSG_EDIT_SLIDESHOW:{
      
      try{//'''不要使用trycatch'''
      
      editSlideshow();
      
      }catch(Exceptione){//不要在这里捕获基类Exception
      
      //这里留空非常危险,一旦出错,根本找不到
      
      }
      
      break;
      
      }
      
      caseAttachmentEditor.MSG_SEND_SLIDESHOW:{
      
      
      if(isPreparedForSending()){
      
      ComposeMessageActivity.this.confirmSendMessageIfNeeded();
      }
      
      break;
      }

           为什么不要使用try catch?

           我们应该对于如何划分异常的层次有一个理解,对于完全已知的错误,结合逻辑编写处理这种错误的代码,自己无法处理的,继续向上抛出,增加程序的鲁棒性,但是如果你根本不确定报出什么异常,请不要这样做。

           为什么要声明方法抛出异常?
            方法是否抛出异常与方法返回值的类型一样重要。假设方法抛出异常确没有声明该方法将抛出异常,那么客户程序员可以调用这个方法而且不用编写处理异常的代码。那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决。
            为什么不要捕获Exception类异常?

            Exception
    分为两类:unchecked(RuntimeException 和 error) & checked,因为RuntimeException这种由于程序本身错误导致的异常,是程序员的问题。你catchException,意味着子类RuntimeException也被catch了。

            在catch中可以做什么?

            1,赋默认值
            2,做一些错误处理
            3,抛出一个自己封装的异常类对象

            在catch中不可以做什么?

            1,抛出一个RuntimeException。(除非你认为你的程序除了崩掉重启别无他法,否则别这么做)

            finally

            finally
    这个关键字很不好用,因为我们根本无法确定什么时候他会执行,是return之前还是之后?没人知道。除非你要对外部资源进行一些收尾,比如使用InputStream,你要close。否则,不要用它。

            引入

            1,引用顺序:android,三方按字母表,java(x) (这是一个graceful的问题)
            2,引用方式:一定要引全类名,不要引用整个包。

    Java代码:
     
     importsfoo.Bar;//right
      
      importsfoo.*;//wron

           注释

           新加代码要求如下:

           1,CopyRight Statement,声明结束后空一行写代码(非必须)
           2,每个类都要有描述注释
           3,方法一定要写注释描述功能,参数,返回值,重要的变量要有注修改源码要求如下:

    解释修改原因

    Java代码:
      /*
      
      *Copyright(C)2010TheAndroidOpenSourceProject
      
      *LicensedundertheApacheLicense,Version2.0(the"License");
      
      *youmaynotusethisfileexceptincompliancewiththeLicense.
      
      *YoumayobtainacopyoftheLicenseat
      
      *
      
      *http://www.apache.org/licenses/LICENSE-2.0
      
      *Unlessrequiredbyapplicablelaworagreedtoinwriting,software
      
      *distributedundertheLicenseisdistributedonan"ASIS"BASIS,
      
      *WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
      
      *SeetheLicenseforthespecificlanguagegoverningpermissionsand
      
      *limitationsundertheLicense.
      
      */
      
      
      packageeoe.android.internal.foo;
      
      importandroid.os.Blah;
      
      importandroid.view.Yada;
      
      importjava.sql.ResultSet;
      
      importjava.sql.SQLException;
      
      /**
      
      *DoesXandYandprovidesanabstractionforZ.
      
      *@authorJackyYang
      
      */
      
      publicclassFoo{
      
      ...
      
      }

           方法

           方法一定要短小精悍,功能专注,不要试图把一个大的功能放在一个方法中实现。

           局部变量

           局部变量的作用域一定要最小化,即什么时候用,什么时候声明,不要提前声明了很多变量,但是最后才用。

           缩进
           代码块缩进4字符,不要用tab

    Java代码:
      publicvoidpay(){
      
      //这里空了4字符
      
      }

            换行缩进8字符,不要用tab

    Java代码:
     
     Instrumenti=someLongExpression(that,wouldNotFit,on,one,line)

             成员变量

             1,静态的变量以s开头
             2,非静态,非公开变量以m开头
             3,静态常量 全部大写
             4,成员变量定义在类的开始,或者在使用成员变量的方法之前声

    Java代码
      publicclassMyClass{
      
      publicstaticfinalintSOME_CONSTANT=42;
      
      publicintpublicField;
      
      privatestaticMyClasssSingleton;
      
      intmPackagePrivate;
      
      privateintmPrivate;
      
      protectedintmProtected;

           括号 { }


           使用规则只有两种:

    Java代码:
     
     if(condition){
      
      body();//标准
      
      }
      if(condition)body();//如果只有一条语句,也可以这样

           代码行长度

           代码行长度不超过100字符

           注解

           1,注解离方法最近
           2,一般不要使用SuppressWarning,要使用的话,请加上TODO注释

    Java代码:
     
     //TODO:Thethird-partyclasscom.third.useful.Utility.rotate()needsgenerics
      
      @SuppressWarnings("generic-cast")
      
      List<String>blix=Utility.rotate(blax)

            调试规范

             Log的使用


            1,在调试中,非常鼓励大家使用log查找问题,但是问题结束后,在check in之前,一定要确定你的代码注释已经关闭。
            2,Log的级别要视情况而定,不要随便使用Log.e
            3,代码要使用规范的TAG和调试开关,方便以后使

    Java代码:
      privatestaticfinalbooleanDBG=true;
      
      privatestaticfinalStringTAG="MediaScanner";
      
      if(DBG){
      
      Log.d(TAG,"debuginfo");
      
      }

           测试

           在正规开发中,一定要有测试的环节,android有自己一套测试的工具

    Java代码:
      //标准的testcase
      
      publicclassLaunchTestextendsAndroidTestCase{
      
      testInterceptSendSms(){//格式:testMethod_specificCase1如果没有case,那就直接写testMethod,如果没有具体方法而是测的功能,那就直接写功能名,testCompose
      
      //但是更多的还是方法级的测试
      
      }
      
      //测试Activity
      
      publicclassInterceptSendMmsextendsActivityInstrumentationTestCase2<ComposeMessageActivity>{
      
      testInterceptSendSms(){//格式:testMethod_specificCase1如果没有case,那就直接写testMethod
      
      }
      
      }

    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表