{"id":4071,"date":"2024-12-14T09:00:36","date_gmt":"2024-12-14T06:00:36","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2024\/12\/14\/dry-matters\/"},"modified":"2024-12-16T22:32:09","modified_gmt":"2024-12-16T19:32:09","slug":"dry-matters","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2024\/12\/14\/dry-matters\/","title":{"rendered":"Por que SECO \u00e9 importante"},"content":{"rendered":"<p>Existem muitos artigos sobre o tema DRY, recomendo a leitura da fonte original &#8220;The Pragmatist Programmer&#8221; de Andy Hunt e Dave Thomas. No entanto, ainda vejo quantos desenvolvedores t\u00eam d\u00favidas sobre esse princ\u00edpio no desenvolvimento de software.<\/p>\n<p>O princ\u00edpio DRY afirma que n\u00e3o devemos nos repetir, isso se aplica tanto ao c\u00f3digo quanto aos processos que realizamos como programadores. C\u00f3digo de exemplo que viola DRY:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-swift\" data-lang=\"Swift\"><code>class Client {\n    public let name: String\n    private var messages: [String] = []\n    \n    init(name: String) {\n        self.name = name\n    }\n    \n    func receive(_ message: String) {\n        messages.append(message)\n    }\n}\n\nclass ClientController {\n    func greet(client: Client?) {\n        guard let client else {\n            debugPrint(\"No client!\")\n            return\n        }\n        client.receive(\"Hello \\(client.name)!\")\n    }\n\n    func goodbye(client: Client?) {\n        guard let client else {\n            debugPrint(\"No client!!\")\n            return\n        }\n        client.receive(\"Bye \\(client.name)!\")\n    }\n}\n<\/code><\/pre>\n<\/div>\n<p>Como voc\u00ea pode ver nos m\u00e9todos greet e adeus, uma inst\u00e2ncia opcional da classe Client \u00e9 passada, que ent\u00e3o precisa ser verificada quanto a zero, e ent\u00e3o voc\u00ea pode come\u00e7ar a trabalhar com ela. Para cumprir o m\u00e9todo DRY, voc\u00ea precisa remover a verifica\u00e7\u00e3o nula duplicada da inst\u00e2ncia da classe. Isto pode ser implementado de v\u00e1rias maneiras; uma op\u00e7\u00e3o \u00e9 passar a inst\u00e2ncia para o construtor da classe, ap\u00f3s o que n\u00e3o haver\u00e1 necessidade de verifica\u00e7\u00f5es.<\/p>\n<p>Mantemos o DRY especializando o ClientController em uma \u00fanica inst\u00e2ncia do Client:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-swift\" data-lang=\"Swift\"><code>class Client {\n    public let name: String\n    private var messages: [String] = []\n    \n    init(name: String) {\n        self.name = name\n    }\n    \n    func receive(_ message: String) {\n        messages.append(message)\n    }\n}\n\nclass ClientController {\n    private let client: Client\n\n    init(client: Client) {\n        self.client = client\n    }\n\n    func greet() {\n        client.receive(\"Hello \\(client.name)!\")\n    }\n\n    func goodbye() {\n        client.receive(\"Bye \\(client.name)!\")\n    }\n}\n<\/code><\/pre>\n<\/div>\n<p>DRY tamb\u00e9m diz respeito a processos que ocorrem durante o desenvolvimento de software. Vamos imaginar uma situa\u00e7\u00e3o em que uma equipe de desenvolvimento tenha que carregar uma vers\u00e3o no mercado por conta pr\u00f3pria, distraindo-a do desenvolvimento de software; isso tamb\u00e9m \u00e9 uma viola\u00e7\u00e3o do DRY; Essa situa\u00e7\u00e3o \u00e9 resolvida conectando-se um pipeline de CI\/CD, no qual o release \u00e9 liberado automaticamente, sujeito a determinadas condi\u00e7\u00f5es atendidas pelos desenvolvedores.<\/p>\n<p>Em geral, DRY trata da aus\u00eancia de repeti\u00e7\u00f5es tanto nos processos quanto no c\u00f3digo, isso tamb\u00e9m \u00e9 importante pela presen\u00e7a do fator humano: c\u00f3digo que cont\u00e9m c\u00f3digo menos repetitivo e barulhento \u00e9 mais f\u00e1cil de verificar se h\u00e1 erros; Os processos automatizados impossibilitam que as pessoas cometam erros ao execut\u00e1-los, porque n\u00e3o h\u00e1 nenhum ser humano envolvido.<\/p>\n<p>Steve Jobs tinha um ditado: \u201cUma linha de c\u00f3digo que voc\u00ea nunca precisou escrever \u00e9 uma linha de c\u00f3digo que voc\u00ea nunca precisou depurar\u201d.<\/p>\n<h2>Fontes<\/h2>\n<p><a href=\"https:\/\/pragprog.com\/titles\/tpp20\/the-pragmatic-programmer-20th-anniversary-edition\/\" rel=\"noopener\" target=\"_blank\">https:\/\/pragprog.com\/titles\/tpp20\/the-pragmatic-programmer-20th-anniversary-edition\/<\/a><br \/>\n<a href=\"https:\/\/youtu.be\/-msIEOGvTYM\" rel=\"noopener\" target=\"_blank\">https:\/\/youtu.be\/-msIEOGvTYM<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Existem muitos artigos sobre o tema DRY, recomendo a leitura da fonte original &#8220;The Pragmatist Programmer&#8221; de Andy Hunt e Dave Thomas. No entanto, ainda vejo quantos desenvolvedores t\u00eam d\u00favidas sobre esse princ\u00edpio no desenvolvimento de software. O princ\u00edpio DRY afirma que n\u00e3o devemos nos repetir, isso se aplica tanto ao c\u00f3digo quanto aos processos<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/pt\/2024\/12\/14\/dry-matters\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Por que SECO \u00e9 importante&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[49],"tags":[],"class_list":["post-4071","post","type-post","status-publish","format-standard","hentry","category-blog","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"pt","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=4071"}],"version-history":[{"count":7,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4071\/revisions"}],"predecessor-version":[{"id":4078,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4071\/revisions\/4078"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=4071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=4071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=4071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}