|
| 1 | +## Formatação {#sec:notation} |
| 2 | + |
| 3 | +Neste livro, nós tentamos manter a formatação de código-fonte o mais consistente possível. |
| 4 | +Isto permite uma melhor leitura e escrita de código-fonte. |
| 5 | +Definimos o padrão de formatação em três partes. |
| 6 | + |
| 7 | +### Julia Style Guide |
| 8 | + |
| 9 | +Primeiramente, nós tentamos aderir as convenções do [Julia Style Guide](https://docs.julialang.org/en/v1/manual/style-guide/). |
| 10 | +Mais importante, escrevemos funções e não scripts (veja também @sec:engineering). |
| 11 | +Além disso, usamos convenções de nomenclatura consistente com o módulo `base` de Julia: |
| 12 | + |
| 13 | +- Uso de _camelcase_ para módulos: `module JuliaDataScience`, `struct MyPoint`. |
| 14 | + (Note que a denominação de _camelcase_ é porque a capitalização das palavras, tais como "iPad" ou "CamelCase", faz com que a palavra se assemelhe que nem as costas de um camelo.) |
| 15 | +- Denominação de funções usando caixa baixa (_lowercase_) e separando palavras por _underline_ (`_`). |
| 16 | + Também é permitido omitir o separador quando nomeando funções. |
| 17 | + Por exemplo, estes nomes de funções são consistentes com as convenções: `my_function`, `myfunction` e `string2int`. |
| 18 | + |
| 19 | +Adicionalmente, evitamos usar parênteses em condicionais, ou seja, escrevemos `if a == b` ao invés de `if (a == b)` e usamos 4 espaços para cada nível de indentação. |
| 20 | + |
| 21 | +### BlueStyle |
| 22 | + |
| 23 | +O [Blue Style Guide](https://github.com/invenia/BlueStyle) adiciona diversas convenções aos padrões do Guia de Estilo de Julia. |
| 24 | +Algumas dessas regras podem soar pedantes, mas descobrimos que elas fazem o código ficar mais legível. |
| 25 | + |
| 26 | +Do Blue Style Guide, nós aderimos especificamente à: |
| 27 | + |
| 28 | +- No máximo 92 caracteres por linha em código-fonte (para arquivos Markdown, linhas mais longas são permitidas). |
| 29 | +- Quando carregando código com `using`, usar apenas uma declaração por módulo por linha. |
| 30 | +- Não há whitespace no fim das linhas. |
| 31 | + Whitespace no fim das linhas faz com que a inspeção do código seja mais difícil pois eles não mudam o comportamento do código mas podem ser interpretados como mudanças. |
| 32 | +- Evitar espacos adicionais dentro dos parênteses. |
| 33 | + Escreva `string(1, 2)` ao invés de `string( 1 , 2 )`. |
| 34 | +- Variávies globais devem ser evitadas. |
| 35 | +- Tente limitar nomes de funções para apenas uma ou duas palavras. |
| 36 | +- Use o ponto-e-virgula para distinção se um argumento é posicional ou de palavra-chave. |
| 37 | + Por exemplo, `func(x; y=3)` ao invés de `func(x, y=3)`. |
| 38 | +- Evite usar espaços múltiplos para alinhar coisas. |
| 39 | + Escreva |
| 40 | + ``` |
| 41 | + a = 1 |
| 42 | + lorem = 2 |
| 43 | + ``` |
| 44 | + ao invés de |
| 45 | + ``` |
| 46 | + a = 1 |
| 47 | + lorem = 2 |
| 48 | + ``` |
| 49 | +- Sempre que apropriado, coloque espaços ao redor de operadores binários, por exemplo, `1 == 2` ou `y = x + 1`. |
| 50 | +- Indente quotações triplas: |
| 51 | + ``` |
| 52 | + s = """ |
| 53 | + my long text: |
| 54 | + [...] |
| 55 | + the end. |
| 56 | + """ |
| 57 | + ``` |
| 58 | +- Não omite zeros in floats (mesmo que Julia permita). |
| 59 | + Portanto, escreva `1.0` ao invés de `1.` e escreva `0.1` ao invés de `.1`. |
| 60 | +- Use `in` dentro de loops for e não = ou ∈ (mesmo que Julia permita). |
| 61 | + |
| 62 | +### Nossos incrementos ao Blue Style Guide |
| 63 | + |
| 64 | +- No texto, referenciamos uma chamada de função `M.foo(3, 4)` como `M.foo` e não `M.foo(...)` ou `M.foo()`. |
| 65 | +- Quando falando sobre pacotes, tais como o pacote DataFrames, nós explicitamente escrevemos sempre `DataFrames.jl`. |
| 66 | + Isto faz com que seja fácil reconhecer que estamos nos referindo à um pacote. |
| 67 | +- Para nome de arquivos, mantemos a notação como "file.txt" e não `file.txt` ou file.txt, pois é consistente com o código-fonte. |
| 68 | +- Para nomes e colunas em tabelas, tais como a coluna `x`, usamos a coluna `:x`, porque é consistente com o código-fonte. |
| 69 | +- Não usamos símbolos Unicode fora dos blocos de código. |
| 70 | + Isto foi necessário por conta de um bug na geração do PDF. |
| 71 | +- A linha antes de cada código de bloco termina com dois pontos (:) para indicar que aquela linha pertence aquele bloco de código. |
| 72 | + |
| 73 | +#### Carregamento de símbolos |
| 74 | + |
| 75 | +Prefira sempre carregar símbolos de maneira explícita, ou seja, prefira `using A: foo` ao invés de `using A` quando não estiver usando o REPL [veja também @jump2021using]. |
| 76 | +Neste contexto, um símbolo significa um identificado de um objeto. |
| 77 | +Por exemplo, mesmo que não parece natural, internamente `DataFrame`, `π` e `CSV` são todos símbolos. |
| 78 | +Podemos averiguar isto se usarmos uma função introspectiva de Julia tal como `isdefined`: |
| 79 | + |
| 80 | +```jl |
| 81 | +scob("isdefined(Main, :π)") |
| 82 | +``` |
| 83 | + |
| 84 | +Adjacente de ser explícito no uso de `using`, prefira também `using A: foo` ao invẽs de `import A: foo` porque este último faz com que seja fácil estender acidentalmente `foo`. |
| 85 | +Note que isto não é somente aplicável para Julia: |
| 86 | +carregament implícito de símbolos por `from <module> import *` também é desencorajado em Python [@pep8]. |
| 87 | + |
| 88 | +A razão da importância de ser explícito está relacionada com versionamento semântico. |
| 89 | +Com versionamento semântico (<http://semver.org>), o número da versão está relacionado se um pacote possui ou não mudanças _breaking_. |
| 90 | +Por exemplo, uma mudança _non-breaking_ que atualiza o pacote `A` se dá quando o pacote migra da versão `0.2.2` para `0.2.3`. |
| 91 | +Com tais mudanças _non-breaking_, você não precisa se preocupar se o seu pacote vai quebrar (_break_), em outras palavras, dar um erro ou mudar o comportamento de execução. |
| 92 | +Se um pacote `A` migra de versão `0.2` para `1.0`, então esta atualização é _breaking_ e você provavelmente terá que fazer mudanças no seu código para fazer com que o pacote `A` funcione novamente. |
| 93 | +**Porém**, exportando símbolos extras é considerado uma mudança _non-breaking_. |
| 94 | +Então, com carreamento implícito de símbolos **mudanças _non-breaking_ podem quebrar seu pacote**. |
| 95 | +Por isso que é uma boa prática apeans carregar símbolos de maneira explícita. |
0 commit comments