Neste livro, nós tentamos manter a formatação de código-fonte o mais consistente possível. Isto permite uma melhor leitura e escrita de código-fonte. Definimos o padrão de formatação em três partes.
Primeiramente, nós tentamos aderir as convenções do Julia Style Guide. Mais importante, escrevemos funções e não scripts (veja também Section 1.3). Além disso, usamos convenções de nomenclatura consistente com o módulo base de Julia:
module JuliaDataScience, struct MyPoint. (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.)_). Também é permitido omitir o separador quando nomeando funções. Por exemplo, estes nomes de funções são consistentes com as convenções: my_function, myfunction e string2int.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.
O Blue Style Guide adiciona diversas convenções aos padrões do Guia de Estilo de Julia. Algumas dessas regras podem soar pedantes, mas descobrimos que elas fazem o código ficar mais legível.
Do Blue Style Guide, nós aderimos especificamente à:
No máximo 92 caracteres por linha em código-fonte (para arquivos Markdown, linhas mais longas são permitidas).
Quando carregando código com using, usar apenas uma declaração por módulo por linha.
Não há whitespace no fim das linhas. 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.
Evitar espacos adicionais dentro dos parênteses. Escreva string(1, 2) ao invés de string( 1 , 2 ).
Variávies globais devem ser evitadas.
Tente limitar nomes de funções para apenas uma ou duas palavras.
Use o ponto-e-virgula para distinção se um argumento é posicional ou de palavra-chave. Por exemplo, func(x; y=3) ao invés de func(x, y=3).
Evite usar espaços múltiplos para alinhar coisas. Escreva
a = 1
lorem = 2
ao invés de
a = 1
lorem = 2Sempre que apropriado, coloque espaços ao redor de operadores binários, por exemplo, 1 == 2 ou y = x + 1.
Indente quotações triplas:
s = """
my long text:
[...]
the end.
"""Não omite zeros in floats (mesmo que Julia permita). Portanto, escreva 1.0 ao invés de 1. e escreva 0.1 ao invés de .1.
Use in dentro de loops for e não = ou ∈ (mesmo que Julia permita).
M.foo(3, 4) como M.foo e não M.foo(...) ou M.foo().DataFrames.jl. Isto faz com que seja fácil reconhecer que estamos nos referindo à um pacote.file.txt ou file.txt, pois é consistente com o código-fonte.x, usamos a coluna :x, porque é consistente com o código-fonte.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 JuMP Style Guide, 2021). Neste contexto, um símbolo significa um identificado de um objeto. Por exemplo, mesmo que não parece natural, internamente DataFrame, π e CSV são todos símbolos. Podemos averiguar isto se usarmos uma função introspectiva de Julia tal como isdefined:
isdefined(Main, :π)
true
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. Note que isto não é somente aplicável para Julia: carregament implícito de símbolos por from <module> import * também é desencorajado em Python (van Rossum et al., 2001).
A razão da importância de ser explícito está relacionada com versionamento semântico. 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. 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. 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. 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. Porém, exportando símbolos extras é considerado uma mudança non-breaking. Então, com carreamento implícito de símbolos mudanças non-breaking podem quebrar seu pacote. Por isso que é uma boa prática apeans carregar símbolos de maneira explícita.