Udacity Nanodegree Desenvolvedor Android - Orientações de Estilos Java

Introdução

Estas orientações de estilo funcionam como o guia oficial para seguir nos seus projetos. Para um conjunto de regras mais detalhado, veja este link. Estas são regras muito estritas seguidas no mundo de desenvolvedores Android.

Antes que você veja as orientações de Linguagem e Estilo abaixo, lembre-se de SER CONSISTENTE. Orientações de estilo são usadas para ter um vocabulário comum de codificação.

Regras da Linhagem Java

Não Ignore Excessões

Você deve lidar com todas as Exceções no seu código de alguma forma com princípios. A manipulação específica varia de acordo com o caso.

void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) { }
}

Jogue a exceção até o chamador de seu método.

void setServerPort(String value) throws NumberFormatException {
    serverPort = Integer.parseInt(value);
}

Jogando uma nova excessão é o jeito apropriado para seu nível de abstração.

void setServerPort(String value) throws ConfigurationException {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
        throw new ConfigurationException("Port " + value + " is not valid.");
    }
}

Manuseie o erro graciosamente e substitua um valor apropriado no bloco catch {}.

/** Definir a porta. Se o valor não for um número válido, substituir por 80. */
void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
        serverPort = 80;  // default port for server 
    }
}

Não pegue Exceções Genéricas

É inapropriado capturar Excepção genérica ou Throwable, preferivelmente não Throwable, porque inclui exceções do erro também. É muito perigoso. Isso significa que exceções que você nunca esperava (incluindo RuntimeExceptions como ClassCastException) acabam sendo pegas no tratamento de erros no nível do aplicativo. Obscure as propriedades de processamento de falhas do seu código.

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!
}

Qualificar Totalmente as Importações

import foo.*;
import foo.Bar;

Isso torna óbvio quais classes são realmente usadas. Torna o código Android mais legível para os mantenedores.

Não Use Finalizadores

Finalizadores são uma maneira de ter um pedaço de código executado quando um objeto é coleta de lixo.

Na maioria dos casos, você pode fazer o que você precisa de um finalizador com um bom tratamento de excessão. Se você precisar absolutamente dele, defina um método close() (ou similar), imprima uma mensagem curta de log do finalizador e documente exatamente quando esse método precisa ser chamado.

Java Style Rules

Comentários Padrão Javadoc

Cada arquivo deve ter uma declaração de direitos autorais na parte superior. Em seguida, uma declaração de pacote e instruções de importação devem seguir. Cada bloco é separado por uma linha em branco. Finalmente, há a declaração de classe ou interface. Nos comentários Javadoc, descreva o que a classe ou interface faz.

/*
 * Copyright (C) 2013 The Android Open Source Project
 */

package com.android.internal.foo;

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

/**
 * Does X and Y and provides an abstraction for Z.
 */

public class Foo {
    ...
}

Cada classe e método público não trivial que você escrever deve conter um comentário Javadoc com pelo menos uma frase descrevendo o que a classe ou método faz. Certifique-se de começar com um verbo descritivo na terceira pessoa.

/** Retorna a raiz quadrada positiva corretamente arredondada de um valor double. */
static double sqrt(double a) {
    ...
}

OU

/**
 * Constructs a new String by converting the specified array of 
 * bytes using the platform's default character encoding.
 */
public String(byte[] bytes) {
    ...
}

Você não precisa escrever o Javadoc para métodos triviais de get e set.

O Android não impõe atualmente um estilo específico para escrever comentários Javadoc, mas você deve seguir as instruções em Como escrever comentários Doc para a ferramenta Javadoc (conteúdo em Inglês).

Limite o Escopo da Variável

O escopo das variáveis locais deve ser mantido no mínimo. Isso aumenta a legibilidade e a capacidade de manutenção do código e reduz a probabilidade de erros.

Cada variável deve ser declarada no bloco mais interno que incluir todas as utilizações da variável.

Cada declaração de variável local deve conter um inicializador (se você não tiver informações suficientes para inicializar, você pode adiar isso).

As variáveis de loop devem ser declaradas na instrução for, a menos que exista uma razão convincente para fazer o contrário:

for (int i = 0; i < n; i++) {
    doSomething(i);
}

Ordene Declarações de Import

A ordem das declarações de importação é:

  1. Imports do Android
  2. Imports de terceiros (com, junit, net, org)
  3. Imports java e javax

