Do not speak Portuguese? Translate this site with Google or Bing Translator
PSR — Padrões necessários para ter um código de qualidade

Posted on: December 16, 2023 02:23 AM

Posted by: Renato

Categories: Laravel

Views: 243

PSR — Padrões necessários para ter um código de qualidade

6 min read Sep 28, 2018
 
.
 
..

.

Introdução

Creio que muito de nós pouco sabíamos que existia um padrão de escrita de código em PHP quando começamos nossa jornada nessa linguagem. A famosa frase: “Funciona? Então tá valendo!” era a que pairava sobre meus pensamentos.

Porém, com o tempo, percebemos (ou deveríamos) evoluir e buscar não somente o funcionamento da aplicação em si, mas sim, a qualidade da escrita do código. Então nos deparamos com as PSRs, um acrônimo de PHP Standards Recommendations (https://www.php-fig.org/psr/), que nos oferece padrões para escrevermos o nosso código.

PHP-FIG. O que é? O que faz?

FIG significa Framework Interoperability Group, formado por um grupo composto por representantes de grandes projetos PHP (CakePHP, Doctrine, Zend Framework, etc.). O objetivo desse grupo é criar padrões que todos esses projetos citados possam adotar. Tais padrões podem ser adotados em nossos projetos e são grandes os benefícios que alcançamos ao utilizá-los, tais como: código legível; fácilidade de dar manutenção; interoperabilidade (componentes de um framework ou pessoa podem ser facilmente integrados em outro).

Neste artigo, vamos falar resumidamente da PSR-1 e PSR-2. Para ter o detalhamento completo e conhecer as demais PSRs, acesso o site oficial da documentação: https://www.php-fig.org/psr/.

PSR-1 — Basic Coding Standard

1. O código PHP deve usar as tags ou short-echo . Não utilize .

   
  echo 'Using the PHP tag according to PSR-1: ";

.-----------------------------------------------------------------------------------------------------------------

"Using short-echo tag"?>

2. Os arquivos PHP devem usar somente a codificação UTF-8 sem BOM (Byte Order Mark)

UTF-8 sem BOM é a codificação padrão do editores. Sabemos que a codificação de um arquivo pode nos dar dores de cabeça.

3. Você pode declarar classes, funções, constantes, etc. e não causar outros efeitos colaterais ou deve executar a lógica com efeitos colaterais, mas não deve fazer as duas coisas juntas.

O que isso significa? Os arquivos PHP devem ter suas responsabilidades separadas. Vejamos um exemplo:

.--------------------------------------------------

  // side effect: change ini settings
  ini_set('error_reporting', E_ALL);
   
  // side effect: loads a file
  include "file.php";
   
  // side effect: generates output
  echo " \n";
   
  // declaration
  function foo()
  {
  // function body
  }

--------------------------------------------------------------------------------------------------.

Neste exemplo, o arquivo está alterando uma configuração do PHP, incluindo um outro arquivo PHP, gerando uma saída e ainda declarando uma função. Vamos à um exemplo correto:

  // declaration
  function foo()
  {
  // function body
  }
   
  // conditional declaration is *not* a side effect
  if (! function_exists('bar')) {
  function bar()
  {
  // function body
  }
  }

-----------------------------------------------------------------------------------------------------

4. Namespace e classes devem seguir um autoloading especificado na PSR-0 e PSR-4 que serão abordadas em uma outra oportunidade.

5. As classes devem ser declaradas utilizando o padrão chamado pelo PHP-FIG de StudlyCaps.

Isso significa que se tenho uma classe que deriva da junção de dois ou mais nomes, como por exemplo, HomeController, o H de home e o C de controller devem ser maiúsculas. Uma classe homeController estaria com o nome errado, não diferente de Homecontroller, que também estaria incorreta.

E se a classe tiver apenas um nome, como por exemplo Home? O correto é exatamente Home, com H maiúsculo.

Este padrão também se aplica à Traits e Interfaces.

   
  namespace App\Http\Controllers;
   
  class HomeController extends Controller
  {
   
  }

--------------------------------------------------------------------------------------------------------

6. As constantes devem ser declaradas em maiúsculo e separadas por underscore (se necessário).

Vamos ao exemplo:

  namespace Vendor\Model;
   
  class Foo
  {
  const VERSION = '1.0';
  const DATE_APPROVED = '2012-06-01';
  }

.----------------------------------------------------------

7. Propriedades não possuem um padrão exigido.

As PSRs não restringem quanto à definição do uso de nomes para as propriedades.

8. Métodos devem ser declarados em camelCase().

Os métodos devem ser declarados com o caractere da primeira inicial palavra em minúsculos e a demais iniciais em maiúsculo, como por exemplo, o método camelCase(). E se o método tiver somente uma palavra? Então ficaria camel().

PSR-2 — Coding Style Guide

Como vimos, a PSR-1 é simples e sua aplicação é de fácil entendimento. Com a PSR-2 não é diferente, e uma completa a outra. E adivinha qual a primeira especificação da PSR-2? Exato! Isso mesmo, seguir a PSR-1!

1. O seu código deve utilizar 4 espaços para indentação (recuo), e não TABs.

Um dia com certeza alguns de nós já utilizamos o TAB para indentar o nosso código. O problema não é utilizar o TAB em si, mas utilizá-lo sem configurar a quantidade de espaços adequada, no nosso caso, 4 espaços. Graças aos bons editores que temos, como Sublime, Visual Studio Code e etc., podemos configurar sem problemas. E para nos ajudar mais ainda e não restar dúvidas quanto à indentação de nosso código, podemos utililizar uma ferramenta de linha de comando, chamada PHP CS Fixer, que nada mais é do que um projeto open source hospedado no github (https://github.com/FriendsOfPHP/PHP-CS-Fixer) que nos ajuda e muito a aplicar a PSR-1, PSR-2 e mais um pouco.

2. Não deve haver um limite rigoroso (hard limit) no comprimento das linhas, o limite "suave"(soft limit) deve ser de 120 caracteres, as linhas deveriam ser de 80 caracteres ou menos.

Polêmico? Creio que não. Podemos dividir essa recomendação em algumas partes.

Primeira: não deve haver um hard limit.

Segunda: o soft limite deve ser de 120 caracteres em uma linha.

Terceira: o recomendado é que se tenha no máximo 80 caracteres em uma linha.

Mas e agora? É 120 ou 80 caracteres por linha? A RFC 2119 (http://www.ietf.org/rfc/rfc2119.txt) nos ajuda a interpretar as palavras chaves que são utilizadas nas PSRs, conforme o próprio PHP-FIG usa e destaca:

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”,
“SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be
interpreted as described in RFC 2119.

Recomendado significa que: podem existir razões válidas para ignorar este item em particular, ou seja, os 80 caracteres, mas que essa decisão deve ser tomada cuidadosamente para fazer o contrário, ou seja, ultrapassar os 80 caracteres.

3. Deve haver uma linha em branco após o namespace e deve haver outra linha em branco após o bloco de declarações use.

Mais uma coisa: Utilize uma keyword use por declaração.

  namespace Vendor\Package;
   
  use FooClass;
  use BarClass as Bar;
  use OtherVendor\OtherPackage\BazClass;
   
  // ... additional PHP code ...

--------------------------------------------------------------------

.

4. Quanto as classes, deve abrir chaves na próxima linha após a declaração e fechar chave após o corpo da classe. Com exemplo fica fácil:

 
  namespace Vendor\Package;
   
  use FooInterface;
  use BarClass as Bar;
  use OtherVendor\OtherPackage\BazClass;
   
  class Foo extends Bar implements FooInterface
  {
  //class body
  }

--------------------------------------------------------------------------------------------------------------

E para os métodos? A mesma regra aplicada para classes: abrir chaves na próxima linha após a declaração e fechar chaves após o corpo do método.

.

  namespace Vendor\Package;
   
  use FooInterface;
  use BarClass as Bar;
  use OtherVendor\OtherPackage\BazClass;
   
  class Foo extends Bar implements FooInterface
  {
  public function foo()
  {
  //function body
  }

----------------------------------------------------------------------------

Ah! Essa regra também se aplica à Interfaces e Traits.

5. As keywords extends e implements devem ser declaradas na mesma linha que o nome da classe. Os implements podem ser declarados na mesma linha ou dividos em várias linhas, onde cada linha é indentada uma vez. O primeiro item da lista deve estar na próxima linha e deve havar apenas uma interface por linha.

Resumidamente, pode ser usado assim:

  namespace Vendor\Package;
   
  use FooClass;
  use BarClass as Bar;
  use OtherVendor\OtherPackage\BazClass;
   
  class ClassName extends ParentClass implements \ArrayAccess, \Countable
  {
  // constants, properties, methods
  }

------------------------------------------------------------------------

  namespace Vendor\Package;
   
  use FooClass;
  use BarClass as Bar;
  use OtherVendor\OtherPackage\BazClass;
   
  class ClassName extends ParentClass implements
  \ArrayAccess,
  \Countable,
  \Serializable
  {
  // constants, properties, methods
  }

-------------------------------------------------------------------------

.

6. Propriedades não devem ser declaradas com var.

7. A visibilidade das propriedades e métodos devem ser declaradas.

  namespace Vendor\Package;
   
  class ClassName
  {
  public $foo = null;
  }

--------------------------------------------------------------

  namespace Vendor\Package;
   
  use FooInterface;
  use BarClass as Bar;
  use OtherVendor\OtherPackage\BazClass;
   
  class Foo extends Bar implements FooInterface
  {
  public function foo()
  {
  //function body
  }
  }

--------------------------------------------------------------

Obs.: não utilize underscore para indicar a visibilidade do método. Você pode fazer, mas não é o recomendado.

8. Não utilize espaço após o nome do método. Não utilize espaço após a abertura do parêntese, isso também vale para o fechamento.

  namespace Vendor\Package;
   
  class ClassName
  {
  public function fooBarBaz($arg1, &$arg2, $arg3 = [])
  {
  // method body
  }
  }

.---------------------------------------------------------------------------------------------------------

9. Quando presentes, as keywords abstract e final devem vir antes da visibilidade. E também quando presente a keyword static, esta deve vir após a visibilidade.

10. Abaixo segue a regra geral para as estruturas de controle. Vamos utilizar If, elseif, else e switch,case.

  • Deve haver um espaço após a keyword da estrutura;
  • Não deve haver espaço após o parêntese de abertura e também não deve haver espaço que anteceda o parêntese de fechamento;
  • Deve haver um espaço entre o parêntese de fechamento e a abertura de chaves;
  • O corpo da estrutura deve ser indentado uma vez (4 espaços);
  • A chave de fechamento deve estar na próxima linha após o corpo;

Vamos aos exemplos do if, elseif e else:

 

 

  if ($expr1) {
  // if body
  } elseif ($expr2) {
  // elseif body
  } else {
  // else body;
  }

--------------------------------------------------------------------------------------------------------

Para switch, case, temos:

  • A colocação de parênteses e chaves segue a mesma racional do if;
  • O case deve ser indentado uma vez (4 espaços) utilizando como referência o switch;
  • A keyword break (ou outra keyword de finalização) deve ser indentada uma vez (4 espaços) utilizando como referência o case;
  • Deve haver um comentário informando quando não for utilizado o break. Vamos ver tudo isso aplicado no exemplo abaixo:
  switch ($expr) {
  case 0:
  echo 'First case, with a break';
  break;
  case 1:
  echo 'Second case, which falls through';
  // no break
  case 2:
  case 3:
  case 4:
  echo 'Third case, return instead of break';
  return;
  default:
  echo 'Default case';
  break;
 

----------------------------------------------------------------------------------------------------------

Conclusão

Em meio às diversas PSRs existentes, utilizando a PSR-1 e PSR-2 já teremos grandes benefícios se aplicados os padrões que ambas propõem. Sugiro que você a partir de agora comece a aplicar estes padrões e assim escreva códigos mais legíveis e elegantes. Pense no seu código como um livro no qual você é o autor. Um código bem feito traz benefícios para todos, incluindo você e sua equipe.
Think about it!

- https://medium.com/@dhyogoalmeida/psr-padr%C3%B5es-necess%C3%A1rios-para-ter-um-c%C3%B3digo-de-qualidade-92b5d81f70fe


3

Share

Donate to Site


About Author

Renato

Developer

Add a Comment

Blog Search


Categories

OUTROS (16) Variados (109) PHP (133) Laravel (171) Black Hat (3) front-end (29) linux (114) postgresql (39) Docker (28) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (56) devops (25) nodejs (5) npm (3) nvm (1) git (8) firefox (1) react (7) reactnative (5) collections (1) javascript (7) reactjs (8) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (2) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (12) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (5) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (3) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (43) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (2) jwt (5) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (3) Architecture (4) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (2) autorizacao (2) authentication (4) authorization (3) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1) Axios (1) Fetch (1) Deepin (1) vue (4) nuxt (1) PKCE (1) Oauth2 (2) webhook (1) TypeScript (1) tailwind (1) gource (2)

New Articles



Get Latest Updates by Email