[{"data":1,"prerenderedAt":2028},["ShallowReactive",2],{"blog-principio-solid":3},{"id":4,"title":5,"author":6,"body":7,"date":2012,"description":2013,"extension":2014,"faq":2015,"image":2016,"meta":2017,"navigation":187,"path":2018,"seo":2019,"stem":2020,"tags":2021,"updated":2015,"__hash__":2027},"blog\u002Fblog\u002Fprincipio-solid.md","SOLID: 5 Princípios para Escrever Código Limpo e Escalável","Larissa Santos",{"type":8,"value":9,"toc":2001},"minimark",[10,14,17,20,23,26,31,39,73,76,78,82,87,90,93,227,230,233,356,367,369,373,378,381,384,554,557,839,846,848,852,857,860,878,1129,1143,1146,1148,1152,1157,1160,1163,1316,1319,1521,1524,1526,1530,1535,1538,1552,1658,1664,1918,1921,1923,1927,1930,1933,1950,1953,1955,1959,1962,1965,1968,1972,1997],[11,12,13],"p",{},"Se você já abriu um arquivo de código antigo e sentiu aquela mistura de vergonha e confusão, você não está sozinha. Todo desenvolvedor tem esse momento. E muitas vezes, o que está por trás desse código difícil de entender não é falta de conhecimento técnico: é falta de estrutura.",[11,15,16],{},"É aí que entram os princípios SOLID.",[11,18,19],{},"SOLID é um conjunto de cinco diretrizes para escrever código orientado a objetos que seja mais fácil de manter, estender e entender. Não são regras gravadas em pedra, são princípios que, quando internalizados, mudam a forma como você pensa na hora de organizar seu código.",[11,21,22],{},"Neste artigo vamos passar por cada um dos cinco princípios com exemplos práticos em JavaScript. A ideia não é decorar as siglas, é entender o problema que cada uma resolve.",[24,25],"hr",{},[27,28,30],"h2",{"id":29},"de-onde-veio-o-solid","De onde veio o SOLID?",[11,32,33,34,38],{},"O acrônimo foi popularizado por ",[35,36,37],"strong",{},"Robert C. Martin",", o Uncle Bob, e reúne cinco princípios que já existiam de forma dispersa na comunidade de engenharia de software. Cada letra representa um princípio:",[40,41,42,49,55,61,67],"ul",{},[43,44,45,48],"li",{},[35,46,47],{},"S"," — Single Responsibility Principle",[43,50,51,54],{},[35,52,53],{},"O"," — Open\u002FClosed Principle",[43,56,57,60],{},[35,58,59],{},"L"," — Liskov Substitution Principle",[43,62,63,66],{},[35,64,65],{},"I"," — Interface Segregation Principle",[43,68,69,72],{},[35,70,71],{},"D"," — Dependency Inversion Principle",[11,74,75],{},"Pode parecer intimidador à primeira vista, mas você vai perceber que a maioria desses princípios faz sentido intuitivo quando você vê o problema que eles estão tentando resolver.",[24,77],{},[27,79,81],{"id":80},"s-single-responsibility-principle","S — Single Responsibility Principle",[11,83,84],{},[35,85,86],{},"Uma classe deve ter uma única razão para mudar.",[11,88,89],{},"Traduzindo para o dia a dia: cada pedaço de código deve ser responsável por uma coisa só. Quando você mistura responsabilidades em um lugar só, qualquer mudança em uma delas pode quebrar as outras. E pior: você nunca sabe exatamente onde mexer quando algo dá errado.",[11,91,92],{},"Imagine uma classe que cria um usuário no banco de dados e também envia o e-mail de boas-vindas:",[94,95,100],"pre",{"className":96,"code":97,"language":98,"meta":99,"style":99},"language-js shiki shiki-themes material-theme-lighter github-dark github-dark","\u002F\u002F ❌ Fazendo coisas demais no mesmo lugar\nclass Usuario {\n  criar(usuario) {\n    \u002F\u002F salva no banco\n    console.log('Usuário salvo no banco')\n\n    \u002F\u002F envia e-mail logo em seguida\n    console.log('E-mail de boas-vindas enviado')\n  }\n}\n","js","",[101,102,103,112,127,146,152,182,189,195,215,221],"code",{"__ignoreMap":99},[104,105,108],"span",{"class":106,"line":107},"line",1,[104,109,111],{"class":110},"sutJx","\u002F\u002F ❌ Fazendo coisas demais no mesmo lugar\n",[104,113,115,119,123],{"class":106,"line":114},2,[104,116,118],{"class":117},"sFsEu","class",[104,120,122],{"class":121},"soiBB"," Usuario",[104,124,126],{"class":125},"sG-J9"," {\n",[104,128,130,134,137,141,144],{"class":106,"line":129},3,[104,131,133],{"class":132},"s0u7J","  criar",[104,135,136],{"class":125},"(",[104,138,140],{"class":139},"sk1zL","usuario",[104,142,143],{"class":125},")",[104,145,126],{"class":125},[104,147,149],{"class":106,"line":148},4,[104,150,151],{"class":110},"    \u002F\u002F salva no banco\n",[104,153,155,159,162,166,169,173,177,179],{"class":106,"line":154},5,[104,156,158],{"class":157},"sMo7A","    console",[104,160,161],{"class":125},".",[104,163,165],{"class":164},"sK_r7","log",[104,167,136],{"class":168},"sdv8B",[104,170,172],{"class":171},"sF_wb","'",[104,174,176],{"class":175},"s0vBq","Usuário salvo no banco",[104,178,172],{"class":171},[104,180,181],{"class":168},")\n",[104,183,185],{"class":106,"line":184},6,[104,186,188],{"emptyLinePlaceholder":187},true,"\n",[104,190,192],{"class":106,"line":191},7,[104,193,194],{"class":110},"    \u002F\u002F envia e-mail logo em seguida\n",[104,196,198,200,202,204,206,208,211,213],{"class":106,"line":197},8,[104,199,158],{"class":157},[104,201,161],{"class":125},[104,203,165],{"class":164},[104,205,136],{"class":168},[104,207,172],{"class":171},[104,209,210],{"class":175},"E-mail de boas-vindas enviado",[104,212,172],{"class":171},[104,214,181],{"class":168},[104,216,218],{"class":106,"line":217},9,[104,219,220],{"class":125},"  }\n",[104,222,224],{"class":106,"line":223},10,[104,225,226],{"class":125},"}\n",[11,228,229],{},"O problema aqui é que se a lógica de e-mail mudar (troca de provedor, novo template, adição de anexo), você vai precisar mexer na mesma classe que cuida de salvar usuários. São duas responsabilidades diferentes convivendo no mesmo lugar.",[11,231,232],{},"A solução é separar:",[94,234,236],{"className":96,"code":235,"language":98,"meta":99,"style":99},"\u002F\u002F ✅ Cada classe com uma responsabilidade clara\nclass UsuarioService {\n  criar(usuario) {\n    \u002F\u002F essa classe só sabe sobre criação de usuário\n    console.log('Usuário salvo no banco')\n  }\n}\n\nclass EmailService {\n  enviarBoasVindas(usuario) {\n    \u002F\u002F essa classe só sabe sobre envio de e-mail\n    console.log('E-mail de boas-vindas enviado')\n  }\n}\n",[101,237,238,243,252,264,269,287,291,295,299,308,321,327,346,351],{"__ignoreMap":99},[104,239,240],{"class":106,"line":107},[104,241,242],{"class":110},"\u002F\u002F ✅ Cada classe com uma responsabilidade clara\n",[104,244,245,247,250],{"class":106,"line":114},[104,246,118],{"class":117},[104,248,249],{"class":121}," UsuarioService",[104,251,126],{"class":125},[104,253,254,256,258,260,262],{"class":106,"line":129},[104,255,133],{"class":132},[104,257,136],{"class":125},[104,259,140],{"class":139},[104,261,143],{"class":125},[104,263,126],{"class":125},[104,265,266],{"class":106,"line":148},[104,267,268],{"class":110},"    \u002F\u002F essa classe só sabe sobre criação de usuário\n",[104,270,271,273,275,277,279,281,283,285],{"class":106,"line":154},[104,272,158],{"class":157},[104,274,161],{"class":125},[104,276,165],{"class":164},[104,278,136],{"class":168},[104,280,172],{"class":171},[104,282,176],{"class":175},[104,284,172],{"class":171},[104,286,181],{"class":168},[104,288,289],{"class":106,"line":184},[104,290,220],{"class":125},[104,292,293],{"class":106,"line":191},[104,294,226],{"class":125},[104,296,297],{"class":106,"line":197},[104,298,188],{"emptyLinePlaceholder":187},[104,300,301,303,306],{"class":106,"line":217},[104,302,118],{"class":117},[104,304,305],{"class":121}," EmailService",[104,307,126],{"class":125},[104,309,310,313,315,317,319],{"class":106,"line":223},[104,311,312],{"class":132},"  enviarBoasVindas",[104,314,136],{"class":125},[104,316,140],{"class":139},[104,318,143],{"class":125},[104,320,126],{"class":125},[104,322,324],{"class":106,"line":323},11,[104,325,326],{"class":110},"    \u002F\u002F essa classe só sabe sobre envio de e-mail\n",[104,328,330,332,334,336,338,340,342,344],{"class":106,"line":329},12,[104,331,158],{"class":157},[104,333,161],{"class":125},[104,335,165],{"class":164},[104,337,136],{"class":168},[104,339,172],{"class":171},[104,341,210],{"class":175},[104,343,172],{"class":171},[104,345,181],{"class":168},[104,347,349],{"class":106,"line":348},13,[104,350,220],{"class":125},[104,352,354],{"class":106,"line":353},14,[104,355,226],{"class":125},[11,357,358,359,362,363,366],{},"Agora cada classe tem uma razão clara para existir e uma razão clara para mudar. Se o fluxo de e-mail mudar, você mexe só no ",[101,360,361],{},"EmailService",". Se a lógica de persistência mudar, você mexe só no ",[101,364,365],{},"UsuarioService",". Simples assim.",[24,368],{},[27,370,372],{"id":371},"o-openclosed-principle","O — Open\u002FClosed Principle",[11,374,375],{},[35,376,377],{},"O código deve ser aberto para extensão, mas fechado para modificação.",[11,379,380],{},"Esse é o princípio que mais causa confusão no começo, então vamos direto ao exemplo.",[11,382,383],{},"Imagine que você tem um sistema de pagamentos. Hoje aceita PIX e cartão. Amanhã vão pedir boleto. Depois, PayPal. Se a lógica de processar o pagamento vive em um único lugar com condicionais para cada método, toda nova forma de pagamento exige que você abra aquele arquivo e modifique código que já está funcionando. E mexer em código que já funciona é sempre um risco.",[94,385,387],{"className":96,"code":386,"language":98,"meta":99,"style":99},"\u002F\u002F ❌ Toda vez que surgir um novo método de pagamento,\n\u002F\u002F você vai precisar modificar esta classe\nclass Checkout {\n  finalizar(valor, metodo) {\n    if (metodo === 'pix') {\n      console.log(`Pagamento via PIX: R$ ${valor}`)\n    } else if (metodo === 'cartao') {\n      console.log(`Pagamento via Cartão: R$ ${valor}`)\n    }\n    \u002F\u002F e quando vier o boleto? Mais um if aqui...\n  }\n}\n",[101,388,389,394,399,408,428,458,485,513,536,541,546,550],{"__ignoreMap":99},[104,390,391],{"class":106,"line":107},[104,392,393],{"class":110},"\u002F\u002F ❌ Toda vez que surgir um novo método de pagamento,\n",[104,395,396],{"class":106,"line":114},[104,397,398],{"class":110},"\u002F\u002F você vai precisar modificar esta classe\n",[104,400,401,403,406],{"class":106,"line":129},[104,402,118],{"class":117},[104,404,405],{"class":121}," Checkout",[104,407,126],{"class":125},[104,409,410,413,415,418,421,424,426],{"class":106,"line":148},[104,411,412],{"class":132},"  finalizar",[104,414,136],{"class":125},[104,416,417],{"class":139},"valor",[104,419,420],{"class":125},",",[104,422,423],{"class":139}," metodo",[104,425,143],{"class":125},[104,427,126],{"class":125},[104,429,430,434,437,440,444,447,450,452,455],{"class":106,"line":154},[104,431,433],{"class":432},"s3Er8","    if",[104,435,436],{"class":168}," (",[104,438,439],{"class":157},"metodo",[104,441,443],{"class":442},"sFfmW"," ===",[104,445,446],{"class":171}," '",[104,448,449],{"class":175},"pix",[104,451,172],{"class":171},[104,453,454],{"class":168},") ",[104,456,457],{"class":125},"{\n",[104,459,460,463,465,467,469,472,475,478,480,483],{"class":106,"line":184},[104,461,462],{"class":157},"      console",[104,464,161],{"class":125},[104,466,165],{"class":164},[104,468,136],{"class":168},[104,470,471],{"class":171},"`",[104,473,474],{"class":175},"Pagamento via PIX: R$ ",[104,476,477],{"class":171},"${",[104,479,417],{"class":157},[104,481,482],{"class":171},"}`",[104,484,181],{"class":168},[104,486,487,490,493,496,498,500,502,504,507,509,511],{"class":106,"line":191},[104,488,489],{"class":125},"    }",[104,491,492],{"class":432}," else",[104,494,495],{"class":432}," if",[104,497,436],{"class":168},[104,499,439],{"class":157},[104,501,443],{"class":442},[104,503,446],{"class":171},[104,505,506],{"class":175},"cartao",[104,508,172],{"class":171},[104,510,454],{"class":168},[104,512,457],{"class":125},[104,514,515,517,519,521,523,525,528,530,532,534],{"class":106,"line":197},[104,516,462],{"class":157},[104,518,161],{"class":125},[104,520,165],{"class":164},[104,522,136],{"class":168},[104,524,471],{"class":171},[104,526,527],{"class":175},"Pagamento via Cartão: R$ ",[104,529,477],{"class":171},[104,531,417],{"class":157},[104,533,482],{"class":171},[104,535,181],{"class":168},[104,537,538],{"class":106,"line":217},[104,539,540],{"class":125},"    }\n",[104,542,543],{"class":106,"line":223},[104,544,545],{"class":110},"    \u002F\u002F e quando vier o boleto? Mais um if aqui...\n",[104,547,548],{"class":106,"line":323},[104,549,220],{"class":125},[104,551,552],{"class":106,"line":329},[104,553,226],{"class":125},[11,555,556],{},"A solução é estruturar o código de forma que você possa adicionar novos comportamentos sem precisar tocar no que já existe:",[94,558,560],{"className":96,"code":559,"language":98,"meta":99,"style":99},"\u002F\u002F ✅ Cada método de pagamento é uma classe independente\nclass PagamentoPix {\n  pagar(valor) {\n    return `Pagamento via PIX: R$ ${valor}`\n  }\n}\n\nclass PagamentoCartao {\n  pagar(valor) {\n    return `Pagamento via Cartão: R$ ${valor}`\n  }\n}\n\n\u002F\u002F Checkout não sabe qual método de pagamento está usando,\n\u002F\u002F só sabe que ele tem um método pagar()\nclass Checkout {\n  constructor(metodoPagamento) {\n    this.metodoPagamento = metodoPagamento\n  }\n\n  finalizar(valor) {\n    return this.metodoPagamento.pagar(valor)\n  }\n}\n\n\u002F\u002F Para adicionar boleto, basta criar uma nova classe\n\u002F\u002F sem mexer em nada que já existe\nclass PagamentoBoleto {\n  pagar(valor) {\n    return `Boleto gerado: R$ ${valor}`\n  }\n}\n",[101,561,562,567,576,589,606,610,614,618,627,639,653,657,661,665,670,676,685,700,717,722,727,740,763,768,773,778,784,790,800,813,829,834],{"__ignoreMap":99},[104,563,564],{"class":106,"line":107},[104,565,566],{"class":110},"\u002F\u002F ✅ Cada método de pagamento é uma classe independente\n",[104,568,569,571,574],{"class":106,"line":114},[104,570,118],{"class":117},[104,572,573],{"class":121}," PagamentoPix",[104,575,126],{"class":125},[104,577,578,581,583,585,587],{"class":106,"line":129},[104,579,580],{"class":132},"  pagar",[104,582,136],{"class":125},[104,584,417],{"class":139},[104,586,143],{"class":125},[104,588,126],{"class":125},[104,590,591,594,597,599,601,603],{"class":106,"line":148},[104,592,593],{"class":432},"    return",[104,595,596],{"class":171}," `",[104,598,474],{"class":175},[104,600,477],{"class":171},[104,602,417],{"class":157},[104,604,605],{"class":171},"}`\n",[104,607,608],{"class":106,"line":154},[104,609,220],{"class":125},[104,611,612],{"class":106,"line":184},[104,613,226],{"class":125},[104,615,616],{"class":106,"line":191},[104,617,188],{"emptyLinePlaceholder":187},[104,619,620,622,625],{"class":106,"line":197},[104,621,118],{"class":117},[104,623,624],{"class":121}," PagamentoCartao",[104,626,126],{"class":125},[104,628,629,631,633,635,637],{"class":106,"line":217},[104,630,580],{"class":132},[104,632,136],{"class":125},[104,634,417],{"class":139},[104,636,143],{"class":125},[104,638,126],{"class":125},[104,640,641,643,645,647,649,651],{"class":106,"line":223},[104,642,593],{"class":432},[104,644,596],{"class":171},[104,646,527],{"class":175},[104,648,477],{"class":171},[104,650,417],{"class":157},[104,652,605],{"class":171},[104,654,655],{"class":106,"line":323},[104,656,220],{"class":125},[104,658,659],{"class":106,"line":329},[104,660,226],{"class":125},[104,662,663],{"class":106,"line":348},[104,664,188],{"emptyLinePlaceholder":187},[104,666,667],{"class":106,"line":353},[104,668,669],{"class":110},"\u002F\u002F Checkout não sabe qual método de pagamento está usando,\n",[104,671,673],{"class":106,"line":672},15,[104,674,675],{"class":110},"\u002F\u002F só sabe que ele tem um método pagar()\n",[104,677,679,681,683],{"class":106,"line":678},16,[104,680,118],{"class":117},[104,682,405],{"class":121},[104,684,126],{"class":125},[104,686,688,691,693,696,698],{"class":106,"line":687},17,[104,689,690],{"class":117},"  constructor",[104,692,136],{"class":125},[104,694,695],{"class":139},"metodoPagamento",[104,697,143],{"class":125},[104,699,126],{"class":125},[104,701,703,707,709,711,714],{"class":106,"line":702},18,[104,704,706],{"class":705},"swu5b","    this",[104,708,161],{"class":125},[104,710,695],{"class":157},[104,712,713],{"class":442}," =",[104,715,716],{"class":157}," metodoPagamento\n",[104,718,720],{"class":106,"line":719},19,[104,721,220],{"class":125},[104,723,725],{"class":106,"line":724},20,[104,726,188],{"emptyLinePlaceholder":187},[104,728,730,732,734,736,738],{"class":106,"line":729},21,[104,731,412],{"class":132},[104,733,136],{"class":125},[104,735,417],{"class":139},[104,737,143],{"class":125},[104,739,126],{"class":125},[104,741,743,745,748,750,752,754,757,759,761],{"class":106,"line":742},22,[104,744,593],{"class":432},[104,746,747],{"class":705}," this",[104,749,161],{"class":125},[104,751,695],{"class":157},[104,753,161],{"class":125},[104,755,756],{"class":164},"pagar",[104,758,136],{"class":168},[104,760,417],{"class":157},[104,762,181],{"class":168},[104,764,766],{"class":106,"line":765},23,[104,767,220],{"class":125},[104,769,771],{"class":106,"line":770},24,[104,772,226],{"class":125},[104,774,776],{"class":106,"line":775},25,[104,777,188],{"emptyLinePlaceholder":187},[104,779,781],{"class":106,"line":780},26,[104,782,783],{"class":110},"\u002F\u002F Para adicionar boleto, basta criar uma nova classe\n",[104,785,787],{"class":106,"line":786},27,[104,788,789],{"class":110},"\u002F\u002F sem mexer em nada que já existe\n",[104,791,793,795,798],{"class":106,"line":792},28,[104,794,118],{"class":117},[104,796,797],{"class":121}," PagamentoBoleto",[104,799,126],{"class":125},[104,801,803,805,807,809,811],{"class":106,"line":802},29,[104,804,580],{"class":132},[104,806,136],{"class":125},[104,808,417],{"class":139},[104,810,143],{"class":125},[104,812,126],{"class":125},[104,814,816,818,820,823,825,827],{"class":106,"line":815},30,[104,817,593],{"class":432},[104,819,596],{"class":171},[104,821,822],{"class":175},"Boleto gerado: R$ ",[104,824,477],{"class":171},[104,826,417],{"class":157},[104,828,605],{"class":171},[104,830,832],{"class":106,"line":831},31,[104,833,220],{"class":125},[104,835,837],{"class":106,"line":836},32,[104,838,226],{"class":125},[11,840,841,842,845],{},"Perceba: para adicionar um novo método de pagamento, você cria uma nova classe e pronto. O ",[101,843,844],{},"Checkout"," não precisa nem saber que o boleto existe.",[24,847],{},[27,849,851],{"id":850},"l-liskov-substitution-principle","L — Liskov Substitution Principle",[11,853,854],{},[35,855,856],{},"Se B herda de A, você deve conseguir usar B em qualquer lugar que esperaria A, sem quebrar nada.",[11,858,859],{},"Esse princípio foi definido por Barbara Liskov nos anos 80, e o nome técnico pode assustar, mas a ideia é direta: se você tem uma herança, a classe filha precisa honrar o contrato da classe pai. Ela pode adicionar comportamentos, mas não pode quebrar os que já existiam.",[11,861,862,863,866,867,870,871,874,875,877],{},"Um exemplo clássico que viola esse princípio: você tem uma classe ",[101,864,865],{},"Passaro"," com um método ",[101,868,869],{},"mover()",", e resolve criar ",[101,872,873],{},"Pinguim extends Passaro",". O pinguim é um pássaro, tecnicamente. Mas se ",[101,876,869],{}," na classe pai implica \"voar\", o pinguim quebra essa expectativa.",[94,879,881],{"className":96,"code":880,"language":98,"meta":99,"style":99},"\u002F\u002F ✅ Cada subclasse honra o contrato da classe pai\n\u002F\u002F sem surpresas para quem está usando\nclass Passaro {\n  mover() {\n    return 'O pássaro está se movendo'\n  }\n}\n\nclass Pardal extends Passaro {\n  mover() {\n    \u002F\u002F pardal voa: comportamento esperado de um pássaro\n    return 'O pardal está voando'\n  }\n}\n\nclass Pinguim extends Passaro {\n  mover() {\n    \u002F\u002F pinguim nada: diferente, mas ainda é \"mover\"\n    \u002F\u002F o contrato de mover() é honrado sem gerar surpresas\n    return 'O pinguim está nadando'\n  }\n}\n\n\u002F\u002F Esta função aceita qualquer Passaro\n\u002F\u002F e vai funcionar corretamente com qualquer subclasse\nfunction mostrarMovimento(passaro) {\n  console.log(passaro.mover())\n}\n\nmostrarMovimento(new Pardal()) \u002F\u002F \"O pardal está voando\"\nmostrarMovimento(new Pinguim()) \u002F\u002F \"O pinguim está nadando\"\n",[101,882,883,888,893,902,912,924,928,932,936,950,958,963,974,978,982,986,999,1007,1012,1017,1028,1032,1036,1040,1045,1050,1067,1088,1092,1096,1114],{"__ignoreMap":99},[104,884,885],{"class":106,"line":107},[104,886,887],{"class":110},"\u002F\u002F ✅ Cada subclasse honra o contrato da classe pai\n",[104,889,890],{"class":106,"line":114},[104,891,892],{"class":110},"\u002F\u002F sem surpresas para quem está usando\n",[104,894,895,897,900],{"class":106,"line":129},[104,896,118],{"class":117},[104,898,899],{"class":121}," Passaro",[104,901,126],{"class":125},[104,903,904,907,910],{"class":106,"line":148},[104,905,906],{"class":132},"  mover",[104,908,909],{"class":125},"()",[104,911,126],{"class":125},[104,913,914,916,918,921],{"class":106,"line":154},[104,915,593],{"class":432},[104,917,446],{"class":171},[104,919,920],{"class":175},"O pássaro está se movendo",[104,922,923],{"class":171},"'\n",[104,925,926],{"class":106,"line":184},[104,927,220],{"class":125},[104,929,930],{"class":106,"line":191},[104,931,226],{"class":125},[104,933,934],{"class":106,"line":197},[104,935,188],{"emptyLinePlaceholder":187},[104,937,938,940,943,946,948],{"class":106,"line":217},[104,939,118],{"class":117},[104,941,942],{"class":121}," Pardal",[104,944,945],{"class":117}," extends",[104,947,899],{"class":121},[104,949,126],{"class":125},[104,951,952,954,956],{"class":106,"line":223},[104,953,906],{"class":132},[104,955,909],{"class":125},[104,957,126],{"class":125},[104,959,960],{"class":106,"line":323},[104,961,962],{"class":110},"    \u002F\u002F pardal voa: comportamento esperado de um pássaro\n",[104,964,965,967,969,972],{"class":106,"line":329},[104,966,593],{"class":432},[104,968,446],{"class":171},[104,970,971],{"class":175},"O pardal está voando",[104,973,923],{"class":171},[104,975,976],{"class":106,"line":348},[104,977,220],{"class":125},[104,979,980],{"class":106,"line":353},[104,981,226],{"class":125},[104,983,984],{"class":106,"line":672},[104,985,188],{"emptyLinePlaceholder":187},[104,987,988,990,993,995,997],{"class":106,"line":678},[104,989,118],{"class":117},[104,991,992],{"class":121}," Pinguim",[104,994,945],{"class":117},[104,996,899],{"class":121},[104,998,126],{"class":125},[104,1000,1001,1003,1005],{"class":106,"line":687},[104,1002,906],{"class":132},[104,1004,909],{"class":125},[104,1006,126],{"class":125},[104,1008,1009],{"class":106,"line":702},[104,1010,1011],{"class":110},"    \u002F\u002F pinguim nada: diferente, mas ainda é \"mover\"\n",[104,1013,1014],{"class":106,"line":719},[104,1015,1016],{"class":110},"    \u002F\u002F o contrato de mover() é honrado sem gerar surpresas\n",[104,1018,1019,1021,1023,1026],{"class":106,"line":724},[104,1020,593],{"class":432},[104,1022,446],{"class":171},[104,1024,1025],{"class":175},"O pinguim está nadando",[104,1027,923],{"class":171},[104,1029,1030],{"class":106,"line":729},[104,1031,220],{"class":125},[104,1033,1034],{"class":106,"line":742},[104,1035,226],{"class":125},[104,1037,1038],{"class":106,"line":765},[104,1039,188],{"emptyLinePlaceholder":187},[104,1041,1042],{"class":106,"line":770},[104,1043,1044],{"class":110},"\u002F\u002F Esta função aceita qualquer Passaro\n",[104,1046,1047],{"class":106,"line":775},[104,1048,1049],{"class":110},"\u002F\u002F e vai funcionar corretamente com qualquer subclasse\n",[104,1051,1052,1055,1058,1060,1063,1065],{"class":106,"line":780},[104,1053,1054],{"class":117},"function",[104,1056,1057],{"class":164}," mostrarMovimento",[104,1059,136],{"class":125},[104,1061,1062],{"class":139},"passaro",[104,1064,143],{"class":125},[104,1066,126],{"class":125},[104,1068,1069,1072,1074,1076,1078,1080,1082,1085],{"class":106,"line":786},[104,1070,1071],{"class":157},"  console",[104,1073,161],{"class":125},[104,1075,165],{"class":164},[104,1077,136],{"class":168},[104,1079,1062],{"class":157},[104,1081,161],{"class":125},[104,1083,1084],{"class":164},"mover",[104,1086,1087],{"class":168},"())\n",[104,1089,1090],{"class":106,"line":792},[104,1091,226],{"class":125},[104,1093,1094],{"class":106,"line":802},[104,1095,188],{"emptyLinePlaceholder":187},[104,1097,1098,1101,1103,1106,1108,1111],{"class":106,"line":815},[104,1099,1100],{"class":164},"mostrarMovimento",[104,1102,136],{"class":157},[104,1104,1105],{"class":442},"new",[104,1107,942],{"class":164},[104,1109,1110],{"class":157},"()) ",[104,1112,1113],{"class":110},"\u002F\u002F \"O pardal está voando\"\n",[104,1115,1116,1118,1120,1122,1124,1126],{"class":106,"line":831},[104,1117,1100],{"class":164},[104,1119,136],{"class":157},[104,1121,1105],{"class":442},[104,1123,992],{"class":164},[104,1125,1110],{"class":157},[104,1127,1128],{"class":110},"\u002F\u002F \"O pinguim está nadando\"\n",[11,1130,1131,1132,1134,1135,1138,1139,1142],{},"O ponto central aqui é: qualquer código que funciona com um ",[101,1133,865],{}," deve continuar funcionando quando você passar um ",[101,1136,1137],{},"Pardal"," ou um ",[101,1140,1141],{},"Pinguim"," no lugar. Se alguma subclasse quebra esse comportamento, o princípio está sendo violado.",[11,1144,1145],{},"Na prática, esse princípio é especialmente importante quando você está criando hierarquias de componentes ou serviços que vão ser substituídos ou injetados em outras partes do sistema.",[24,1147],{},[27,1149,1151],{"id":1150},"i-interface-segregation-principle","I — Interface Segregation Principle",[11,1153,1154],{},[35,1155,1156],{},"Ninguém deve ser obrigado a depender de métodos que não usa.",[11,1158,1159],{},"Em JavaScript puro não temos interfaces como em TypeScript ou Java, mas o conceito se aplica igualmente. A ideia é: não force uma classe a implementar comportamentos que não fazem sentido para ela.",[11,1161,1162],{},"Pense em uma impressora. Uma impressora simples imprime. Uma multifuncional imprime e digitaliza. Se você criar um \"contrato\" que exige os dois comportamentos, a impressora simples vai ser obrigada a ter um método de digitalização que não faz nada, só existe para satisfazer uma regra que não é dela.",[94,1164,1166],{"className":96,"code":1165,"language":98,"meta":99,"style":99},"\u002F\u002F ❌ Um objeto \"gordo\" que força quem não precisa\n\u002F\u002F a carregar comportamentos que não usa\nconst impressoraMultifuncional = {\n  imprimir(doc) {\n    console.log('Imprimindo:', doc)\n  },\n  digitalizar() {\n    console.log('Digitalizando')\n  },\n  enviarFax() {\n    console.log('Enviando fax')\n  }\n}\n\n\u002F\u002F A impressora simples não digitaliza e não manda fax,\n\u002F\u002F mas está sendo forçada a ter esses métodos\n",[101,1167,1168,1173,1178,1191,1205,1229,1234,1243,1262,1266,1275,1294,1298,1302,1306,1311],{"__ignoreMap":99},[104,1169,1170],{"class":106,"line":107},[104,1171,1172],{"class":110},"\u002F\u002F ❌ Um objeto \"gordo\" que força quem não precisa\n",[104,1174,1175],{"class":106,"line":114},[104,1176,1177],{"class":110},"\u002F\u002F a carregar comportamentos que não usa\n",[104,1179,1180,1183,1187,1189],{"class":106,"line":129},[104,1181,1182],{"class":117},"const",[104,1184,1186],{"class":1185},"sVPC0"," impressoraMultifuncional",[104,1188,713],{"class":442},[104,1190,126],{"class":125},[104,1192,1193,1196,1198,1201,1203],{"class":106,"line":148},[104,1194,1195],{"class":132},"  imprimir",[104,1197,136],{"class":125},[104,1199,1200],{"class":139},"doc",[104,1202,143],{"class":125},[104,1204,126],{"class":125},[104,1206,1207,1209,1211,1213,1215,1217,1220,1222,1224,1227],{"class":106,"line":154},[104,1208,158],{"class":157},[104,1210,161],{"class":125},[104,1212,165],{"class":164},[104,1214,136],{"class":168},[104,1216,172],{"class":171},[104,1218,1219],{"class":175},"Imprimindo:",[104,1221,172],{"class":171},[104,1223,420],{"class":125},[104,1225,1226],{"class":157}," doc",[104,1228,181],{"class":168},[104,1230,1231],{"class":106,"line":184},[104,1232,1233],{"class":125},"  },\n",[104,1235,1236,1239,1241],{"class":106,"line":191},[104,1237,1238],{"class":132},"  digitalizar",[104,1240,909],{"class":125},[104,1242,126],{"class":125},[104,1244,1245,1247,1249,1251,1253,1255,1258,1260],{"class":106,"line":197},[104,1246,158],{"class":157},[104,1248,161],{"class":125},[104,1250,165],{"class":164},[104,1252,136],{"class":168},[104,1254,172],{"class":171},[104,1256,1257],{"class":175},"Digitalizando",[104,1259,172],{"class":171},[104,1261,181],{"class":168},[104,1263,1264],{"class":106,"line":217},[104,1265,1233],{"class":125},[104,1267,1268,1271,1273],{"class":106,"line":223},[104,1269,1270],{"class":132},"  enviarFax",[104,1272,909],{"class":125},[104,1274,126],{"class":125},[104,1276,1277,1279,1281,1283,1285,1287,1290,1292],{"class":106,"line":323},[104,1278,158],{"class":157},[104,1280,161],{"class":125},[104,1282,165],{"class":164},[104,1284,136],{"class":168},[104,1286,172],{"class":171},[104,1288,1289],{"class":175},"Enviando fax",[104,1291,172],{"class":171},[104,1293,181],{"class":168},[104,1295,1296],{"class":106,"line":329},[104,1297,220],{"class":125},[104,1299,1300],{"class":106,"line":348},[104,1301,226],{"class":125},[104,1303,1304],{"class":106,"line":353},[104,1305,188],{"emptyLinePlaceholder":187},[104,1307,1308],{"class":106,"line":672},[104,1309,1310],{"class":110},"\u002F\u002F A impressora simples não digitaliza e não manda fax,\n",[104,1312,1313],{"class":106,"line":678},[104,1314,1315],{"class":110},"\u002F\u002F mas está sendo forçada a ter esses métodos\n",[11,1317,1318],{},"A solução é separar as capacidades em partes menores e combinar só o que faz sentido para cada caso:",[94,1320,1322],{"className":96,"code":1321,"language":98,"meta":99,"style":99},"\u002F\u002F ✅ Capacidades separadas, combinadas conforme necessário\nconst podeImprimir = {\n  imprimir(doc) {\n    console.log('Imprimindo:', doc)\n  }\n}\n\nconst podeDigitalizar = {\n  digitalizar() {\n    console.log('Digitalizando documento')\n  }\n}\n\n\u002F\u002F Impressora simples: só imprime\nclass ImpressoraSimples {}\nObject.assign(ImpressoraSimples.prototype, podeImprimir)\n\n\u002F\u002F Multifuncional: imprime e digitaliza\nclass ImpressoraMultifuncional {}\nObject.assign(ImpressoraMultifuncional.prototype, podeImprimir, podeDigitalizar)\n",[101,1323,1324,1329,1340,1352,1374,1378,1382,1386,1397,1405,1424,1428,1432,1436,1441,1451,1477,1481,1486,1495],{"__ignoreMap":99},[104,1325,1326],{"class":106,"line":107},[104,1327,1328],{"class":110},"\u002F\u002F ✅ Capacidades separadas, combinadas conforme necessário\n",[104,1330,1331,1333,1336,1338],{"class":106,"line":114},[104,1332,1182],{"class":117},[104,1334,1335],{"class":1185}," podeImprimir",[104,1337,713],{"class":442},[104,1339,126],{"class":125},[104,1341,1342,1344,1346,1348,1350],{"class":106,"line":129},[104,1343,1195],{"class":132},[104,1345,136],{"class":125},[104,1347,1200],{"class":139},[104,1349,143],{"class":125},[104,1351,126],{"class":125},[104,1353,1354,1356,1358,1360,1362,1364,1366,1368,1370,1372],{"class":106,"line":148},[104,1355,158],{"class":157},[104,1357,161],{"class":125},[104,1359,165],{"class":164},[104,1361,136],{"class":168},[104,1363,172],{"class":171},[104,1365,1219],{"class":175},[104,1367,172],{"class":171},[104,1369,420],{"class":125},[104,1371,1226],{"class":157},[104,1373,181],{"class":168},[104,1375,1376],{"class":106,"line":154},[104,1377,220],{"class":125},[104,1379,1380],{"class":106,"line":184},[104,1381,226],{"class":125},[104,1383,1384],{"class":106,"line":191},[104,1385,188],{"emptyLinePlaceholder":187},[104,1387,1388,1390,1393,1395],{"class":106,"line":197},[104,1389,1182],{"class":117},[104,1391,1392],{"class":1185}," podeDigitalizar",[104,1394,713],{"class":442},[104,1396,126],{"class":125},[104,1398,1399,1401,1403],{"class":106,"line":217},[104,1400,1238],{"class":132},[104,1402,909],{"class":125},[104,1404,126],{"class":125},[104,1406,1407,1409,1411,1413,1415,1417,1420,1422],{"class":106,"line":223},[104,1408,158],{"class":157},[104,1410,161],{"class":125},[104,1412,165],{"class":164},[104,1414,136],{"class":168},[104,1416,172],{"class":171},[104,1418,1419],{"class":175},"Digitalizando documento",[104,1421,172],{"class":171},[104,1423,181],{"class":168},[104,1425,1426],{"class":106,"line":323},[104,1427,220],{"class":125},[104,1429,1430],{"class":106,"line":329},[104,1431,226],{"class":125},[104,1433,1434],{"class":106,"line":348},[104,1435,188],{"emptyLinePlaceholder":187},[104,1437,1438],{"class":106,"line":353},[104,1439,1440],{"class":110},"\u002F\u002F Impressora simples: só imprime\n",[104,1442,1443,1445,1448],{"class":106,"line":672},[104,1444,118],{"class":117},[104,1446,1447],{"class":121}," ImpressoraSimples",[104,1449,1450],{"class":125}," {}\n",[104,1452,1453,1456,1458,1461,1463,1467,1469,1472,1474],{"class":106,"line":678},[104,1454,1455],{"class":157},"Object",[104,1457,161],{"class":125},[104,1459,1460],{"class":164},"assign",[104,1462,136],{"class":157},[104,1464,1466],{"class":1465},"s3afY","ImpressoraSimples",[104,1468,161],{"class":125},[104,1470,1471],{"class":1185},"prototype",[104,1473,420],{"class":125},[104,1475,1476],{"class":157}," podeImprimir)\n",[104,1478,1479],{"class":106,"line":687},[104,1480,188],{"emptyLinePlaceholder":187},[104,1482,1483],{"class":106,"line":702},[104,1484,1485],{"class":110},"\u002F\u002F Multifuncional: imprime e digitaliza\n",[104,1487,1488,1490,1493],{"class":106,"line":719},[104,1489,118],{"class":117},[104,1491,1492],{"class":121}," ImpressoraMultifuncional",[104,1494,1450],{"class":125},[104,1496,1497,1499,1501,1503,1505,1508,1510,1512,1514,1516,1518],{"class":106,"line":724},[104,1498,1455],{"class":157},[104,1500,161],{"class":125},[104,1502,1460],{"class":164},[104,1504,136],{"class":157},[104,1506,1507],{"class":1465},"ImpressoraMultifuncional",[104,1509,161],{"class":125},[104,1511,1471],{"class":1185},[104,1513,420],{"class":125},[104,1515,1335],{"class":157},[104,1517,420],{"class":125},[104,1519,1520],{"class":157}," podeDigitalizar)\n",[11,1522,1523],{},"Cada classe recebe exatamente o que precisa, sem carregar peso extra. Em TypeScript, isso fica ainda mais explícito com interfaces separadas, mas o raciocínio é o mesmo.",[24,1525],{},[27,1527,1529],{"id":1528},"d-dependency-inversion-principle","D — Dependency Inversion Principle",[11,1531,1532],{},[35,1533,1534],{},"Dependa de abstrações, não de implementações concretas.",[11,1536,1537],{},"Esse é provavelmente o princípio com maior impacto prático no dia a dia de desenvolvimento frontend, especialmente quando você começa a lidar com injeção de dependência, testes e troca de implementações.",[11,1539,1540,1541,1544,1545,1548,1549,1551],{},"O problema acontece quando uma parte do seu código está fortemente acoplada a outra. Se o ",[101,1542,1543],{},"ServicoDeEmail"," chama diretamente o ",[101,1546,1547],{},"SendGrid",", qualquer dia que você quiser trocar de provedor, vai precisar abrir o ",[101,1550,1543],{}," e modificar código que deveria estar funcionando bem.",[94,1553,1555],{"className":96,"code":1554,"language":98,"meta":99,"style":99},"\u002F\u002F ❌ Acoplamento direto com uma implementação específica\nclass ServicoDeEmail {\n  constructor() {\n    \u002F\u002F ServicoDeEmail agora depende diretamente do Sendgrid\n    \u002F\u002F Quer trocar de provedor? Vai precisar mexer aqui\n    this.provedor = new Sendgrid()\n  }\n\n  enviar(mensagem) {\n    this.provedor.send(mensagem)\n  }\n}\n",[101,1556,1557,1562,1571,1579,1584,1589,1609,1613,1617,1631,1650,1654],{"__ignoreMap":99},[104,1558,1559],{"class":106,"line":107},[104,1560,1561],{"class":110},"\u002F\u002F ❌ Acoplamento direto com uma implementação específica\n",[104,1563,1564,1566,1569],{"class":106,"line":114},[104,1565,118],{"class":117},[104,1567,1568],{"class":121}," ServicoDeEmail",[104,1570,126],{"class":125},[104,1572,1573,1575,1577],{"class":106,"line":129},[104,1574,690],{"class":117},[104,1576,909],{"class":125},[104,1578,126],{"class":125},[104,1580,1581],{"class":106,"line":148},[104,1582,1583],{"class":110},"    \u002F\u002F ServicoDeEmail agora depende diretamente do Sendgrid\n",[104,1585,1586],{"class":106,"line":154},[104,1587,1588],{"class":110},"    \u002F\u002F Quer trocar de provedor? Vai precisar mexer aqui\n",[104,1590,1591,1593,1595,1598,1600,1603,1606],{"class":106,"line":184},[104,1592,706],{"class":705},[104,1594,161],{"class":125},[104,1596,1597],{"class":157},"provedor",[104,1599,713],{"class":442},[104,1601,1602],{"class":442}," new",[104,1604,1605],{"class":164}," Sendgrid",[104,1607,1608],{"class":168},"()\n",[104,1610,1611],{"class":106,"line":191},[104,1612,220],{"class":125},[104,1614,1615],{"class":106,"line":197},[104,1616,188],{"emptyLinePlaceholder":187},[104,1618,1619,1622,1624,1627,1629],{"class":106,"line":217},[104,1620,1621],{"class":132},"  enviar",[104,1623,136],{"class":125},[104,1625,1626],{"class":139},"mensagem",[104,1628,143],{"class":125},[104,1630,126],{"class":125},[104,1632,1633,1635,1637,1639,1641,1644,1646,1648],{"class":106,"line":223},[104,1634,706],{"class":705},[104,1636,161],{"class":125},[104,1638,1597],{"class":157},[104,1640,161],{"class":125},[104,1642,1643],{"class":164},"send",[104,1645,136],{"class":168},[104,1647,1626],{"class":157},[104,1649,181],{"class":168},[104,1651,1652],{"class":106,"line":323},[104,1653,220],{"class":125},[104,1655,1656],{"class":106,"line":329},[104,1657,226],{"class":125},[11,1659,1660,1661,1663],{},"A solução é inverter essa dependência: em vez de o ",[101,1662,1543],{}," criar o provedor, o provedor é passado de fora. O serviço apenas espera receber algo que sabe enviar e-mail, sem se importar com qual implementação é essa:",[94,1665,1667],{"className":96,"code":1666,"language":98,"meta":99,"style":99},"\u002F\u002F ✅ O serviço depende de uma abstração,\n\u002F\u002F não sabe (nem precisa saber) qual provedor está usando\nclass SendgridGateway {\n  enviar(mensagem) {\n    return `Enviado via SendGrid: ${mensagem}`\n  }\n}\n\nclass MailgunGateway {\n  enviar(mensagem) {\n    return `Enviado via Mailgun: ${mensagem}`\n  }\n}\n\nclass ServicoDeEmail {\n  constructor(provedor) {\n    \u002F\u002F recebe o provedor de fora, não cria ele mesmo\n    this.provedor = provedor\n  }\n\n  enviar(mensagem) {\n    return this.provedor.enviar(mensagem)\n  }\n}\n\n\u002F\u002F Para trocar de provedor, só muda o que você passa aqui\nconst servico = new ServicoDeEmail(new SendgridGateway())\n\u002F\u002F ou:\nconst servicoAlternativo = new ServicoDeEmail(new MailgunGateway())\n",[101,1668,1669,1674,1679,1688,1700,1715,1719,1723,1727,1736,1748,1763,1767,1771,1775,1783,1795,1800,1813,1817,1821,1833,1854,1858,1862,1866,1871,1892,1897],{"__ignoreMap":99},[104,1670,1671],{"class":106,"line":107},[104,1672,1673],{"class":110},"\u002F\u002F ✅ O serviço depende de uma abstração,\n",[104,1675,1676],{"class":106,"line":114},[104,1677,1678],{"class":110},"\u002F\u002F não sabe (nem precisa saber) qual provedor está usando\n",[104,1680,1681,1683,1686],{"class":106,"line":129},[104,1682,118],{"class":117},[104,1684,1685],{"class":121}," SendgridGateway",[104,1687,126],{"class":125},[104,1689,1690,1692,1694,1696,1698],{"class":106,"line":148},[104,1691,1621],{"class":132},[104,1693,136],{"class":125},[104,1695,1626],{"class":139},[104,1697,143],{"class":125},[104,1699,126],{"class":125},[104,1701,1702,1704,1706,1709,1711,1713],{"class":106,"line":154},[104,1703,593],{"class":432},[104,1705,596],{"class":171},[104,1707,1708],{"class":175},"Enviado via SendGrid: ",[104,1710,477],{"class":171},[104,1712,1626],{"class":157},[104,1714,605],{"class":171},[104,1716,1717],{"class":106,"line":184},[104,1718,220],{"class":125},[104,1720,1721],{"class":106,"line":191},[104,1722,226],{"class":125},[104,1724,1725],{"class":106,"line":197},[104,1726,188],{"emptyLinePlaceholder":187},[104,1728,1729,1731,1734],{"class":106,"line":217},[104,1730,118],{"class":117},[104,1732,1733],{"class":121}," MailgunGateway",[104,1735,126],{"class":125},[104,1737,1738,1740,1742,1744,1746],{"class":106,"line":223},[104,1739,1621],{"class":132},[104,1741,136],{"class":125},[104,1743,1626],{"class":139},[104,1745,143],{"class":125},[104,1747,126],{"class":125},[104,1749,1750,1752,1754,1757,1759,1761],{"class":106,"line":323},[104,1751,593],{"class":432},[104,1753,596],{"class":171},[104,1755,1756],{"class":175},"Enviado via Mailgun: ",[104,1758,477],{"class":171},[104,1760,1626],{"class":157},[104,1762,605],{"class":171},[104,1764,1765],{"class":106,"line":329},[104,1766,220],{"class":125},[104,1768,1769],{"class":106,"line":348},[104,1770,226],{"class":125},[104,1772,1773],{"class":106,"line":353},[104,1774,188],{"emptyLinePlaceholder":187},[104,1776,1777,1779,1781],{"class":106,"line":672},[104,1778,118],{"class":117},[104,1780,1568],{"class":121},[104,1782,126],{"class":125},[104,1784,1785,1787,1789,1791,1793],{"class":106,"line":678},[104,1786,690],{"class":117},[104,1788,136],{"class":125},[104,1790,1597],{"class":139},[104,1792,143],{"class":125},[104,1794,126],{"class":125},[104,1796,1797],{"class":106,"line":687},[104,1798,1799],{"class":110},"    \u002F\u002F recebe o provedor de fora, não cria ele mesmo\n",[104,1801,1802,1804,1806,1808,1810],{"class":106,"line":702},[104,1803,706],{"class":705},[104,1805,161],{"class":125},[104,1807,1597],{"class":157},[104,1809,713],{"class":442},[104,1811,1812],{"class":157}," provedor\n",[104,1814,1815],{"class":106,"line":719},[104,1816,220],{"class":125},[104,1818,1819],{"class":106,"line":724},[104,1820,188],{"emptyLinePlaceholder":187},[104,1822,1823,1825,1827,1829,1831],{"class":106,"line":729},[104,1824,1621],{"class":132},[104,1826,136],{"class":125},[104,1828,1626],{"class":139},[104,1830,143],{"class":125},[104,1832,126],{"class":125},[104,1834,1835,1837,1839,1841,1843,1845,1848,1850,1852],{"class":106,"line":742},[104,1836,593],{"class":432},[104,1838,747],{"class":705},[104,1840,161],{"class":125},[104,1842,1597],{"class":157},[104,1844,161],{"class":125},[104,1846,1847],{"class":164},"enviar",[104,1849,136],{"class":168},[104,1851,1626],{"class":157},[104,1853,181],{"class":168},[104,1855,1856],{"class":106,"line":765},[104,1857,220],{"class":125},[104,1859,1860],{"class":106,"line":770},[104,1861,226],{"class":125},[104,1863,1864],{"class":106,"line":775},[104,1865,188],{"emptyLinePlaceholder":187},[104,1867,1868],{"class":106,"line":780},[104,1869,1870],{"class":110},"\u002F\u002F Para trocar de provedor, só muda o que você passa aqui\n",[104,1872,1873,1875,1878,1880,1882,1884,1886,1888,1890],{"class":106,"line":786},[104,1874,1182],{"class":117},[104,1876,1877],{"class":1185}," servico",[104,1879,713],{"class":442},[104,1881,1602],{"class":442},[104,1883,1568],{"class":164},[104,1885,136],{"class":157},[104,1887,1105],{"class":442},[104,1889,1685],{"class":164},[104,1891,1087],{"class":157},[104,1893,1894],{"class":106,"line":792},[104,1895,1896],{"class":110},"\u002F\u002F ou:\n",[104,1898,1899,1901,1904,1906,1908,1910,1912,1914,1916],{"class":106,"line":802},[104,1900,1182],{"class":117},[104,1902,1903],{"class":1185}," servicoAlternativo",[104,1905,713],{"class":442},[104,1907,1602],{"class":442},[104,1909,1568],{"class":164},[104,1911,136],{"class":157},[104,1913,1105],{"class":442},[104,1915,1733],{"class":164},[104,1917,1087],{"class":157},[11,1919,1920],{},"Além de facilitar a troca de implementação, esse padrão torna os testes muito mais fáceis: você pode passar um provedor falso nos testes sem precisar configurar nada externo.",[24,1922],{},[27,1924,1926],{"id":1925},"solid-na-prática-o-que-muda-no-seu-código","SOLID na prática: o que muda no seu código",[11,1928,1929],{},"Ler sobre os princípios é uma coisa. A mudança real acontece quando você começa a reconhecer as violações no código que já existe, e nos que você está escrevendo agora.",[11,1931,1932],{},"Algumas perguntas que ajudam a identificar onde os princípios estão sendo ignorados:",[40,1934,1935,1938,1941,1944,1947],{},[43,1936,1937],{},"Quando uma classe tem métodos que parecem não ter nada a ver entre si, provavelmente está violando o S.",[43,1939,1940],{},"Quando você precisa abrir vários arquivos para adicionar um novo comportamento, o O pode estar sendo ignorado.",[43,1942,1943],{},"Quando uma subclasse precisa \"anular\" métodos do pai para funcionar, o L está em risco.",[43,1945,1946],{},"Quando você vê uma classe com métodos vazios que existem \"só para satisfazer a estrutura\", o I está sendo violado.",[43,1948,1949],{},"E quando um módulo cria diretamente os objetos de que depende em vez de recebê-los, o D está sendo ignorado.",[11,1951,1952],{},"SOLID não é uma checklist que você marca antes de dar merge. É uma forma de pensar na organização do código que, com o tempo, passa a ser natural.",[24,1954],{},[27,1956,1958],{"id":1957},"conclusão","Conclusão",[11,1960,1961],{},"Os princípios SOLID não existem para complicar o código ou aumentar o número de arquivos. Eles existem para tornar o código mais honesto: cada parte faz o que diz que faz, depende só do que realmente precisa e pode ser estendida sem medo de quebrar o que já funciona.",[11,1963,1964],{},"Você não precisa aplicar tudo de uma vez. Comece pelo S: identifique uma classe no seu projeto que está fazendo coisas demais e separe as responsabilidades. Quando isso virar natural, os outros princípios começam a fazer mais sentido na sequência.",[11,1966,1967],{},"O melhor código não é o que usa mais padrões, é o que você consegue abrir seis meses depois e entender sem precisar de coragem.",[27,1969,1971],{"id":1970},"referências","Referências",[40,1973,1974,1983,1990],{},[43,1975,1976],{},[1977,1978,1982],"a",{"href":1979,"rel":1980},"https:\u002F\u002Fwww.alura.com.br\u002Fartigos\u002Fsolid",[1981],"nofollow","Alura: O que é SOLID",[43,1984,1985],{},[1977,1986,1989],{"href":1987,"rel":1988},"https:\u002F\u002Fwww.digitalocean.com\u002Fcommunity\u002Fconceptual-articles\u002Fs-o-l-i-d-the-first-five-principles-of-object-oriented-design",[1981],"SOLID Design Principles Explained",[43,1991,1992],{},[1977,1993,1996],{"href":1994,"rel":1995},"https:\u002F\u002Fmedium.com\u002Fdesenvolvendo-com-paixao\u002Fo-que-%C3%A9-solid-o-guia-completo-para-voc%C3%AA-entender-os-5-princ%C3%ADpios-da-poo-2b937b3fc530",[1981],"O que é SOLID: O guia completo",[1998,1999,2000],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sFsEu, html code.shiki .sFsEu{--shiki-light:#9C3EDA;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .soiBB, html code.shiki .soiBB{--shiki-light:#E2931D;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sG-J9, html code.shiki .sG-J9{--shiki-light:#39ADB5;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .s0u7J, html code.shiki .s0u7J{--shiki-light:#E53935;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sk1zL, html code.shiki .sk1zL{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#FFAB70;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sMo7A, html code.shiki .sMo7A{--shiki-light:#90A4AE;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sK_r7, html code.shiki .sK_r7{--shiki-light:#6182B8;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sdv8B, html code.shiki .sdv8B{--shiki-light:#E53935;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sF_wb, html code.shiki .sF_wb{--shiki-light:#39ADB5;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .s0vBq, html code.shiki .s0vBq{--shiki-light:#91B859;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s3Er8, html code.shiki .s3Er8{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#F97583;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sFfmW, html code.shiki .sFfmW{--shiki-light:#39ADB5;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .swu5b, html code.shiki .swu5b{--shiki-light:#39ADB5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sVPC0, html code.shiki .sVPC0{--shiki-light:#90A4AE;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .s3afY, html code.shiki .s3afY{--shiki-light:#E2931D;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}",{"title":99,"searchDepth":114,"depth":114,"links":2002},[2003,2004,2005,2006,2007,2008,2009,2010,2011],{"id":29,"depth":114,"text":30},{"id":80,"depth":114,"text":81},{"id":371,"depth":114,"text":372},{"id":850,"depth":114,"text":851},{"id":1150,"depth":114,"text":1151},{"id":1528,"depth":114,"text":1529},{"id":1925,"depth":114,"text":1926},{"id":1957,"depth":114,"text":1958},{"id":1970,"depth":114,"text":1971},"2026-03-12T19:23:00-03:00","Entenda o que é SOLID e como aplicar os cinco princípios para escrever códigos mais organizados, flexíveis e fáceis de manter.","md",null,"\u002Fimages\u002Fblog\u002Fsolid.png",{},"\u002Fblog\u002Fprincipio-solid",{"title":5,"description":2013},"blog\u002Fprincipio-solid",[2022,2023,2024,2025,2026],"SOLID","JavaScript","Clean Code","arquitetura","desenvolvimento","fnCTSJiE_xEMV-Y-cCFrWpGUEwePRefYaCPFK4n9Bn0",1783037053194]