Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
44m 47s
Na Lição 16 do curso "C# App Start to Finish", Tim Corey continua construindo o formulário de Criação de Torneio, mas o verdadeiro objetivo de aprendizado vai muito além de conectar botões e caixas de lista. Enquanto Tim trabalha na conexão das formas, ele introduz um conceito central de design de software em C#: interfaces usadas para acoplamento fraco. Esta lição mostra interfaces não como uma ideia acadêmica abstrata, mas como uma ferramenta prática para resolver problemas reais em uma aplicação WinForms.
Neste artigo, damos uma olhada mais aprofundada em como Tim Corey explica interfaces, por que ele as utiliza e como elas ajudam a evitar acoplamento forte. Todas as explicações, raciocínios e conclusões vêm diretamente do walkthrough de Tim, usando o seu fluxo, terminologia e exemplos do transcript.
Às 1:18, Tim começa a conectar os elementos da IU de Criar Prêmio e Criar Equipe. Ele imediatamente aponta que este passo pode parecer intimidante, não porque chamar outro formulário seja difícil, mas porque obter os dados de volta corretamente é onde as pessoas geralmente erram.
Tim explica que o desafio não é abrir outro formulário — essa parte é fácil. O desafio é como um formulário se comunica de volta com outro sem criar problemas de design a longo prazo. É aqui que a ideia de definir contratos em vez de dependências começa a importar.
Por volta das 1:34, Tim menciona explicitamente um erro comum: conectar diretamente o formulário Criar Torneio ao formulário Criar Prêmio. Nesta abordagem, uma classe sabe exatamente com qual outra classe está falando.
Tim explica que isso cria acoplamento forte, o que significa que os formulários dependem um do outro diretamente. Se um formulário mudar, o outro será afetado. Se outra parte do programa mais tarde quiser a mesma funcionalidade, não poderá reutilizá-la.
Ele enfatiza que, embora isso possa compilar e funcionar, não é uma boa escolha de design a longo prazo, especialmente em sistemas maiores ou ambientes profissionais.
Às 2:02, Tim faz uma pausa e escreve as etapas em vez de pular direto para o código. Ele lista:
Chame o formulário Criar Prêmio
Obtenha um PrizeModel de volta
Adicione-o à lista de prêmios selecionados
Tim explica que escrever as etapas primeiro ajuda a evitar erros de lógica e torna a intenção do código clara. Esse pensamento estruturado torna-se especialmente importante uma vez que interfaces são introduzidas, porque interfaces definem o que deve acontecer, não como isso acontece.
Por volta das 4:56, Tim explica um detalhe importante sobre modelos sendo passados. Ele lembra os espectadores que estão passando endereços, não cópias de objetos.
Quando o prêmio é salvo através do conector de dados, o modelo já tem seu ID preenchido. Tim aponta que retornar o modelo novamente geralmente é desnecessário, porque a instância já foi modificada.
Isso reforça por que interfaces não existem para mover dados cegamente — elas existem para sinalizar conclusão e responsabilidade, não duplicação.
Às 6:42, Tim discute a ideia de passar um PrizeModel para o construtor do formulário para que ambos os formulários compartilhem a mesma instância.
Ele explica por que isso falha em um caso de uso real: se o usuário cancelar o formulário, você acaba com um prêmio vazio ou inválido em sua lista. Tim mostra que, só porque duas classes podem compartilhar dados de instância, não significa que devem.
Este momento reforça a ideia de que interfaces definem comportamento, não armazenamento de dados.
Por volta de 7:46, Tim aborda outra abordagem comum: passar todo o formulário Criar Torneio para o formulário Criar Prêmio e chamar um método público como SavePrize.
Tim explica por que isso é ainda pior:
O formulário de prêmio agora sabe exatamente qual classe está chamando-o
Nenhuma outra classe não relacionada pode reutilizar o formulário de prêmio
A classe fica presa em um único caso de uso
Ele nomeia explicitamente isso como acoplamento forte, que é o que estamos tentando evitar.
Às 9:01, Tim apresenta a solução: uma interface.
Ele cria uma nova interface usando a palavra-chave interface e a nomeia IPrizeRequester. Tim lembra aos espectadores que uma interface:
Não é uma classe
Não contém métodos concretos
Existe para definir um contrato
A interface contém um único método:
Tim explica que este método define o que deve acontecer, não como isso acontece.
Às 9:40, Tim explica que quem implementa essa interface concorda em suportar aquele método. A interface tem membros públicos por padrão e não declara dados de instância.
É aqui que Tim deixa claro que interfaces definem capacidade, não armazenamento. A classe implementadora decide o que fazer quando o método é chamado.
Às 10:19, Tim modifica o construtor do formulário Criar Prêmio para aceitar um IPrizeRequester em vez de um formulário concreto.
Ele explica que isso significa:
Alguém irá chamar o formulário
O formulário não sabe quem é
O único requisito é que o chamador implemente a interface
Isso é acoplamento fraco na prática. O formulário de prêmio depende de um tipo de interface, não de uma classe específica.
Às 11:06, Tim armazena a instância da interface no nível da classe. Ele explica que os parâmetros do construtor só existem dentro do construtor, a menos que sejam armazenados.
Isso permite que o formulário de prêmio mais tarde chame PrizeComplete de dentro do evento de clique no botão.
Às 11:49, Tim demonstra o momento chave:
callingForm.PrizeComplete(model);
Ele explica que o formulário de prêmio está agora chamando de volta para quem implementou a interface e dizendo:
"Terminei, e aqui está o modelo completo."
Apenas após essa chamada o formulário é fechado. Isso garante que o prêmio só é adicionado quando a criação foi bem-sucedida.
Às 13:29, Tim muda para o formulário Criar Torneio e implementa a interface.
Ele explica a palavra-chave this às 13:58, descrevendo-a como a instância atual — o objeto real na memória. Ao passar this, o formulário está entregando seu endereço, mas apenas através do contrato de interface.
Às 18:41, Tim introduz uma segunda interface: ITeamRequester.
Ele explica que, embora uma classe possa herdar de apenas uma classe base (como Form), ela pode implementar várias interfaces. Isso permite que uma única classe suporte múltiplos comportamentos não relacionados sem herança múltipla.
Tim enfatiza que interfaces não trazem código — elas apenas definem métodos necessários.
Perto das 42:08, Tim reflete sobre por que usar padrões importa. Repetir a mesma estrutura baseada em interface torna os passos óbvios que estão faltando e a depuração mais fácil.
Tim encoraja a escrever as coisas, usar padrões consistentes e não tentar guardar tudo na cabeça. Segundo ele, um bom design não é sobre perfeição — é sobre clareza, estrutura e tornar mudanças futuras fáceis.
Na Lição 16, Tim Corey usa um caso de uso real de WinForms para demonstrar como interfaces permitem acoplamento fraco. Em vez de se basear em exemplos abstratos, ele mostra como interfaces:
Definem contratos
Desacoplam classes
Suportam várias interfaces em uma única classe
Evitam acoplamento forte
Melhoram a flexibilidade a longo prazo
Ao final da lição, a aplicação não apenas funciona — ela está estruturada de uma forma que suporta crescimento, reutilização e clareza. A abordagem de Tim torna as interfaces práticas, propositais e essenciais no desenvolvimento C# do mundo real.
Para uma aplicação completa e de ponta a ponta destes conceitos de interface e acoplamento fraco em ação, assista ao vídeo completo da Lição 16, onde cada passo é implementado, testado e refinado dentro da aplicação C# em funcionamento.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy