Arquitetura de software e princípios SOLID, DRY, KISS e YAGNI
Do zero
Arquitetura de software é a planta da cidade, não a de cada casa: decide quais são os bairros (os grandes blocos do sistema), como as ruas os ligam (como os blocos conversam) e o que fica em cada um. Mudar uma casa é fácil; mudar o traçado da cidade é caro. Por isso a arquitetura vem antes.
Três desenhos de cidade que o edital cobra:
- Em camadas: um restaurante. O salão atende o cliente (apresentação), a cozinha prepara (regras de negócio) e a despensa guarda (dados). O garçom não entra na despensa: cada camada só fala com a vizinha.
- Microsserviços: em vez de uma loja gigante (o monolito), um shopping de lojas pequenas. Cada uma tem o seu estoque (o seu banco de dados), abre e fecha sem depender das outras e conversa com elas por um balcão combinado (uma API).
- Orientada a eventos: o alto-falante do shopping. Uma loja anuncia “chegou mercadoria” (um evento), e quem se interessa reage, sem que a loja precise saber quem está ouvindo.
Dentro de cada bloco, valem os princípios de projeto, regras de boa construção: cada peça faz uma coisa só (coesão alta), as peças dependem pouco umas das outras (acoplamento baixo), e os princípios SOLID, DRY, KISS e YAGNI dizem como chegar lá.
Frase para guardar: camadas separam por função, microsserviços separam por negócio, eventos avisam sem saber quem ouve; alta coesão, baixo acoplamento.
Em 1 minuto
- SOLID, um princípio por letra:
- S, responsabilidade única: uma classe tem um só motivo para mudar.
- O, aberto/fechado: aberta para extensão, fechada para modificação (acrescenta-se comportamento sem mexer no que funciona).
- L, substituição de Liskov: um subtipo tem de poder substituir o tipo base sem quebrar quem o usa.
- I, segregação de interfaces: várias interfaces pequenas e específicas, em vez de uma grande; ninguém depende de métodos que não usa.
- D, inversão de dependência: depender de abstrações (interfaces), não de implementações concretas.
- DRY (não se repita): cada regra fica num lugar só. KISS (mantenha simples): a solução mais simples que resolve. YAGNI (você não vai precisar disso): não construir hoje o que talvez se peça amanhã.
- SOA (arquitetura orientada a serviços): serviços de negócio reutilizáveis, com contratos formais, muitas vezes integrados por um barramento (ESB) e SOAP. Microsserviços: serviços menores, implantados de forma independente, cada um com seus dados, comunicando-se por APIs leves (REST, gRPC) ou mensagens.
- Eventos: produtores publicam, consumidores assinam (publicar e assinar, ou pub/sub), por um intermediário de mensagens, como Kafka ou RabbitMQ. Ganha-se desacoplamento; aceita-se consistência eventual.
- Outros padrões arquiteturais: cliente-servidor, MVC (modelo, visão e controlador), hexagonal (portas e adaptadores) e pipes and filters (dutos e filtros).
Exemplo concreto: o sistema de protocolo cresce
Começo, um monolito em camadas. Uma aplicação só, com três camadas: as telas (apresentação), as regras do protocolo (negócio) e o acesso ao banco (dados). Simples de construir e implantar: KISS.
Depois, microsserviços com eventos. O sistema cresceu, e cada parte muda num ritmo. A equipe separa três serviços: Protocolo, Distribuição e Notificação. Quando um processo é protocolado, o serviço Protocolo publica o evento ProcessoProtocolado. A Distribuição sorteia o relator; a Notificação avisa o interessado por e-mail. Se a Notificação cair, o protocolo continua funcionando, e os avisos saem quando ela voltar.
Dentro da Notificação, o SOLID. O primeiro código dependia direto do e-mail:
class ServicoDeNotificacao {
private EmailSmtp email = new EmailSmtp(); // preso a uma implementação concreta
void avisar(String msg) { email.enviar(msg); }
}
Para acrescentar SMS, seria preciso mexer na classe. Com uma abstração, não:
interface Canal { void enviar(String msg); }
class EmailSmtp implements Canal { public void enviar(String msg) { /* envia e-mail */ } }
class Sms implements Canal { public void enviar(String msg) { /* envia SMS */ } }
class ServicoDeNotificacao {
private final Canal canal; // depende da abstração
ServicoDeNotificacao(Canal canal) { this.canal = canal; }
void avisar(String msg) { canal.enviar(msg); }
}
O serviço passou a depender da interface Canal (inversão de dependência), e um canal novo entra como classe nova, sem alterar o serviço (aberto/fechado). E ninguém construiu ainda o canal de WhatsApp “que talvez peçam”: YAGNI.
Comparação: estilos arquiteturais e princípios
| Monolito em camadas | SOA | Microsserviços | |
|---|---|---|---|
| Unidade | Uma aplicação, dividida em camadas | Serviços de negócio reutilizáveis | Serviços pequenos, por capacidade de negócio |
| Implantação | Tudo junto | Por serviço, muitas vezes com dependência do barramento | Cada serviço de forma independente |
| Dados | Um banco para tudo | Frequentemente compartilhados | Um banco por serviço |
| Comunicação | Chamadas internas | Barramento (ESB), SOAP, contratos WSDL | APIs leves (REST, gRPC) e mensagens |
| Vantagem | Simples de começar | Reuso e integração corporativa | Escala e evolui por partes |
| Custo | Cresce e fica difícil de mudar | Barramento centralizado, pesado | Complexidade de sistema distribuído |
| Princípio | Sinal de violação | Correção |
|---|---|---|
| Responsabilidade única | A classe Contrato calcula multa, gera PDF e envia e-mail | Separar em classes com uma responsabilidade cada |
| Aberto/fechado | Cada canal novo exige mais um if dentro do serviço | Interface e uma classe por canal |
| Liskov | A subclasse Quadrado muda a altura quando se muda a largura, e quem usava Retangulo erra a área | Não herdar quando o subtipo não se comporta como o tipo base |
| Segregação de interfaces | A interface Documento obriga a Minuta (rascunho interno, nunca assinado) a implementar assinarDigitalmente() | Interfaces menores (Imprimivel, Assinavel) |
| Inversão de dependência | O serviço cria o EmailSmtp dentro de si | Receber a abstração Canal pelo construtor |
| DRY | A regra da multa está copiada em três telas | Uma função só, chamada pelas três |
| KISS | Um framework de regras configuráveis para três regras fixas | O código simples que resolve |
| YAGNI | Um módulo de exportação para um formato que ninguém pediu | Construir quando houver a necessidade |
| Alta coesão | Baixo acoplamento | |
|---|---|---|
| O que significa | Tudo dentro do módulo trabalha para o mesmo objetivo | O módulo depende pouco de outros, e por interfaces |
| Benefício | Fácil de entender e de testar | Mudança num módulo não se espalha pelos outros |
Como a FCC cobra
Associar cada letra do SOLID ao seu enunciado (ou a um cenário), e as características de microsserviços, SOA, camadas e arquitetura orientada a eventos.
- Coesão e acoplamento (o que se busca: alta coesão, baixo acoplamento).
- DRY, KISS e YAGNI num cenário.
- Monolito × microsserviços: vantagens e custos.
- MVC e camadas.
Pegadinhas
- “O princípio aberto/fechado proíbe acrescentar funcionalidades ao sistema.” Falso: a classe fica aberta para extensão; fechada é só para modificar o que já funciona.
- “Em microsserviços, o ideal é todos os serviços compartilharem o mesmo banco de dados.” Falso: cada serviço tem os seus dados; o banco compartilhado acopla os serviços.
- “Um bom projeto busca baixa coesão e alto acoplamento.” Falso: é o contrário, alta coesão e baixo acoplamento.
- “A inversão de dependência manda os módulos de alto nível dependerem das implementações de baixo nível.” Falso: os dois devem depender de abstrações.
- “YAGNI é o mesmo que DRY.” Falso: YAGNI é não construir o que não se precisa ainda; DRY é não repetir a mesma regra em vários lugares.
- “Microsserviços são sempre a melhor escolha.” Falso: trazem a complexidade de um sistema distribuído; para sistemas pequenos, um monolito bem dividido costuma bastar (KISS).
Explique com suas palavras
Explique a um gestor por que o sistema de notificação foi desenhado com uma interface Canal, e que princípios isso aplica, usando o exemplo de acrescentar o envio por SMS.
- Escreva sem olhar a lição, com frases curtas e um exemplo seu.
- Onde travar ou precisar de jargão, há uma lacuna: releia só essa parte.
- Compare com a explicação-modelo e reescreva o que faltou.
Fica salva neste navegador.
Comparar com uma explicação-modelo
No começo, o serviço de notificação estava preso ao e-mail: ele mesmo criava o envio de e-mail lá dentro. Para mandar SMS, seria preciso abrir e alterar esse serviço, correndo o risco de estragar o que já funcionava.
Com a interface Canal, o serviço passou a dizer só “eu preciso de algo que saiba enviar uma mensagem”, sem se importar se é e-mail ou SMS. Para acrescentar o SMS, basta criar uma peça nova que saiba enviar SMS e entregá-la ao serviço. Isso aplica dois princípios: o serviço depende de uma abstração, e não de um envio específico (inversão de dependência), e o sistema cresce acrescentando peças, sem modificar as antigas (aberto/fechado).
Teste-se
Engenharia de Software · Arquitetura e SOLID · Inédita, estilo FCC
Questão 1 de 3
Entre os princípios SOLID, aquele segundo o qual uma classe deve ter um único motivo para mudar é o princípio
A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.
Toque longo numa alternativa para riscá-la.
Engenharia de Software · Arquitetura e SOLID · Inédita, estilo FCC
Questão 2 de 3
Para incluir o envio de avisos por SMS, a equipe criou a classe Sms, que implementa a interface Canal, sem alterar a classe ServicoDeNotificacao, que recebe um Canal pelo construtor em vez de criar internamente o envio de e-mail. Esse desenho aplica, sobretudo, os princípios
A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.
Toque longo numa alternativa para riscá-la.
Engenharia de Software · Arquitetura e SOLID · Inédita, estilo FCC
Questão 3 de 3
A classe Quadrado foi criada como subclasse de Retangulo. Ao alterar a largura de um Quadrado, a altura também muda, e trechos do sistema que recebiam um Retangulo, alteravam a largura e esperavam a altura inalterada passaram a calcular áreas erradas. O princípio violado é o
A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.
Toque longo numa alternativa para riscá-la.
Mais duas questões deste tópico estão em Questões.
Flashcards gerados
| Frente | Verso |
|---|---|
| Arquitetura em camadas | Divide o sistema em apresentação, regras de negócio e dados; cada camada só conversa com a vizinha. |
| Arquitetura orientada a eventos | Produtores publicam eventos e consumidores interessados reagem, por um intermediário de mensagens (publicar e assinar); ganha-se desacoplamento e aceita-se consistência eventual. Exemplo: O evento ProcessoProtocolado faz a Distribuição sortear o relator e a Notificação avisar o interessado. |
| Coesão e acoplamento | Busca-se alta coesão (tudo no módulo serve ao mesmo objetivo) e baixo acoplamento (o módulo depende pouco de outros). |
| Segregação de interfaces | Preferir várias interfaces pequenas e específicas a uma grande, para que nenhuma classe dependa de métodos que não usa. |
| Padrão MVC | Separa o modelo (dados e regras), a visão (a tela) e o controlador (recebe as ações do usuário e coordena os dois). |
Ligação com o estudo de caso
Num caso que peça uma arquitetura, não comece por microsserviços. Justifique: o tamanho da equipe, a necessidade de escalar partes diferentes, a frequência de mudança de cada parte. Um monolito modular em camadas, com módulos coesos e pouco acoplados, pode evoluir para serviços depois. Se houver integração entre sistemas que não devem esperar uns pelos outros (protocolo, distribuição, notificação), proponha eventos com um intermediário de mensagens.
Fontes da lição
- Edital nº 01/2026, Anexo II, Engenharia de Software (fontes/edital-01-2026.txt).
- Robert C. Martin, Arquitetura limpa (princípios SOLID, coesão e acoplamento).
- Martin Fowler e James Lewis, “Microservices” (2014).
- Andrew Hunt e David Thomas, O programador pragmático (DRY).
- Len Bass, Paul Clements e Rick Kazman, Software Architecture in Practice (estilos e padrões arquiteturais).
Claude explica
Tire dúvidas sobre este tema no Claude: o site copia o pedido com a lição e abre uma conversa nova, na sua conta. Confira na fonte qualquer fato de lei ou de norma.
Pratique fora do site
Faça questões da FCC sobre este tópico no QConcursos ou no Gran e registre aqui quantas fez: elas contam na meta da semana e no status do tópico.