Skip to content

Instantly share code, notes, and snippets.

@fdoliv
Last active June 1, 2019 00:52
Show Gist options
  • Save fdoliv/bbbc0bf7caff0654e5cfc52012de4899 to your computer and use it in GitHub Desktop.
Save fdoliv/bbbc0bf7caff0654e5cfc52012de4899 to your computer and use it in GitHub Desktop.

Boas Práticas de desenvolvimento Android

Esta página tem por objetivo reunir as boas práticas para o desenvolvimento Android, para garantir uma melhor legibilidade do código. De maneira geral, um código legível é objetivo, simples e de fácil compreensão, não possui duplicidades, é eficiente e faz apenas o que é proposto. Para auxiliar na busca por este resultado, a seguir serão descritas boas práticas que visam a criação de um código fonte de qualidade. Ele é utilizado pela equipe de desenvolvimento, com o propositório de padronizar e manter uma melhor qualidade de código.

Grande parte deste material é baseado nos padrões da plataforma Android, descritos no Android Open Source Project Code Style

Idioma de desenvolvimento


Todo o código deverá ser desenvolvido em português, salvo o uso de bibliotecas escritas em outro idioma e padrões de escrita de alguns arquivos descritos logo abixo. Esse padrão tem como objetivo facilitar o entendimento do código por todos, já que o português é a língua nativa dos integrantes do grupo.

Indentação do Código


O tamanho da indentação será o valor default configurado no Android Studio (4 espaços). Ainda em relação à indentação, é importante que todo o código alinhado esteja indentado, assim como as quebras de linhas longas. Em relação ao comprimento das linhas, fica definido o comprimento de demarcação do Android Studio (100 caracteres).

Nomes das Classes, Variáveis e Constantes


Criar nomes expressivos, que digam exatamente o que o elemento faz ou porque ele existe.

Convenção de nomeação de Campos


Os nomes de campos não públicos e não estáticos começam com m:

private int mPrivado;

Os nomes dos campos estáticos começam com s:

private static MinhaClasse sSingleton;

Os campos finais públicos estáticos (constantes) são escritos com todas as letras maiúsculas, com palavras separadas com underlines

public static final int SEGREDO_DA_VIDA_UNIVERSO_E_TUDO_MAIS = 42;

Outros campos começam com uma letra minúscula:

 public int variavelPublica;

Comentários e Documentação


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

   /**
     * Realiza o backup de uma base de dados local. Obtém os dados do dispositivo e
     * faz a cópia em seu cartão de memória.
     * @param context
     * @throws IOException
     */
    public static final void backupBancoDados(Context context) throws IOException {

        File origem = new File("/data/data/" + context.getPackageName() + "/databases/", "backUP.db");
        File destino = new File(Environment.getExternalStorageDirectory(), FILE);
        org.apache.commons.io.FileUtils.copyFile(from, to);
    }

Lembrando que o nome e o conteúdo de um método devem tornar o uso dos comentários desnecessário.

Escrita de Métodos


Sempre que possível, procure escrever métodos pequenos e focados. O método não deve fazer mais do que ele se propõe a fazer. Se um método exceder 40 linhas ou mais, pense se ele pode ser quebrado em outro(s) métodos sem prejudicar a estrutura do programa.

Declaração de Variáveis


Declare as variáveis na parte superior do arquivo ou imediatamente antes do método que a utiliza.

As variáveis ​​locais devem ser declaradas no ponto em que são usadas pela primeira vez. Todas as declarações de variável local devem conter um inicializador.

As variáveis ​​de loop devem ser declaradas na declaração for, a menos que haja um bom motivo para fazer o contrário:

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

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

Utilização de Chaves


Procure sempre utilizar chaves para indicar blocos de código.

class MinhaClasse {
    int funcao() {
        if (algo) {
            // faz algo...
        } else {
            // faz outra coisa...
        }
    }
}

Caso a estrutura condicional (condição e corpo) caibam em uma mesma linha, você pode (mas não é obrigado a faze-lo) colocar tudo em uma linha. Estes códigos serão aceitáveis:

if(condicao){
    corpo();
}

if(condicao) corpo();

Mas esse tipo de código é uma má prática:

if(condicao)
    corpo();

Utilização de Anotações


