Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Code style

Gabriel Lampa edited this page Apr 14, 2018 · 20 revisions

Como escrever código para este projeto

Índice


Geral

  • Palavras reservadas (if int while const typedef) são sempre seguidas de um espaço em branco;
    • Exeto para return quando a função é do tipo void.
  • Tipos de dados inteiros devem ser declarados no padrão do header stdint.h:
unsigned min - max signed min - max
uint8_t 0 a 255 int8_t -128 a 127
uint16_t 0 a 65535 int16_t -32768 a 32767
uint32_t 0 a 4294967295U int32_t -2147483648 a 2147483647
uint64_t 0 a 18446744073709551615 int64_t -9223372036854775808 a 9223372036854775807
  • Use char *var ao invés de char* var;

Variáveis

Variáveis locais

  • Como declarar variáveis:
    • Variáveis locais com nome em letras minúsculas;
    • Uma variável por linha;
      • Isso também se aplica para campos de struct e enum
    • Declarar a variável o mais próximo possível do seu uso.
  • Cada declaração deve ter apenas uma variável declarada nela.

DESEJADO:

int x;
int t;

INDESEJADO:

int x, y;

Variáveis globais

  • Como declarar variáveis globais:
    • Declare-a fora do escopo de qualquer função;
    • Funções com variáveis locais com mesmo nome de variáveis globais, dará preferência a variáveis locais;
    • Ao declarar uma função global, documente-a de forma adequada;
    • Use o sufixo _g.
  • Evite ao máximo adicionar variáveis globais ao projeto.

DESEJADO:

int global_g;

INDESEJADO:

int global;

↑ Índice

#define

Como declarar

#define é uma diretiva de pré-processador que gera uma constante

  • Como declarar #define:
    • Use sempre letras maiúsculas;
    • Sua sintaxe é: #define <CONSTANTE_NOME> <valor>;
    • A declaração deve ser feita no início do programa;
    • #define não precisa de ponto e vírgula.
  • #define para funções inline são bem vindas.

DESEJADO:

#define PI 3.14

INDESEJADO:

#define pi 3.14
#define PI 3.14;

#define código erro

  • Códigos de erro tem o prefixo E_:

Exemplo códigos de erro:

#define E_ISNULL -1
#define E_MALLOC -101
#define E_REALLOC -102
#define E_CALLOC -103
#define E_FREE -104

#define sentinelas

  • Como declarar sentinelas no headers:
    • Nome em letras maiúsculas;
    • prefixo INCLUIDO_ + NOME DO HEADER + sufixo _H .

Exemplo de sentinela:

#ifndef INCLUIDO_ERROS_H
#define INCLUIDO_ERROS_H

↑ Índice

struct

Este software da uma atenção especial as struct devido a sua importância.

Como declarar

  • Como declarar uma struct:
    • Nome com letras minúsculas;
      • Campos com nomes de <tag> devem ficar idênticos ao do Manual do Contribuinte (Quando aplicável);
    • Nome com sufixo _s;
    • Declaração sem typedef;
    • Campos com nomes idênticos ao do Manual do Contribuinte (Quando aplicável);
    • A grande maioria são do tipo opaco;
    • Um campo para cada linha;
    • Quando se faz necessário o uso do typedef, perde-se o sufixo _s e a primeira letra do nome é maiúscula.

DESEJADO:

struct endereco_s{
	const char *xLgr;
	const char *nro;
	const char *Cpl;
	const char *xBairro;
	uint32_t CEP;
	uint64_t fone;
	Municipio *municipio;
};

INDESEJADO:

struct Endereco_s{
	const char *xLgr;
	const char *nro;
	const char *Cpl;
	const char *xBairro;
	uint32_t CEP;
	uint64_t fone;
	Municipio *municipio;
};
struct endereco{
	const char *xLgr;
	const char *nro;
	const char *Cpl;
	const char *xBairro;
	uint32_t CEP;
	uint64_t fone;
	Municipio *municipio;
};

DESEJADO:

Endereco* NewEndereco();
static void _delPais(Pais *t);

↑ Índice

union

Como declarar

  • Como declarar um union:
    • Nome com letras minúsculas;
      • Campos com nomes de <tag> devem ficar idênticos ao do Manual do Contribuinte (Quando aplicável);
    • Nome com sufixo _u;
    • Declaração sem typedef;
    • A grande maioria são do tipo opaco;
    • Um campo para cada linha;
    • Quando se faz necessário o uso do typedef, perdesse o sufixo _u e a primeira letra do nome é maiúscula.
  • Campos com nomes de idênticos ao do Manual do Contribuinte (Quando aplicável);

DESEJADO:

union NFref_u{
	struct refNFe_s refNFe;
	struct refNF_s refNF;
	struct refNFP_s refNFP;
	struct refCTe_s refCTe;
	struct refECF_s refECF;
};

Identificando tipo

Usamos enum para identificar os tipos.

Exemplo

union NFref_u{
	struct refNFe_s refNFe;
	struct refNF_s refNF;
	struct refNFP_s refNFP;
	struct refCTe_s refCTe;
	struct refECF_s refECF;
};

enum TIPO_NOTA_E {
    NOTA_NFE = 0,
    NOTA_NF  = 2,
    NOTA_NFP = 3,
    NOTA_CTE = 4,
    NOTA_ECF = 9
};
struct nota_s{
    union NFref_u nota;
    enum TIPO_NOTA_E tipo;
};    

