Coding standard rápido para javascript
Manter um estilo consistente ao escrever código pode ser um fator decisivo para a manutenibilidade de um sistema por uma grande equipe, principalmente se o projeto for Open Source. Nesse artigo vou mostrar o padrão usado em meus projetos.
Esse coding standard foi inspirado em alguns scripts de código aberto que utilizei, assim como diretrizes de Douglas Crockford, Google, W3Schools. Se for segui-lo, recomendo que comece em seu próximo projeto ou, caso inicie agora mesmo, pense em refator seu projeto atual para evitar colisão entre os estilos.
##Nomeação
- variáveis, funções, propriedades, métodos e namespaces com lowerCamelCase: nomeDaCoisa
- classes com UpperCammelCase: NomeDaClasse
- callback inicia com on: onMeuCallback
- arquivos: nomedoarquivo.js
####Exemplo de nomeação
nomedomeuarquivo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var nomeDoMeu.novoNamespace; // namespace
var nomeDaMinhaVariavel; // variável
// função
function nomeDaMinhaFuncao() {
// ...
}
// classe
function NomeDaMinhaClasse() {
var nomeDaMinhaPropriedadePrivada; // propriedade privada
this.nomeDaMinhaPropriedadePublica; // propriedade pública
// método privado
var nomeDoMeuMetodoPrivado = function () {
// ...
}
// método público
this.nomeDoMeuMetodoPublico = function () {
// ...
}
}
// handler de evento
function onNomeDoMeuCallback() {
// ...
}
##Declaração
- sempre declarar uma variável ou função antes de usá-la
- tentar declarar uma variável próxima do contexto em que será usada
- sempre declarar variáveis não-globais depois de var, até mesmo quando estiver no escopo global
####Exemplo de declaração
1
2
3
4
var animal = 'Cavalo';
var corre = function () {
console.log(animal + ' correndo');
}
##Estruturas de controle
- sempre usar um espaço entre os parênteses
- sempre colocar a(s) chave(s) na mesma linha da declaração
- sempre alinhar a(s) chave(s) de fechamento com a declaração
####Exemplo de estruturas de controle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
if (condicao) {
// ...
} else if (condicao) {
// ...
} else {
// ...
}
switch (expressao) {
case n:
// ...
break;
case n2:
// ...
break;
default:
// ...
}
for (inicializacao; condicao; atualizacao) {
// ...
}
while (condicao) {
// ...
}
do {
// ...
} while (condicao);
try {
// ...
} catch (var) {
// ...
} finally {
// ...
}
##Formatação
- sempre usar 4 espaços para indentar
- tentar não ultrapassar 80 caracteres em uma linha. Se ultrapassar, pule para a próxima linha inserindo 4 espaços de indentação
- jamais usar parênteses em operadores unários, como
delete
,typeof
evoid
ou depois de keywords, comoreturn
,throw
,case
,new
. - sempre usar aspas simples
- sempre agrupar blocos de código relacionados, separando-os por uma linha em branco
- sempre terminar uma expressão com
;
- objetos e arrays maiores que 3 elementos ou que ultrapassem os 80 caracteres devem ter um valor por linha
- funções e métodos anônimos devem ter os parênteses separados do nome e da abertura de chaves
###Whitespace
- sempre colocar operadores binários
+, -, *, /, %
, etc. entre espaços - nunca colocar operadores
.
unários entre espaços
####Exemplo de formatação
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function MeusAlimentos () {
var foo = 'fooFruta';
var fooArray = ['maçã', 'banana', 'tomate'];
var bar = 'barVegetais';
var barArray = [
'pimentão',
'brócoli',
'pepino',
'alface',
'acelga'
];
var fooObjeto = {
'nome': 'X-Salada Gorduroso',
'ingredientes': [
{'nome': fooArray[2], 'unidade': 'rodela', 'quantidade': 2},
{'nome': barArray[4], 'unidade': 'folha', 'quantidade': 1},
{'nome': 'hamburguer', 'unidade': 'und.', 'quantidade': 1},
{'nome': 'queijo', 'unidade': 'g', 'quantidade': 80},
],
'preco': 3.50,
'lucroPercentual': 80,
'vendasTotais': 1495
}
this.comidaSaudavel = function () {
return fooArray.join(barArray);
}
this.junkieFood = function () {
return fooObjeto;
}
}
Arquivos
- sempre usar a extensão .js
- importar com
<script src='nomedomeuarquivo.js'>
sempre que possível no fim do body e sem usar o atributotype
, pois quem define o MIME Type é o backend. Esse atributo apenas é usado para o navegador saber se pode manipular o arquivo requisitado antes mesmo de fazer uma requisição ao servidor.
Comentários
Somente use comentários para informações relevantes. Tente ser breve e explicativo, sempre! Pense em frases que você consiga entender, mesmo lendo daqui há 10 anos. Um leve toque de humor pode fazer bem, a não ser que você esteja comentando um hard real time system (o que talvez provavelmente não irá acontecer com javascript).
Bônus
- sempre inicie objetos com
{}
e arrays com[]
- sempre use
===
e!==
para evitar problemas com tipos
Por hora, esses são meus coding standards. Com o tempo poderei mudar ou incluir novos standards, caso veja que que esses não sejam sustentáveis. Aproveitem para dar feedback e também compartilhar seus coding standards.
fontes: