-
Notifications
You must be signed in to change notification settings - Fork 8
PADRAO DE CODIGO E COMMIT
Este guia descreve o estilo de codificação PHP para a colaboração no projeto Payment Gateway da comunidade Beer And Code. É provável que desenvolvedores e equipes individuais tenham suas próprias visões fortes sobre determinados estilos de codificação, portanto esse conjunto de documentos deve ser visto como um guia, não um livro de regras. Dito isto, tudo o que está documentado aqui é a preferência dos desenvolvedores principais, portanto, considere os pontos antes de enviar solicitações pull requests (PR). O objetivo deste documento é ajudar a orientar o estilo das contribuições de código para manter um estilo consistente no repositório, definir e justificar as decisões tomadas dentro dele.
O código de exemplo a seguir mostra uma visão geral do estilo proposto neste guia:
<?php
namespace FastFood\Page;
use FastFood\Logic\OrderLogic;
use FastFood\Menu\MenuFactory;
use Vendor\Food\FoodOrderInterface;
class OrderPage extends OrderLogic implements FoodOrderInterface {
const TYPE_MAIN = "order-type-main";
const TYPE_VEGETARIAN = "order-type-vegetarian";
const TYPE_VEGAN = "order-type-vegan";
const TYPE_GLUTENFREE = "order-type-glutenfree";
private OtherClass $menu;
public function go():void
{
$this->menu = MenuFactory::create($_GET["type"]);
$this->sampleMethod($this->menu->getName(), $this->menu->getSize());
$output = $this->longMethodWithManyArgs(
$this->getDefaultSize(),
123,
"example"
);
}
private function sampleMethod(string $name, int $size = 0):void
{
$maxSize = OtherClass::getMaxSize($name);
if($size === 0) {
$this->menu->fillEmpty(OtherClass::getDefault());
}
elseif($size > $maxSize) {
$size = $maxSize;
}
else {
switch($size) {
case OtherClass::SIZE_INDIVIDUAL:
$this->menu->setStyle("individual");
break;
case OtherClass::SIZE_FAMILY:
$this->menu->setStyle("family");
break;
default:
$this->menu->setStyle(Menu::SIZE_DEFAULT);
break;
}
}
}
public function longMethodWithManyArgs(
int $firstNumber,
int $secondNumber = 0,
string $exampleString = null
):Menu
{
$duplicate = MenuFactory::create($this->menu->getType());
if($duplicate->getSize() !== 0
&& $duplicate->name === $exampleString)
{
return MenuFactory::createDefault();
}
return $duplicate;
}
}
- A primeira linha de todos os arquivos .php deve ser exatamente "<?php"
- Nunca use a tag PHP de fechamento (?>)
- Nunca use tags curtas (short tags) do PHP
- Todos os arquivos devem usar apenas UTF-8, sem BOM
- Sempre use o fuso horário America/Sao_Paulo para armazenar data e hora
- Todo arquivo de biblioteca .php deve conter exatamente uma classe
- Todo arquivo de biblioteca .php deve ser livre de efeitos colaterais
- Em arquivos e códigos, use palavras no singular (por exemplo, item, stylesheet, user) em vez de palavras no plural
- Evite notação húngara, onde nomes de arquivos / variáveis que indicam seu tipo
- Use camelCase para nomear variáveis
- Nunca use variáveis globais
- Propriedades sempre devem ser declaradas
- As variáveis sempre devem ser declaradas no topo do bloco em que são usadas
- Evite usar a palavra-chave final, a menos que seja necessário
- Evite chamar funções no namespace global
- Os códigos de programação, variáveis e funções deverão ser escritos em inglês
- Use 4 espaços ao invés de tabulação (PSR-12)
- Evite blocos de código com "dupla indentação" onde nenhuma indentação é necessária para facilitar a leitura
- Não deixe espaços em branco no final das linhas
- Seja o mais rigoroso possível para aplicar 80 linhas de caracteres
- As chaves de abertura DEVE seguir sua própria linha (PSR-12)
- As chaves de fechamento devem sempre ser colocadas no início de sua própria linha (PSR-12)
- Toda condicional if() deve conter chaves de abertura e fechamento, ainda que o corpo possua apenas 1 linha.
- Um nível de indentação deve ser aplicado dentro e somente dentro das chaves
- Os condicionais entre colchetes não devem obter indentação extra ao quebrar em linhas separadas
- Nunca deixe declarações condicionais sem restrições ou sem indentação
- Nenhum espaço extra deve ser colocado após uma palavra-chave da estrutura de controle ou nome da função
- Os colchetes de abertura não devem ter espaço depois; os colchetes de fechamento não devem ter espaço antes
- Vírgulas que separam listas de variáveis devem ter um espaço ou nova linha depois, sem espaço em branco antes
- Um espaço deve envolver operadores binários e ternários, mas não unários
- Um espaço deve envolver todos os operadores de tipo
- Diretórios e arquivos devem ser mapeados para namespace ou web (view)
- Os espaços para nome devem ser mapeados para os caminhos de arquivo, conforme PSR-4
- Arquivos e diretórios devem estar em minúsculas com hífen onde não forem mapeados para namespace
- Os arquivos e diretórios mapeados para namespace devem usar UpperCamelCase
- Arquivos e diretórios mapeados na Web devem usar palavras em minúsculas e hifenizadas
- Uma classe só deve ser carregada automaticamente - nunca use require ou include
- Constantes só devem ser declaradas em uma classe (deve atender somente à classe declarada)
- As constantes devem usar UPPERCASE_UNDERSCORED
- As propriedades devem usar $camelCase
- Os métodos devem usar camelCase()
- As classes devem ter todos ou nenhum membro estático
- Todos os parâmetros devem definir seu tipo sempre que possível
- Todos os métodos devem definir seu tipo de retorno sempre que possível
- Os métodos devem evitar ficar mais de 20-50 linhas
- Se possível evite comentários, pois um um bom código não precisa de comentários (se possível leia o livro Código Limpo)
- Para comentários embutidos, devem ser usados comentários com barra dupla (//)
- Comentários embutidos não devem ter indentação, começando na coluna 1
- Comentários embutidos podem abranger várias linhas, prefixadas com a barra dupla
- Os comentários de bloco devem ser usados apenas para fornecer documentação de classe e método na forma de blocos de documentos
- Os comentários, juntamente com os docblocks, devem ser esparsos e pesados para evitar documentação obsoleta
- As estruturas de dados que representam coleções devem ser acessíveis por array, collections e / ou iterables
- Estruturas de dados que representam itens individuais devem usar funções getter
- Arrays associativos devem ser usadas apenas para pares simples de valor-chave
- Mova arrays associativos para um object com getter / setter sempre que possível
- Classes estáticas devem ser usadas apenas quando verdadeiramente não tiverem estado
-
A princípio vamos trabalhar apenas com feat (feature, novo recurso) e fix (hotfix, correção de problemas)
-
O título (primeira linha do commit) deverá estar no imperativo (adiciona) e não adicionado.
-
A mensagem do commit deverá ser obrigatoriamente em português, conforme definido por todos em live
-
O commit deverá seguir a seguinte estrutura:
<tipo>[escopo opcional]: <descrição> <corpo opcional> <rodapé opcional>
Com base nisso, um commit de hotfix ficaria assim: fix(containers/profile.php): ajusta o argumento da função getPaymentMethods
getPaymentMethods usava o tipo XPTO para receber argumento. Agora recebe o argumento correto do tipo FOO.
Resolve a issue #132
OBS.: o escopo está opcional, pois quando for um novo recurso (feat) pode ser que entre vários arquivos, inviabilizando informar todos no escopo.
Nome Completo da Classe | Nome Não Qualificado | Observações |
---|---|---|
\Neos\Flow\Session\Php | Php | A classe não é uma representação do PHP |
\Neos\Cache\Backend\File | File | A classe não representa um arquivo |
\Neos\Flow\Session\Interface | Interface | Interface é uma palavra-chave reservada |
\Neos\Foo\Controller\Default | Default | Default é uma palavra-chave reservada |
\Neos\Flow\Objects\Manager | Manager | Nome de classe não especifica de forma clara seu objetivo |
Nome Completo da Classe | Nome Qualificado | Observações |
---|---|---|
\Neos\Flow\Session\PhpSession | PhpSession | Essa é uma sessão PHP |
\Neos\Cache\Backend\FileBackend | FileBackend | Uma classe pertencente ao escopo de Backend |
\Neos\Flow\Session\SessionInterface | SessionInterface | Interface para sessões |
\Neos\Foo\Controller\StandardController | StandardController | Um controller padrão |
\Neos\Flow\Objects\ObjectManager | ObjectManager | Classe pertencente ao escopo de Objects |
Forma Não Qualificada | Forma Qualificada | Observações |
---|---|---|
\Neos\Flow\Mvc\ControllerInterface | \Neos\Flow\Mvc\Controller\ControllerInterface | Uma vez que se trata de uma interface concernente a todos os arquivos do namespace Controller |
\Neos\Cache\AbstractBackend | \Neos\Cache\Backend\AbstractBackend | Uma vez que se trata de uma interface concernente a todos os arquivos do namespace Backend |
Observação: Ao especificar nomes de classe para PHP, sempre faça referência ao espaço para nome global dentro do código no espaço de nomes usando uma barra invertida à esquerda. Ao fazer referência a um nome de classe dentro de uma string (por exemplo, dado ao método get do ObjectManager, em expressões pointcut ou em arquivos YAML), nunca use uma barra invertida à esquerda. Isso segue a noção nativa do PHP de nomes em strings sempre sendo vistos como totalmente qualificados.