{"id":1105,"date":"2012-04-30T21:38:08","date_gmt":"2012-05-01T00:38:08","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=1105"},"modified":"2012-04-30T23:59:01","modified_gmt":"2012-05-01T02:59:01","slug":"como-o-tal-do-solid-pode-melhorar-seu-projeto-orientado-a-objetos","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=1105","title":{"rendered":"Como o tal do SOLID pode melhorar seu projeto orientado a objetos"},"content":{"rendered":"<figure id=\"attachment_1106\" aria-describedby=\"caption-attachment-1106\" style=\"width: 300px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/robert_c_martin.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1106\" title=\"robert_c_martin\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/robert_c_martin.jpg\" alt=\"\" width=\"300\" height=\"200\" \/><\/a><figcaption id=\"caption-attachment-1106\" class=\"wp-caption-text\">Robert C. Martin, um dos her\u00f3is Kiconianos<\/figcaption><\/figure>\n<p>\u00c9 chocante ver o qu\u00e3o subaproveitada a orienta\u00e7\u00e3o a objetos \u00e9. Interessante \u00e9 que s\u00f3 se percebe isto quando mudamos nossas leituras. No &#8220;Pante\u00e3o Kiconiano de Her\u00f3is&#8221; h\u00e1 um chamado Robert C. Martin, que agrupou cinco princ\u00edpios b\u00e1sicos do design orientado a objetos sob o acr\u00f4nimo <strong>SOLID<\/strong>.<\/p>\n<p>Quando tomei conhecimento deste acr\u00f4nimo minha vida melhorou bastante e, acredito, a sua tamb\u00e9m a partir de agora caso este seja seu primeiro contato com o tema.<\/p>\n<p>Mas antes de entrar no assunto, acredito que seja interessante fazer uma revis\u00e3o do meu pr\u00f3prio desenrolar enquanto criador de objetos. Talvez nossa hist\u00f3ria seja similar e, nesta identifica\u00e7\u00e3o eu lhe ajude de alguma maneira.<\/p>\n<h2><strong>Meus primeiros objetos<\/strong><\/h2>\n<p>Quando ouvi falar em orienta\u00e7\u00e3o a objetos a primeira coisa que me veio \u00e0 cabe\u00e7a foi reutiliza\u00e7\u00e3o de c\u00f3digo, mas n\u00e3o esta reutiliza\u00e7\u00e3o bonita que as pessoas estufam o peito pra falar. Meu racioc\u00ednio b\u00e1sico naquela \u00e9poca era:<\/p>\n<blockquote><p>&#8220;Hmm&#8230; bacana este neg\u00f3cio de orienta\u00e7\u00e3o a objetos hein? Por que com isto eu posso pegar todo o meu c\u00f3digo que fico repetindo em um monte de lugares, incluir em uma classe e, em seguida, simplesmente ir criando classes filhas desta. Assim, sempre que surgir alguma coisa que eu use em mais de um lugar, eu incluo apenas naquela classe e todas as outras ter\u00e3o acesso. Genial!&#8221;<\/p><\/blockquote>\n<p>Quando me lembro estufando o peito para falar isto naquela \u00e9poca n\u00e3o consigo conter as gargalhadas que dou de mim mesmo. Isto porque na minha cabe\u00e7a sistemas deviam ser projetados tal como no diagrama abaixo:<\/p>\n<figure id=\"attachment_1107\" aria-describedby=\"caption-attachment-1107\" style=\"width: 669px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/ClasseGlobalBruta.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1107\" title=\"ClasseGlobalBruta\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/ClasseGlobalBruta.png\" alt=\"\" width=\"669\" height=\"326\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/ClasseGlobalBruta.png 669w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/ClasseGlobalBruta-300x146.png 300w\" sizes=\"(max-width: 669px) 100vw, 669px\" \/><\/a><figcaption id=\"caption-attachment-1107\" class=\"wp-caption-text\">Ah... o &quot;reaproveitamento de c\u00f3digo&quot;<\/figcaption><\/figure>\n<p>Pra que uma classe Object b\u00e1sica se eu podia ter a minha pr\u00f3pria classe &#8220;Global&#8221;? E o mais bacana \u00e9 que eu podia instanciar a classe Global e us\u00e1-la em diversos pontos diferentes do sistema. Um design &#8220;lindo&#8221;!<\/p>\n<p>Foi quando ouvi falar de um princ\u00edpio de design chamado de <em>responsabilidade \u00fanica<\/em> (<strong>S<\/strong>ingle Responsability em ingl\u00eas).<\/p>\n<h2>Responsabilidade \u00danica (Single Responsability (SRO))<\/h2>\n<p>Este princ\u00edpio diz o seguinte: uma classe deve possuir <strong>uma<\/strong>, e apenas <strong>uma<\/strong> responsabilidade, ou seja, deve ser especializada de tal modo que execute apenas uma tarefa e, de prefer\u00eancia, de uma forma bem feita. Eu olhava pro meu design original e uma vergonha imensa me consumia porque ficava n\u00edtido que a minha classe &#8220;Global&#8221; era quase divina, pois fazia <strong>um pouco de tudo<\/strong>.<\/p>\n<p>Este termo foi cunhado por Robert C. Martin (aka <em>Uncle Bob<\/em>) em um texto chamado &#8220;<a href=\"http:\/\/www.objectmentor.com\/resources\/articles\/srp.pdf\">The Single Responsability Principle<\/a>&#8220;. Por responsabilidade, entenda uma &#8220;raz\u00e3o para que o c\u00f3digo seja modificado&#8221;. Imagine por exemplo um relat\u00f3rio. Em um design original, poder\u00edamos implementar uma classe que fosse respons\u00e1vel pela extra\u00e7\u00e3o dos dados, processamento dos mesmos e, pra finalizar, a exposi\u00e7\u00e3o dos dados. Resumindo, poder\u00edamos implementar este objeto como uma &#8220;<em>classona<\/em>&#8220;. Nesta classe h\u00e1 tr\u00eas responsabilidades:<\/p>\n<ul>\n<li>Extra\u00e7\u00e3o dos dados<\/li>\n<li>Processamento dos dados<\/li>\n<li>Impress\u00e3o dos resultados<\/li>\n<\/ul>\n<p>Seguindo este princ\u00edpio, poder\u00edamos refatorar este monstrinho para que fosse composto por tr\u00eas classes, tal como no diagrama abaixo:<\/p>\n<figure id=\"attachment_1109\" aria-describedby=\"caption-attachment-1109\" style=\"width: 500px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/srp_aplicada.png\"><img decoding=\"async\" class=\"size-full wp-image-1109 \" title=\"srp_aplicada\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/srp_aplicada.png\" alt=\"\" width=\"500\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/srp_aplicada.png 898w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/srp_aplicada-300x36.png 300w\" sizes=\"(max-width: 898px) 100vw, 898px\" \/><\/a><figcaption id=\"caption-attachment-1109\" class=\"wp-caption-text\">Como dizem aqui em Minas Gerais: &quot;agora o trem t\u00e1 chique!&quot;<\/figcaption><\/figure>\n<p>O ganho \u00e9 imediato neste novo design, porque as consequ\u00eancias das mudan\u00e7as est\u00e1 bem mais controlada. Se eu alterar a classe que extrai dados, apenas esta ser\u00e1 afetada. O processador de dados pode at\u00e9 receber dados equivocados, mas como seu papel \u00e9 process\u00e1-los, posso incluir um tratamento de erros que s\u00f3 diz respeito a si mesma. E tamb\u00e9m posso trocar a sa\u00edda do meu relat\u00f3rio precisando fazer modifica\u00e7\u00f5es em apenas uma classe.<\/p>\n<p>E sabe o que \u00e9 mais legal? Como o c\u00f3digo fonte de cada classe \u00e9 menor do que o daquela <em>classona<\/em> inicial, eu compreendo muito melhor o funcionamento de cada componente. E com isto os meus bugs diminuem bastante.<\/p>\n<h2>Fechado para modifica\u00e7\u00f5es, aberto para expans\u00e3o (Open Closed Principle (OCP))<\/h2>\n<p>Depois que aprendi o conceito de responsabilidade \u00fanica minha vida melhorou bastante enquanto eu era um desenvolvedor solit\u00e1rio. Mas a partir do momento em que passei a trabalhar em equipes maiores, minha vida come\u00e7ou a se complicar pois nem sempre o meu c\u00f3digo executava exatamente como eu queria. Era engra\u00e7ado, meu processador de dados, por exemplo, muitas vezes me gerava resultados completamente malucos quando este deveria ser sempre o \u00fanico.<\/p>\n<p>Quando eu ia descobrir o resultado, descobria sempre que algum &#8220;engra\u00e7adinho&#8221; havia feito com meu sistema algo como o exposto no diagrama abaixo:<\/p>\n<figure id=\"attachment_1113\" aria-describedby=\"caption-attachment-1113\" style=\"width: 600px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/ocp_bruto.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1113\" title=\"ocp_bruto\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/ocp_bruto.png\" alt=\"\" width=\"600\" height=\"214\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/ocp_bruto.png 600w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/ocp_bruto-300x107.png 300w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><figcaption id=\"caption-attachment-1113\" class=\"wp-caption-text\">Equipe danadinha!<\/figcaption><\/figure>\n<p>A culpa n\u00e3o era da equipe, mas minha. Projetei o sistema inicialmente de tal maneira que qualquer um poderia sobrescrever o m\u00e9todo <em>processe<\/em> da classe <em>Processador de Dados<\/em> livremente. Como resultado, eu n\u00e3o tinha mais a uniformidade do conceito de processamento de dados neste sistema. Dependendo do contexto, isto pode ser \u00f3timo, mas neste que estou aplicando \u00e9 p\u00e9ssimo. O resultado em Java para este problema seria muito f\u00e1cil de ser resolvido. Na primeira vers\u00e3o que liberei eu devia ter implementado o m\u00e9todo <em>processe<\/em> na classe original como <em>final<\/em>. Voil\u00e1, ningu\u00e9m mais o substituiria.<\/p>\n<p>Mas por que na pr\u00e1tica eu fecho para modifica\u00e7\u00f5es uma classe? A raz\u00e3o \u00e9 simples: porque assim eu posso desenvolver meu software como se fosse em camadas. Estando uma camada muito bem escrita e bem definida, eu tenho certeza de que todas as classes derivadas tamb\u00e9m funcionar\u00e3o bem. As classes derivadas na pr\u00e1tica poder\u00edam apenas usar os m\u00e9todos fechados e acrescentar novos comportamentos ao sistema conforme novas necessidades fossem surgindo.<\/p>\n<p>Tio Bob tem um excelente artigo sobre isto neste <a href=\"http:\/\/www.objectmentor.com\/resources\/articles\/ocp.pdf\">link<\/a>.<\/p>\n<h2>O princ\u00edpio de substitui\u00e7\u00e3o de Liskov (Liskov Substitution Principle)<\/h2>\n<p>O meu <em>Processador de Dados<\/em> semrpe envia os dados para o impressor de resultados e espera um valor inteiro como resposta que representa o sucesso ou falha da impress\u00e3o. Normalmente este valor \u00e9 positivo caso tudo ocorra bem e negativo caso contr\u00e1rio. Sendo assim, internamente na minha classe <em>Processador de Dados<\/em> h\u00e1 um m\u00e9todo chamado imprima, chamado pelo m\u00e9todo <em>processe<\/em> tal como no exemplo abaixo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\npublic final void processe() { \/\/ ah... aprendi com o princ\u00edpio OCP\r\n\r\n\/\/ bla bla bla\r\n\r\nif (getImpressor().imprima(resultado) &gt; 0) {\r\n\/\/ execute uma sauda\u00e7\u00e3o feliz\r\n} else {\r\n\/\/ avise ao presidente que estamos sofrendo um ataque nuclear\r\n}\r\n\r\n}\r\n\r\n<\/pre>\n<p>No caso, estamos lidando com uma conven\u00e7\u00e3o. Nosso processador de dados <strong>espera<\/strong> que nosso objeto impressor possua um comportamento bem definido. Se algum mal informado de nossa equipe resolver implementar uma classe de impress\u00e3o que haja de maneira distinta, veremos um presidente tendo um ataque do cora\u00e7\u00e3o.<\/p>\n<p>Basicamente isto \u00e9 o que chamamos de princ\u00edpio de substitui\u00e7\u00e3o de Liskov (s\u00f3 por curiosidade, Liskov \u00e9 uma mulher, e se chama <a href=\"http:\/\/www.pmg.lcs.mit.edu\/~liskov\/\">Barbara<\/a>). No projeto de nossos sistemas, devemos proceder de tal maneira que, ao implementarmos nossas classes filhas, o fa\u00e7amos de tal maneira que as classes clientes n\u00e3o sofram surpresas desagrad\u00e1veis como a que descrevi acima.<\/p>\n<p>E adivinha? Uncle Bob explica este conceito muito melhor do que eu neste <a href=\"http:\/\/www.objectmentor.com\/resources\/articles\/lsp.pdf\">artigo<\/a>.<\/p>\n<h2>Princ\u00edpio de Segrega\u00e7\u00e3o de Interfaces (Interface Segregation Principle (ISP))<\/h2>\n<p>Meu extrator de dados era muito bom. T\u00e3o bom que eu comecei a inserir em seu corpo uma s\u00e9rie de outros m\u00e9todos que eram usados por outras classes al\u00e9m do meu processador de dados. Terminei meu projeto com uma carinha similar \u00e0 da imagem abaixo:<\/p>\n<figure id=\"attachment_1119\" aria-describedby=\"caption-attachment-1119\" style=\"width: 779px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/isp_bruto.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1119\" title=\"isp_bruto\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/isp_bruto.png\" alt=\"\" width=\"779\" height=\"355\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/isp_bruto.png 779w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/isp_bruto-300x136.png 300w\" sizes=\"(max-width: 779px) 100vw, 779px\" \/><\/a><figcaption id=\"caption-attachment-1119\" class=\"wp-caption-text\">O extrator de dados mais popular do quarteir\u00e3o<\/figcaption><\/figure>\n<p>Conforme o extrator de dados foi crescendo, ficou n\u00edtido que sua interface tamb\u00e9m cresceu. E de repente meu Processador de Dados tinha de lidar com uma interface bem mais complexa do que a original. De repente esta classe tem conhecimento de outras que n\u00e3o devia sonhar com a exist\u00eancia, como por exemplo <em>DadosMaravilhosos<\/em> e <em>DadosLindos<\/em>. Lembra que um dos princ\u00edpios b\u00e1sicos por tr\u00e1s da OO \u00e9 o encapsulamento? Nosso <em>processador<\/em> s\u00f3 precisa conhecer o m\u00e9todo <em>extrairDados<\/em> e a classe <em>Dados<\/em>.<\/p>\n<p>O princ\u00edpio de segrega\u00e7\u00e3o de interface diz o seguinte: se uma interface come\u00e7a a engordar, devemos parti-la em diversas novas interfaces de tal modo que cada cliente s\u00f3 conhe\u00e7a aquilo que de fato lhe diz respeito. Ent\u00e3o modifiquei meu sistema para que ficasse como no diagrama abaixo:<\/p>\n<figure id=\"attachment_1120\" aria-describedby=\"caption-attachment-1120\" style=\"width: 560px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/isp_efetiva.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1120\" title=\"isp_efetiva\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/isp_efetiva.png\" alt=\"\" width=\"560\" height=\"496\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/isp_efetiva.png 560w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/isp_efetiva-300x265.png 300w\" sizes=\"(max-width: 560px) 100vw, 560px\" \/><\/a><figcaption id=\"caption-attachment-1120\" class=\"wp-caption-text\">Ficou chique!<\/figcaption><\/figure>\n<p>Nesta segunda vers\u00e3o quebramos a interface original do <em>Extrator de Dados<\/em> em tr\u00eas: uma para cada cliente. Com isto tivemos uma s\u00e9rie de ganhos interessantes:<\/p>\n<ul>\n<li>Cada cliente s\u00f3 conhece as classes e os m\u00e9todos de que realmente precisa<\/li>\n<li>Temos um desenvolvimento realmente voltado para interfaces<\/li>\n<li>Temos um menor acoplamento no sistema (ei, mais sobre isto no pr\u00f3ximo princ\u00edpio)<\/li>\n<\/ul>\n<p>\u00c9 interessante observar como que, na pr\u00e1tica, adicionando um n\u00famero maior de elementos no nosso sistema, acabamos por diminuir o custo de manuten\u00e7\u00e3o. Isto porque podemos trabalhar nas classes cliente isoladamente de uma forma mais segura, visto que temos um acoplamento menor.<\/p>\n<p>Ei, Robert Martin tem um texto sobre o assunto <a href=\"http:\/\/www.objectmentor.com\/resources\/articles\/isp.pdf\">tamb\u00e9m<\/a>!<\/p>\n<h2>Princ\u00edpio de Invers\u00e3o de Depend\u00eancias (Dependency Inversion Principle (DIP))<\/h2>\n<p>Observe o diagrama abaixo que corresponde \u00e0 primeira vers\u00e3o evolu\u00edda do nosso sistema. Al\u00e9m dos problemas apresentados nos \u00faltimos quatro princ\u00edpios, consegue identificar mais alguma falha?<\/p>\n<figure id=\"attachment_1109\" aria-describedby=\"caption-attachment-1109\" style=\"width: 500px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/srp_aplicada.png\"><img decoding=\"async\" class=\"size-full wp-image-1109 \" title=\"srp_aplicada\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/srp_aplicada.png\" alt=\"\" width=\"500\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/srp_aplicada.png 898w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/srp_aplicada-300x36.png 300w\" sizes=\"(max-width: 898px) 100vw, 898px\" \/><\/a><figcaption id=\"caption-attachment-1109\" class=\"wp-caption-text\">Cad\u00ea o problema?<\/figcaption><\/figure>\n<p>Suponha que um dia comercializemos nosso <em>Processador de Dados<\/em>, e que queiramos variar as formas de obten\u00e7\u00e3o de dados ou de impress\u00e3o de resultados. Como far\u00edamos? Claro, poder\u00edamos implementar alguma l\u00f3gica dentro das classes relativas de tal modo que algum flag definisse qual a origem das informa\u00e7\u00f5es e como gostar\u00edamos de apresentar os resultados, certo?<\/p>\n<p>Ou poder\u00edamos tamb\u00e9m definir em tempo de execu\u00e7\u00e3o qual classe instanciar, como fazemos por exemplo usando um container de inje\u00e7\u00e3o de depend\u00eancias. S\u00e3o duas solu\u00e7\u00f5es, mas o problema persiste: nosso processador de dados conhece <strong>demais<\/strong> as suas depend\u00eancias. O princ\u00edpio de invers\u00e3o de depend\u00eancias diz o seguinte:<\/p>\n<blockquote><p>Um m\u00f3dulo de n\u00edvel superior n\u00e3o deve depender diretamente de m\u00f3dulos de n\u00edveis inferiores, mas de abstra\u00e7\u00f5es (e m\u00f3dulos de n\u00edveis inferiores tamb\u00e9m devem depender de abstra\u00e7\u00f5es).<br \/>\nAbstra\u00e7\u00f5es n\u00e3o devem depender de detalhes de implementa\u00e7\u00e3o, mas sim o contr\u00e1rio.<\/p><\/blockquote>\n<p>Este princ\u00edpio \u00e9 poderos\u00edssimo, e \u00e9 a base por tr\u00e1s do conceito de inje\u00e7\u00e3o de depend\u00eancias. Primeiramente, o que \u00e9 uma abstra\u00e7\u00e3o? \u00c9 a generaliza\u00e7\u00e3o de um comportamento excluindo todos os seus detalhes de implementa\u00e7\u00e3o. No mundo da orienta\u00e7\u00e3o a objetos, corresponde \u00e0s interfaces ou classes abstratas\/pai.<\/p>\n<p>E o que \u00e9 um m\u00f3dulo de n\u00edvel superior? \u00c9 aquele aonde normalmente se encontra encapsulada a l\u00f3gica de neg\u00f3cio do nosso sistema. E de n\u00edvel mais baixo? Aquele que n\u00e3o est\u00e1 diretamente ligado ao objetivo do sistema, como por exemplo nosso extrator de dados e o impressor de resultados.<\/p>\n<p>Neste caso, voc\u00ea me pergunta: como eu arrumo este sistema? Simples, como no diagrama abaixo:<\/p>\n<p><a href=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/dip_efetivo.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1122\" title=\"dip_efetivo\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/dip_efetivo.png\" alt=\"\" width=\"600\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/dip_efetivo.png 880w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/dip_efetivo-300x121.png 300w\" sizes=\"(max-width: 880px) 100vw, 880px\" \/><\/a><\/p>\n<p>Repare: o <em>Processador de Dados<\/em> n\u00e3o precisa mais saber detalhes sobre a implementa\u00e7\u00e3o do <em>Impressor<\/em> ou do <em>Extrator<\/em>. Ele s\u00f3 precisa lidar com as abstra\u00e7\u00f5es dos mesmos. Podemos agora substituir facilmente suas implementa\u00e7\u00f5es sem o risco de obtermos comportamentos inesperados no nosso sistema. Resumindo: resolvemos o problema do <em>alto acoplamento<\/em>.<\/p>\n<p>Um dos textos mais importantes da minha carreira \u00e9 este: <em><a href=\"http:\/\/www.objectmentor.com\/resources\/articles\/dip.pdf\">&#8220;The Dependency Inversion Principle&#8221;<\/a><\/em> de voc\u00ea j\u00e1 sabe quem. Caso este meu post te leve a ler este artigo, me dou por realizado, porque foi um dos raros que literalmente <strong>mudou minha carreira.<\/strong> A prop\u00f3sito, eu tenho um artigo inteiro sobre isto neste <a href=\"https:\/\/devkico.itexto.com.br\/?p=859\">link <\/a>(e estou escrevendo um livro sobre o assunto).<\/p>\n<h2>E o que \u00e9 o tal do SOLID hein?<\/h2>\n<p>S\u00e3o os cinco princ\u00edpios que expus de uma maneira bem light acima:<\/p>\n<p><strong>S<\/strong>ingle Responsability Principle (Responsabilidade \u00danica)<br \/>\n<strong>O<\/strong>pen Closed Principle (Aberto para expans\u00e3o, fechado para modifica\u00e7\u00e3o)<br \/>\n<strong>L<\/strong>iskov Substitution Principle (Princ\u00edpio de Substitui\u00e7\u00e3o de Liskov)<br \/>\n<strong>I<\/strong>nterface Segregation Principle (Princ\u00edpio de Segrega\u00e7\u00e3o de Interface)<br \/>\n<strong>D<\/strong>ependency Inversion Principle (Princ\u00edpio de Invers\u00e3o de Depend\u00eancias)<\/p>\n<p>Sugest\u00e3o: leia cada um dos artigos que citei no corpo do texto e, semana a semana, dedique-se a pensar em apenas um destes. Eu te garanto: voc\u00ea se tornar\u00e1 um desenvolvedor <strong>muito, mas muito melhor<\/strong>.<\/p>\n<p>Fica a dica ;)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00c9 chocante ver o qu\u00e3o subaproveitada a orienta\u00e7\u00e3o a objetos \u00e9. Interessante \u00e9 que s\u00f3 se percebe isto quando mudamos nossas leituras. No &#8220;Pante\u00e3o Kiconiano de Her\u00f3is&#8221; h\u00e1 um chamado Robert C. Martin, que agrupou cinco princ\u00edpios b\u00e1sicos do design orientado a objetos sob o acr\u00f4nimo SOLID. Quando tomei conhecimento deste acr\u00f4nimo minha vida melhorou [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[35,36,34],"tags":[],"class_list":["post-1105","post","type-post","status-publish","format-standard","hentry","category-armadilhas","category-desenvolvimento-de-software","category-paideia"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Como o tal do SOLID pode melhorar seu projeto orientado a objetos - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=1105\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Como o tal do SOLID pode melhorar seu projeto orientado a objetos - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"\u00c9 chocante ver o qu\u00e3o subaproveitada a orienta\u00e7\u00e3o a objetos \u00e9. Interessante \u00e9 que s\u00f3 se percebe isto quando mudamos nossas leituras. No &#8220;Pante\u00e3o Kiconiano de Her\u00f3is&#8221; h\u00e1 um chamado Robert C. Martin, que agrupou cinco princ\u00edpios b\u00e1sicos do design orientado a objetos sob o acr\u00f4nimo SOLID. Quando tomei conhecimento deste acr\u00f4nimo minha vida melhorou [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=1105\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2012-05-01T00:38:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-05-01T02:59:01+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2012\/04\/robert_c_martin.jpg\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1105\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=1105\",\"name\":\"Como o tal do SOLID pode melhorar seu projeto orientado a objetos - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1105#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1105#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/robert_c_martin.jpg\",\"datePublished\":\"2012-05-01T00:38:08+00:00\",\"dateModified\":\"2012-05-01T02:59:01+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1105#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=1105\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1105#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/robert_c_martin.jpg\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/robert_c_martin.jpg\",\"width\":\"300\",\"height\":\"200\",\"caption\":\"Robert C. Martin, um dos her\u00f3is Kiconianos\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=1105#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Como o tal do SOLID pode melhorar seu projeto orientado a objetos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Como o tal do SOLID pode melhorar seu projeto orientado a objetos - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=1105","og_locale":"pt_BR","og_type":"article","og_title":"Como o tal do SOLID pode melhorar seu projeto orientado a objetos - \/dev\/Kico","og_description":"\u00c9 chocante ver o qu\u00e3o subaproveitada a orienta\u00e7\u00e3o a objetos \u00e9. Interessante \u00e9 que s\u00f3 se percebe isto quando mudamos nossas leituras. No &#8220;Pante\u00e3o Kiconiano de Her\u00f3is&#8221; h\u00e1 um chamado Robert C. Martin, que agrupou cinco princ\u00edpios b\u00e1sicos do design orientado a objetos sob o acr\u00f4nimo SOLID. Quando tomei conhecimento deste acr\u00f4nimo minha vida melhorou [&hellip;]","og_url":"https:\/\/devkico.itexto.com.br\/?p=1105","og_site_name":"\/dev\/Kico","article_published_time":"2012-05-01T00:38:08+00:00","article_modified_time":"2012-05-01T02:59:01+00:00","og_image":[{"url":"http:\/\/www.itexto.net\/devkico\/wp-content\/uploads\/2012\/04\/robert_c_martin.jpg"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=1105","url":"https:\/\/devkico.itexto.com.br\/?p=1105","name":"Como o tal do SOLID pode melhorar seu projeto orientado a objetos - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=1105#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=1105#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/robert_c_martin.jpg","datePublished":"2012-05-01T00:38:08+00:00","dateModified":"2012-05-01T02:59:01+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=1105#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=1105"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=1105#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/robert_c_martin.jpg","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2012\/04\/robert_c_martin.jpg","width":"300","height":"200","caption":"Robert C. Martin, um dos her\u00f3is Kiconianos"},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=1105#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Como o tal do SOLID pode melhorar seu projeto orientado a objetos"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/1105"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1105"}],"version-history":[{"count":18,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/1105\/revisions"}],"predecessor-version":[{"id":1128,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/1105\/revisions\/1128"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}