Para corresponder exatamente às configurações IDE, as importações devem ser:

As importações estáticas podem ser um pouco complicadas. Pode ser intercalado com as importações restantes ou abaixo de todas as outras importações. Deixamos isso a julgamento. Seja consistente.

Use Espaços para Indentação

Usamos 4 espaços para blocos. Nunca usamos guias. Em caso de dúvida, seja consistente com o código ao seu redor.

Usamos 8 recuos de espaço para envoltórios de linha, incluindo chamadas de função e atribuições.

Instrument i =
    someLongExpression(that, wouldNotFit, on, one, line);
Instrument i =
        someLongExpression(that, wouldNotFit, on, one, line);

Siga as Convenções de Nomenclatura de Campos

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;
}

Usar Estilo de Chaves Padrão

Chaves não tem sua própria linha; Elas começam na mesma linha que o código antes dela.

class MyClass {
    int func() {
        if (something) {
            // ...
        } else if (somethingElse) {
            // ...
        } else {
            // ...
        }
    }
}

Exigimos chaves em torno das declarações para um condicional. Exceto, se todo condicional ( condição e o corpo) se encaixam em uma linha, você pode (embora não seja obrigado) colocar tudo em uma linha.

if (condition)
    body();  // bad!
if (condition) {
    body();
}

and

if (condition) body();

Use Comentários TODO

Use comentários TODO para o código que é temporário, uma solução de curto prazo, ou bom o suficiente, mas não perfeito.

TODOs devem incluir a string TODO totalmente em maiúscula, seguido de dois pontos:

// TODO: Remove this code after the UrlTable2 has been checked in.

and

// TODO: Change this to use a flag instead of a constant.

If your TODO is of the form "At a future date do something" make sure that you either include a very specific date ("Fix by November 2005") or a very specific event ("Remove this code after all production mixers understand protocol V7.").

Trate Acrônimos como Palavras

Trate siglas e abreviações como palavras em variáveis de nomeação, métodos e classes. Desta forma, os nomes são muito mais legíveis.

XMLHTTPRequest
getCustomerID();
class HTML{}
String URL;
long ID; 
XmlHttpRequest
getCustomerId();
class Html{}
String url;
long id; 

Evite Usar Números Mágicos

Um número mágico é um valor codificado que pode mudar em uma etapa posterior, mas que pode ser, portanto, difícil de atualizar.

public class Foo {
    public void setPin(String pin) {
         // don't do this
         if (pin.length() > 4) {
              throw new InvalidArgumentException("pin");
         }
    }
}

Certifique-se de refatorar o código acima definindo uma constante numérica para armazenar o valor do tamanho do pino. NOTA: Defina constantes numéricas como final

public class Foo {
    public static final int MAX_PIN_SIZE = 4;
    public void setPin(String pin) {
         if (pin.length() > MAX_PIN_SIZE) {
              throw new InvalidArgumentException("pin");
         }
    }
}

Usar Anotações Padrão Java

As anotações devem preceder outros modificadores para o mesmo elemento de linguagem. As anotações de marcador simples (por exemplo, @Override) podem ser listadas na mesma linha com o elemento de idioma. Se houver várias anotações ou anotações parametrizadas, elas devem ser listadas uma por linha em ordem alfabética.

As práticas padrão do Android para as três anotações predefinidas em Java são:

Limitação de Log

Enquanto o Log é necessário, ele tem um impacto significativamente negativo sobre o desempenho e rapidamente perde sua utilidade se não for mantido razoavelmente conciso.

Definir Campos em Locais Padrão

Os campos devem ser definidos na parte superior do arquivo ou imediatamente antes dos métodos que os utilizam.

Escreva Métodos Curtos

Os métodos devem ser mantidos pequenos e focados. Embora não haja limite rígido no comprimento do método, pense se as definições de métodos que vão acima de 40 linhas podem ser quebradas sem prejudicar a estrutura do programa.

Limite o Tamanho da Lina

Cada linha de texto no seu código deve ter no máximo 100 caracteres.

Se uma linha de comentário contém um comando de exemplo ou um URL literal com mais de 100 caracteres, essa linha pode ter mais de 100 caracteres para facilidade de recortar e colar.

Linhas de importação podem ultrapassar o limite porque os humanos raramente os vêem. Isso também simplifica a escrita da ferramenta.