diff --git a/pt/contributing/cakephp-coding-conventions.rst b/pt/contributing/cakephp-coding-conventions.rst index a781e8e1c4..9d17dbf557 100644 --- a/pt/contributing/cakephp-coding-conventions.rst +++ b/pt/contributing/cakephp-coding-conventions.rst @@ -1,12 +1,355 @@ -Padrões de código -################# +Padrões de codificação +###################### -.. note:: - Atualmente, a documentação desta página não é suportada em português. +Desenvolvedores do CakePHP deverão usar o `guia de codificação +PSR-2 `_ em adição às regras apresentadas +a seguir e definidas como padrão. - Por favor, sinta-se a vontade para nos enviar um *pull request* para o - `Github `_ ou use o botão - **IMPROVE THIS DOC** para propor suas mudanças diretamente. +É recomendado que outros desenvolvedores que optem pelo CakePHP sigam os mesmos +padrões. - Você pode consultar a versão em inglês deste tópico através do seletor de - idiomas localizado ao lado direito do campo de buscas da documentação. \ No newline at end of file +Você pode usar o `CakePHP Code Sniffer +`_ para verificar se o seu +código segue os padrões estabelecidos. + +Adicionando novos recursos +========================== + +Nenhum novo recurso deve ser adicionado sem que tenha seus próprios testes +definidos, que por sua vez, devem estar passando antes que o novo recurso seja +enviado para o repositório. + +Indentação +========== + +Quatro espaços serão usados para indentação. + +Então, teremos uma estrutura similar a:: + + // nível base + // nível 1 + // nível 2 + // nível 1 + // nível base + +Ou:: + + $booleanVariable = true; + $stringVariable = 'jacaré'; + if ($booleanVariable) { + echo 'Valor booleano é true'; + if ($stringVariable === 'jacaré') { + echo 'Nós encontramos um jacaré'; + } + } + +Em situações onde você estiver usando uma função em mais de uma linha, siga +as seguintes orientações: + +* O parêntese de abertura de uma função multi-linha deve ser o último conteúdo + da linha. +* Apenas um argumento é permitido por linha em uma função multi-linha. +* O parêntese de fechamento de uma função multi-linha deve ter uma linha + reservada para sí. + +Um exemplo, ao invés de usar a seguinte formatação:: + + $matches = array_intersect_key($this->_listeners, + array_flip(preg_grep($matchPattern, + array_keys($this->_listeners), 0))); + +Use esta:: + + $matches = array_intersect_key( + $this->_listeners, + array_flip( + preg_grep($matchPattern, array_keys($this->_listeners), 0) + ) + ); + +Comprimento da linha +==================== + +É recomendado manter as linhas próximas de 100 caracteres no comprimento para +melhor leitura do código. As linhas não devem ser mais longas que 120 +caracteres. + +Resumindo: + +* 100 caracteres é o limite recomendado. +* 120 caracteres é o limite máximo. + +Estruturas de controle +====================== + +Estruturas de controle são por exemplo, "``if``", "``for``", "``foreach``", +"``while``", "``switch``", etc. A baixo, um exemplo com "``if``":: + + if ((expr_1) || (expr_2)) { + // ação_1; + } elseif (!(expr_3) && (expr_4)) { + // ação_2; + } else { + // ação_padrão; + } + +* Nas estruturas de controle deve existir 1 (um) espaço antes do primeiro + parêntese e 1 (um) espaço entre o último parêntese e a chave de abertura. +* Sempre use chaves nas estruturas de controle, mesmo que não sejam + necessárias. Elas melhorar a leitura do código e tendem a causar menos erros + lógicos. +* A abertura da chave deve ser posicionada na mesma linha que a estrutura de + controle. A chave de fechamento deve ser colocada em uma nova linha e ter o + mesmo nível de indentação que a estrutura de controle. O conteúdo de dentro + das chaves deve começar em uma nova linha e receber um novo nível de + indentação. +* Atribuições em linha não devem ser usadas dentro de estruturas de controle. + +:: + + // errado = sem chaves, declaração mal posicionada + if (expr) declaração; + + // errado = sem chaves + if (expr) + declaração; + + // certo + if (expr) { + declaração; + } + + // errado = atribuição em linha + if ($variable = Class::function()) { + declaração; + } + + // certo + $variable = Class::function(); + if ($variable) { + declaração; + } + +Operadores ternários +-------------------- + +Operadores ternários são admissíveis quando toda a operação ternária se encaixa +em uma única linha. Já operações mais longas devem ser divididas em +declarações ``if else``. Operadores ternários nunca devem ser aninhados. +Opcionalmente parênteses podem ser usados ao redor da verificação de condição +ternária para esclarecer a operação:: + + // Bom, simples e legível + $variable = isset($options['variable']) ? $options['variable'] : true; + + // Aninhamento é ruim + $variable = isset($options['variable']) ? isset($options['othervar']) ? true : false : false; + + +Arquivos de template +-------------------- + +Em arquivos de *template* (arquivos .ctp) os desenvolvedores devem usar +estruturas de controle por palavra-chave. A legibilidade em arquivos de +*template* complexos é muito melhor dessa forma. As estruturas de controle +podem tanto estar contidas em grandes blocos de código PHP, ou ainda em *tags* +PHP separadas:: + + Você é o usuário administrador.

'; + endif; + ?> +

A seguinte estrutura também é aceitável:

+ +

Você é o usuário administrador.

+ + + +Comparação +========== + +Sempre tente ser o mais rigoroso possível. Se uma comparação deliberadamente não +é estrita, pode ser inteligente comentar sobre isso para evitar confusões +geradas por falta de informação. + +Para testar se uma variável é nula, é recomendado usar uma verificação +estrita:: + + if ($value === null) { + // ... + } + +O valor a ser verificado deve ser posto do lado direito:: + + // não recomendado + if (null === $this->foo()) { + // ... + } + + // recomendado + if ($this->foo() === null) { + // ... + } + +Chamadas de função +================== + +Funções devem ser chamadas sem espaço entre o nome da função e o parêntese +de abertura. Deve haver um espaço entre cada parâmetro de uma chamada de +função:: + + $var = foo($bar, $bar2, $bar3); + +Como você pode ver a cima, deve haver um espaço em ambos os lados do sinal de +igual (=). + +Definição de método +=================== + +Exemplo de uma definição de método:: + + public function someFunction($arg1, $arg2 = '') + { + if (expr) { + declaração; + } + return $var; + } + +Parâmetros com um valor padrão, devem ser posicionados por último na definição +de uma função. Tente fazer suas funções retornarem algo, pelo menos ``true`` ou +``false``, assim pode-se determinar se a chamada de função foi bem-sucedida:: + + public function connection($dns, $persistent = false) + { + if (is_array($dns)) { + $dnsInfo = $dns; + } else { + $dnsInfo = BD::parseDNS($dns); + } + + if (!($dnsInfo) || !($dnsInfo['phpType'])) { + return $this->addError(); + } + return true; + } + +Existem espaços em ambos os lados dos sinais de igual. + +Declaração de tipo +------------------ + +Argumentos que esperam objetos, *arrays* ou *callbacks* (válidos) podem ser +declarados por tipo. +Nós apenas declaramos métodos públicos, porém, o uso da declaração por tipo não +é livre de custos:: + + /** + * Descrição do método. + * + * @param \Cake\ORM\Table $table A classe Table a ser usada. + * @param array $array Algum valor em formato array. + * @param callable $callback Algum callback. + * @param boolean $boolean Algum valor booleano. + */ + public function foo(Table $table, array $array, callable $callback, $boolean) + { + } + +Aqui ``$table`` deve ser uma instância de ``\Cake\ORM\Table``, ``$array`` deve +ser um ``array`` e ``$callback`` deve ser do tipo ``callable`` (um *callback* +válido). + +Perceba que se você quiser permitir ``$array`` ser também uma instância de +``\ArrayObject`` você não deve declará-lo, pois ``array`` aceita apenas o tipo +primitivo:: + + /** + * Descrição do método. + * + * @param array|\ArrayObject $array Algum valor em formato array. + */ + public function foo($array) + { + } + +Funções anônimas (Closures) +--------------------------- + +Para se definir funções anônimas, segue-se o estilo de codificação `PSR-2 +`_, onde elas são declaradas com um espaço +depois da palavra-chave `function`, e um espaço antes e depois da palavra-chave +`use`:: + + $closure = function ($arg1, $arg2) use ($var1, $var2) { + // código + }; + +Encadeamento de métodos +======================= + +Encadeamento de métodos deve ter múltiplos métodos distribuidos em linhas +separadas e indentados com quatro espaços:: + + $email->from('foo@exemplo.com') + ->to('bar@exemplo.com') + ->subject('Uma mensagem legal') + ->send(); + +Comentando código +================= + +Todos os comentários devem ser escritos em inglês, e devem de forma clara +descrever o bloco de código comentado. + +Comentários podem incluir as seguintes *tags* do +`phpDocumentor `_: + +* `@author `_ +* `@copyright `_ +* `@deprecated `_ + Usando o formato ``@version ``, onde ``version`` e + ``description`` são obrigatórios. +* `@example `_ +* `@ignore `_ +* `@internal `_ +* `@link `_ +* `@see `_ +* `@since `_ +* `@version `_ + +*Tags* PhpDoc são muito semelhantes a *tags* JavaDoc no Java. *Tags* são apenas +processadas se forem a primeira coisa numa linha de DocBlock, por exemplo:: + + /** + * Exemplo de tag. + * + * @author essa tag é analisada, mas essa versão é ignorada + * @version 1.0 essa tag também é analisada + */ + +:: + + /** + * Exemplo de tags phpDoc em linha. + * + * Essa função cria planos com foo() para conquistar o mundo. + * + * @return void + */ + function bar() + { + } + + /** + * Função foo. + * + * @return void + */ + function foo() + { + } + +Blocos de comentários, com a exceção do primeiro bloco em um arquivo, devem +sempre ser precedidos por uma nova linha.