↑ Índice

enum

Como declarar:

  • Use letras maiúsculas;
  • Use o sufixo _E;
  • Não use typedef salva rara exceções;
  • Declare somente um valor por linha;
  • É permitido comentários /*comentário*/ entre os campos;
  • Declare-os preferencialmente nos headers;
  • Atribua valor sempre que possível.

EXEMPLO:

enum COD_UF_E {
	/* Regiao Norte*/
	UF_RONDONIA = 11,
	UF_ACRE = 12,
	UF_AMAZONAS = 13,
	UF_RORAIMA = 14,
	UF_PARA = 15,
	UF_AMAPA = 16,
	UF_TOCANTIS = 17,
	/*Regiao Nordeste*/
	UF_MARANHAO = 21,
	UF_PIAUI = 22,
	UF_CEARA = 23,
	UF_RIO_GRANDE_N = 24,
	UF_PARAIBA = 25,
	UF_PERNAMBUCO = 26,
	UF_ALAGOAS = 27,
	UF_SERGIPE = 28,
	UF_BAHIA = 29,
	/*Regiao Sudeste*/
	UF_MINAS_GERAIS = 31,
	UF_ESPIRITO_SANTO = 32,
	UF_RIO_JANEIRO = 33,
	UF_SAO_PAULO = 35,
	/*Regiao Sul*/
	UF_PARANA = 41,
	UF_SANTA_CATARINA = 42,
	UF_RIO_GRANDE_S = 43,
	/*Regiao Centro Oeste*/
	UF_MATO_GROSSO_S = 50,
	UF_MATO_GROSSO = 51,
	UF_GOIAS = 52,
	UF_DISTRITO_FEDERAL = 53
};

enum FORMA_PAGAMENTO_E {
	PAGAMENTO_AVISTA = 0,
	PAGAMENTO_PRAZO = 1,
	PAGAMENTO_OUTROS = 2
};

enum DOCUMENTO_MODELO_E {
	MODELO_NFE = 55,
	MODELO_NFCE = 65
};

Nomes

  • Use preferencialmente nomes compostos;
  • Deem nomes que fazem sentido.

EXEMPLO:

enum TIPO_OPERACAO_E {
	OPERACAO_ENTRADA = 0,
	OPERACAO_SAIDA = 1
};

↑ Índice

Funções

  • As funções que alocam e desalocam memória, precisa tratar desses ponteiros para evitar erros.
    • Verifique se malloc() retornou NULL;
    • Verifique se o ponteiro é NULL antes de chamar free();
    • strdup() pode falhar ao tentar alocar memória;
    • mencpy() falha se passado um ponteiro nulo;
  • Funções devem ter seu tipo e modificadores declarados na mesma linha que seu nome;
  • Funções são sempre UpperCamelCase;
  • Funções com o modificador de escopostatic são prefixada com _lowCamelCase.

Gets e Sets

  • Funções UpperCamelCase;
  • Funções com o prefixos Get ou Set seguido do nome do campo;
  • Em sua maioria, funções Gets e Sets tem visibilidade para todo o projeto.

EXEMPLO:

static void _delYoda();
unsigned int SetCEP(Endereco *end, unsigned int c);
unsigned int GetCEP(Endereco *end);

News e Dels

  • Funções UpperCamelCase;
  • Funções com o prefixos New ou Del seguido do nome do Objeto;
    • Prefixo _del ou _new somado ao nome do objeto para funções com static;
  • Visibilidade dessas funções nem sempre disponível para todo o usuário.

EXEMPLO:

Endereco *  NewEndereco(void);
void DelEndereco(Endereco *t);
unsigned int SetCEP(Endereco *end, unsigned int c);
unsigned int GetCEP(Endereco *end);

↑ Índice

Estruturas de decisão

if

  • Não chame funções dentro de if;
  • Condições de Yoda não devem ser usadas:
  • Sempre usar { } mesmo para uma só instrução.

DESEJADO:

int rc;
rc = foo();
	if (rc){
		/*Código aqui*/
	}

DESEJADO:

	if (foo()){
		/*Código aqui*/
	}

if-else

  • Indentar else alinhado com if;
  • Sempre usar { } no elsemesmo para uma só instrução.

DESEJADO:

	if (foo()){
		/*Código aqui*/
	}else {
		/*Mais código aqui*/
	}

switch case

  • Sempre que possível, colocar default;
  • Não se esqueça de break;
  • A instrução switch deve ser escrita como no exemplo:

DESEJADO:

 switch (var){
	case 1:
		foo();
		i++;
		break;
	case 2:
		bar();
		--i;
		break;
	default:
		x++;
};

ternário ?

  • Use com parcimônia;
  • Sempre em uma única linha.

DESEJADO:

#define free_memory(p) (p == NULL ? p : free(p))

↑ Índice

Estruturas de repetição

for

  • Expressões, entre parênteses, devem ser separadas por espaço após o ponto-e-vírgula;
  • Para compatibilidade e portabilidade declare o contador fora da instrução;
  • Sempre usar { } mesmo para uma só instrução.

DESEJADO:

for (i=0; i<10; i++){
	foo();
}

while

  • A instrução while deve ser escrita como no exemplo:

DESEJADO:

  while ( x < 10 ) { 
      printf( "%d\n", x );
      x++;             
  }

do while

do {
} while ( condição );

↑ Índice

como documentar

↑ Índice