{"id":7365,"date":"2018-03-01T16:00:44","date_gmt":"2018-03-01T19:00:44","guid":{"rendered":"https:\/\/www.mxcursos.com\/blog\/?p=7365"},"modified":"2019-03-16T20:38:47","modified_gmt":"2019-03-16T23:38:47","slug":"solid-responsabilidade-unica-com-php","status":"publish","type":"post","link":"https:\/\/www.mxcursos.com\/blog\/solid-responsabilidade-unica-com-php\/","title":{"rendered":"SOLID &#8211; Princ\u00edpio da Responsabilidade \u00danica com PHP"},"content":{"rendered":"<p>Uma classe precisa ter uma \u00fanica responsabilidade e apenas um motivo para alter\u00e1-la. \u00c9 o que informa o SRP &#8211;\u00a0Single Responsability Principle (Principio da Responsabilidade \u00fanica), que \u00e9 um dos componentes do <strong>SOLID.<\/strong><\/p>\n<h2>O que \u00e9 o SOLID<\/h2>\n<p>O <strong>SOLID<\/strong> \u00e9 um conjunto de orienta\u00e7\u00f5es para voc\u00ea possa trabalhar melhor com a Orienta\u00e7\u00e3o a Objeto.<\/p>\n<ul>\n<li><strong>S<\/strong>ingle Responsability Principle<\/li>\n<li><strong>O<\/strong>pen\/Closed Principle<\/li>\n<li><strong>L<\/strong>iskov Substitution Principle<\/li>\n<li><strong>I<\/strong>nterface Segregation Principle<\/li>\n<li><strong>D<\/strong>ependency Inversion Principle<\/li>\n<\/ul>\n<p>O <strong>S<\/strong>, que seria o <strong>Single Responsability Principle<\/strong>, que iremos tratar nesse artigo. Tende a evitar as classes chamadas God Class, que s\u00e3o classes que fazem tudo, e com isso podem ser problem\u00e1ticas. Se voc\u00ea precisa ficar alterando v\u00e1rios pontos da sua classe, tem uma maior possibilidade de dar algum bug.<\/p>\n<h2>A aplica\u00e7\u00e3o do SRP (<strong>Single Responsability Principle)<\/strong><\/h2>\n<p>Precisamos criar um cadastro de contato b\u00e1sico, apenas nome e e-mail, e a classe precisar\u00e1 realizar o cadastro e enviar um e-mail para o contato que foi cadastrado.<\/p>\n<p>Segue a classe:<\/p>\n<pre class=\"trim-whitespace:false lang:php decode:true \">&lt;?php \r\n\r\nclass Contact\r\n{\r\n\t   public $name;\r\n\t   public $email;\r\n\r\n\t   public function insert()\r\n\t   {\r\n\t\t   $pdo =  new \\PDO(\"mysql:host=localhost;dbname=site\", \"root\", \"\");\r\n\t\t   $sql = \"INSERT INTO contacts SET name = :name, email = :email\";\r\n\t\t   $stmt = $pdo-&gt;prepare($sql);\r\n\t\t   $stmt-&gt;bindValue(':name', $this-&gt;name);\r\n\t\t   $stmt-&gt;bindValue(':email', $this-&gt;email);\r\n\t\t   $stmt-&gt;execute();\r\n\t\t   $this-&gt;sendEmail();\r\n\t   }\r\n\r\n\t   public function sendEmail()\r\n\t   {\r\n\t\t   mail($this-&gt;email, \"Enviar email\", \"Contato\");\r\n\t   }\r\n}<\/pre>\n<p>Na classe acima, ela tem mais de uma responsabilidade: ela \u00e9 respons\u00e1vel pelos dados, por fazer persist\u00eancia, por conectar ao banco de dados e enviar um e-mail.<\/p>\n<p>Ela tenta se responsabilizar por todas as etapas.<\/p>\n<p>Para utilizar, seria assim:<\/p>\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\r\n$contact = new Contact();\r\n$contact-&gt;name = 'David';\r\n$contact-&gt;email = 'david@mxcursos.com';\r\n$contact-&gt;insert();<\/pre>\n<p>Apesar da execu\u00e7\u00e3o parecer simplificada, a classe possui v\u00e1rios problemas: a falta de encapsulamento dos dados, conex\u00e3o do banco de dados definida dentro da classe (se precisarmos alterar os dados da conex\u00e3o ou se precisarmos criar um template para o e-mail, teremos que mexer na mesma classe).<\/p>\n<p>Essa classe \u00e9 bem problem\u00e1tica, porque falta coes\u00e3o e ela \u00e9 muito acoplada, n\u00e3o permitindo varia\u00e7\u00f5es ou utiliza\u00e7\u00f5es separada dos itens.<\/p>\n<p>E com isso, \u00e9 preciso separar essas responsabilidades. Vamos refatorar a classe, e separar cada responsabilidade em classes distintas.<\/p>\n<pre class=\"lang:php decode:true\">&lt;?php \r\n\r\nclass Contact\r\n{\r\n\t   private $name;\r\n\t   private $email;\r\n\r\n\t   public function setName($name)\r\n\t   {\r\n\t\t      $this-&gt;name = $name;\r\n\t   }\r\n\r\n\t   public function setEmail($email)\r\n\t   {\r\n\t\t      $this-&gt;email = $email;\r\n\t   }\r\n\r\n\t   public function getName()\r\n\t   {\r\n\t\t      return $this-&gt;name;\r\n\t   }\r\n\r\n\t   public function getEmail()\r\n\t   {\r\n\t\t      return $this-&gt;email;\r\n\t   }\r\n}\r\n<\/pre>\n<pre class=\"lang:php decode:true\">&lt;?php\r\n\r\nclass ContactSendMail\r\n{\r\n\t     private $contact;\r\n\r\n\t     public function __construct(Contact $contact)\r\n\t     {\r\n\t\t          $this-&gt;contact = $contact;\r\n\t     }\r\n\t\r\n\t     public function shoot()\r\n\t     {\r\n\t\t          mail($this-&gt;getEmail(), \"Enviar email\", \"Contato\");\r\n\t     }\r\n}<\/pre>\n<pre class=\"lang:php decode:true\">&lt;?php\r\n\r\nclass ContactDAO\r\n{\r\n\t   private $db;\r\n\t\r\n\r\n\t   public function __construct(\\PDO $pdo)\r\n\t   {\r\n\t\t      $this-&gt;db = $pdo;\r\n\t   }\r\n\r\n\t   public function insert(Contact $contact)\r\n\t   {\r\n\t\t     $sql = \"INSERT INTO contacts SET name = :name, email = :email\";\r\n\t\t     $stmt = $this-&gt;db-&gt;prepare($sql);\r\n\t\t     $stmt-&gt;bindValue(':name', $contact-&gt;getName());\r\n\t\t     $stmt-&gt;bindValue(':email', $contact-&gt;getEmail());\r\n\t\t     return $stmt-&gt;execute();\r\n                  \r\n\t   }\r\n}\r\n<\/pre>\n<p>Refatoramos a nossa classe, e criamos 3 classes:<\/p>\n<ul>\n<li>Uma classe <strong>Contact<\/strong>, que \u00e9 entidade, respons\u00e1vel por representar um Contato.<\/li>\n<li>Uma classe <strong>ContactSendMail<\/strong> que \u00e9 respons\u00e1vel por disparar o e-mail.<\/li>\n<li>Uma classe\u00a0<strong>ContactDAO<\/strong> que \u00e9 respons\u00e1vel pela intera\u00e7\u00e3o com Banco de dados.<\/li>\n<\/ul>\n<p>Como deve ser utilizada:<\/p>\n<pre class=\"lang:php decode:true \">&lt;?php\r\n\r\n\/\/Conex\u00e3o com banco de dados com PDO\r\n$pdo =  new \\PDO(\"mysql:host=localhost;dbname=site\", \"root\", \"\");\r\n\r\n\/*Define os dados a serem inserido*\/\r\n$contact = new Contact();\r\n$contact-&gt;setName('David');\r\n$contact-&gt;setEmail('david@mxcursos.com');\r\n\r\n\/\/Classe que ser\u00e1 responsavel pelas opera\u00e7\u00f5es no banco de dados\r\n$contactDAO = new ContactDAO($pdo);\r\nif($contactDAO-&gt;insert($contact)) {\r\n\t\/\/Classe respons\u00e1vel por disparar um e-mail\r\n\t$send = new ContactSendMail($contact);\r\n\t$send-&gt;shoot();\r\n}<\/pre>\n<h2>Conclus\u00e3o<\/h2>\n<p>Cada classe tem o nome coerente do que \u00e9 respons\u00e1vel, facilitando assim a forma de trabalhar com elas.<\/p>\n<p>\u00c9 importante ressaltar, que a quest\u00e3o n\u00e3o \u00e9 ter um m\u00e9todo por classe, e sim que os m\u00e9todos dessa classe sejam coerentes com que o que classe se prop\u00f5e a fazer.<\/p>\n<p>Caso queira se aprofundar mais sobre SOLID, utilizando no PHP, temos um excelente curso sobre o tema, que voc\u00ea pode assistir uma pr\u00e9via acessando:\u00a0<a href=\"https:\/\/www.mxcursos.com\/curso-de-solid-com-php\" target=\"_blank\" rel=\"noopener noreferrer\">Curso de SOLID com PHP<\/a><\/p>\n<p>E voc\u00ea? J\u00e1 usou o SOLID em alguma aplica\u00e7\u00e3o? Deixe seu coment\u00e1rio abaixo e compartilhe sua experi\u00eancia conosco.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma classe precisa ter uma \u00fanica responsabilidade e apenas um motivo para alter\u00e1-la. \u00c9 o que informa o SRP &#8211;\u00a0Single Responsability Principle (Principio da Responsabilidade \u00fanica), que \u00e9 um dos componentes do SOLID. O que \u00e9 o SOLID O SOLID \u00e9 um conjunto de orienta\u00e7\u00f5es para voc\u00ea possa trabalhar melhor com a Orienta\u00e7\u00e3o a Objeto. [&hellip;]<\/p>\n","protected":false},"author":67,"featured_media":15307,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1178],"tags":[],"class_list":["post-7365","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacao"],"_links":{"self":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts\/7365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/users\/67"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/comments?post=7365"}],"version-history":[{"count":0,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/posts\/7365\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/media\/15307"}],"wp:attachment":[{"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/media?parent=7365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/categories?post=7365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mxcursos.com\/blog\/wp-json\/wp\/v2\/tags?post=7365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}