Quando as anotações são aplicadas a uma classe, método ou construtor, eles são listados após o bloco de documentação e devem aparecer como uma anotação por linha

/**Este é o bloco de documentação da classe */
@AnotacaoA
@AnotacaoB
public class MinhaClasse { }

As anotações que se aplicam as variáveis/atributos devem estar listadas na mesma linha e imediatamente antes da declaração da variável, a menos que a linha atinja o comprimento máximo.

@Nullable @Mock 
DataManager dataManager; 

Nomeação de Pacotes


O nome do pacote principal deve ser nomeado como o seguinte padrão: com.<nome da empresa ou entidade>.<nome do projeto> e.g. br.com.exemplo.projetox

Nome do Pacote Descrição
activities Contém todas as activities
adapters Contém todas as classes para adapters customizados
animations Contém todas as animações customizadas
database Contém todas o material relacionado ao banco de dados
dialogs Contém todas as dialogs ou dialog fragments customizados
fragments Contém todas as classes do tipo fragments
http Contém todas os adapters ou configurações de rede
services Contém todas as interfaces não relacionadas a rede
utils Contém todas as classes de auxilio e utilidades

Nomeação de Classes


Nomes de Classes são escritas no padrão CamelCase Para classes que estendem um componente Android, o nome da classe deve terminar com o nome do componente; por exemplo: SignInActivity, SignInFragment, ImageUploaderService, ChangePasswordDialog.

Arquivos de Layout


Os arquivos de layout devem corresponder ao nome dos componentes do Android para os quais eles se destinam, iniciando o nome com o tipo do componente. Por exemplo se criarmos um layout para a classe EntrarActivity, o nome do arquivo de layout deve ser activity_entrar.xml.

Componente Nome da Classe Nome do Arquivo de Layout
Activity PerfilUsuarioActivity activity_perfil_usuario.xml
Fragment EntrarFragment fragment_entrar.xml
Dialog MudarSenhaDialog dialog_mudar_senha.xml
AdapterView item --- item_pessoa.xml
Content layout --- Content_status.xml

Um caso ligeiramente diferente é quando criamos um layout que será inflado por um Adapter, por exemplo, para preencher um ListView. Nesse caso, o nome do layout deve começar com item_.

Veja que existem casos em que essas regras não serão possíveis de aplicar. Por exemplo, ao criar arquivos de layout que se destinam a fazer parte de outros layouts. Neste caso, você deve usar o prefixo content_.

Arquivos de Definição de Valores

Arquivos de recursos na pasta res\values são definidos no plural por exemplo: strings.xml - Strings Localizáveis styles.xml - Contém todos os temas, Estilos de Layout colors.xml - Lista de Cores dimens.xml - Dimensões utilizadas nos layouts config.xml - Guarda informações para configurar o projeto (urls, chaves de APIS)

Fechamento de TAGs

Quando um elemento XML não tem nenhum conteúdo, você deve usar tags de auto-fechamento

Esta é uma boa prática:

<TextView
	android:id="@+id/text_view_profile"
	android:layout_width="wrap_content"
	android:layout_height="wrap_content" />

Esta é uma má prática :

<!-- Não faça isso! -->
<TextView
    android:id="@+id/text_view_profile"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
</TextView>

Nomeando identificadores no Layout XML / Declaração de Variáveis de Elementos de Exibição


Quando for criar identificadores nos arquivos de layout ou declarar variáveis do tipo de elementos de exibição, sempre tome o acrônimo do elemento como prefixo do identificador ou do nome da variável, por exemplo, TextView = tv.

Elemento Acrônimo Exemplo
TextView tv tvTexto
ImageView iv ivImagem
Button btn btnEnviar
RadioButton rb rbSelecione
EditText et etPalavras
Spinner spinner spinnerSecione
ListView lv lvLista

strings.xml


Os nomes das strings começam com um prefixo que identifica a seção a que pertencem.

Prefixo Descrição
app_ Uma mensagem ou texto geral do app
error_ Uma mensagem de erro
success_ Uma mensagem de sucesso
caps_ Uma mensagem em CAPSLOCK
required_ Indica um requisito para um campo
info_ Uma mensagem de informação
title_ Um título
action_ Uma ação como "salvar" ou "Criar"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment