Alura > Cursos de Programação > Cursos de .NET > Conteúdos de .NET > Primeiras aulas do curso C#: dominando Orientação a Objetos

C#: dominando Orientação a Objetos

Organizando o projeto - Apresentação

Daniel: Boas-vindas a mais um curso na Alura sobre orientação a objetos com C#.

Eu sou Daniel Portugal, analista de sistemas e instrutor na Alura.

Daniel Portugal é um homem branco com cabelo e barba curtos e pretos. Tem olhos castanhos, usa óculos quadrados de armação preta e está de casaco preto.

Ao meu lado, o instrutor que vai nos ajudar nesse curso.

Guilherme: Olá, meu nome é Guilherme Lima. Também sou um dos instrutores desse treinamento.

Guilherme é um homem branco, de cabelo curto e barba castanhos, e olhos também castanhos. Usa óculos quadrados de armação preta e está com uma camisa cinza estampada.

Em que vamos nos aprofundar?

Daniel: Aprendemos o básico de orientação a objetos no curso anterior da formação C#.

Agora, vamos preencher as lacunas, falando sobre herança, interface e polimorfismo. Vamos aplicar esses conceitos em um projeto bastante prático.

Guilherme: Além disso, vamos aplicar inteligência artificial em um projeto C#, seguindo boas práticas de programação e deixando nosso código próximo do que acontece nos projetos reais dessa linguagem.

Se você quer aprofundar ainda mais seus conhecimentos em orientação a objetos com C#, esse curso é para você!

Organizando o projeto - Abrindo o projeto

Guilherme: Vamos iniciar nossos estudos? Para começar, vamos utilizar como base o projeto Screen Sound do primeiro curso onde criamos nossa primeira aplicação, aplicando conhecimentos do projeto do segundo curso onde aplicamos orientação a objetos.

Porém, teremos desafios, pois tivemos alguns incrementos no projeto.

Uma reflexão é que todo código que você criar na sua carreira como desenvolvedor(a) vai sofrer alteração, edição e manutenção. Alguns códigos criados por outras pessoas vão funcionar, outras vão causar erros. Isso é comum. Vamos perceber isso de forma prática.

Já fizemos download do projeto base que vamos usar durante o curso, disponibilizado na atividade "Preparando o ambiente".

Mudanças no projeto Screen Sound

Daniel: Após baixar e descompactar o arquivo, vamos à pasta raiz e abrimos o arquivo ScreenSound.sln com duplo clique. Com isso, abre-se o Microsoft Visual Studio com o projeto aberto.

Vamos clicar na aba "Gerenciador de soluções" na lateral direita para visualizar os arquivos que compõem o projeto. Basicamente, temos uma mistura do primeiro e segundo curso.

No primeiro curso, temos a aplicação ScreenSound que fazia registro e avaliava bandas. No segundo curso, aplicamos orientação a objetos e temos algumas classes para representar o modelo de sistemas, como:

Guilherme: Primeiro, vamos conferir o Program.cs que contém o programa inicial. Visualmente, parece muito com o código anterior. Mas, no método ExibirOpcoesDoMenu(), temos uma opção a mais para exibir detalhes de uma banda.

Program.cs:

// código omitido…

void ExibirOpcoesDoMenu()
{
    ExibirLogo();
    Console.WriteLine("\nDigite 1 para registrar uma banda");
    Console.WriteLine("Digite 2 para registrar o álbum de uma banda");
    Console.WriteLine("Digite 3 para mostrar todas as bandas");
    Console.WriteLine("Digite 4 para avaliar uma banda");
    Console.WriteLine("Digite 5 para exibir os detalhes de uma banda");
    Console.WriteLine("Digite -1 para sair");

// código omitido…

}

Depois temos o switch(opcaoEscolhidaNumerica) para cada uma das 5 opções. Em seguida, temos as funções principais de RegistrarBanda() e MostrarBandasRegistradas().

Daniel: Nesse caso, temos duas mudanças no projeto inicial do curso.

Primeiro, ao invés de exibir só a média de uma banda, também exibimos os detalhes da banda. Segundo, também é novo o registro do álbum de uma banda. Assim, podemos registrar a banda e seus álbuns.

Guilherme: Interessante. Na segunda linha do código, estamos usando uma lista de banda registradas. É um dicionário que tem uma chave que é o nome da banda e a lista de inteiros que são as notas que aquela banda recebe.

Dictionary<string, List<int>> bandasRegistradas = new Dictionary<string, List<int>>();
bandasRegistradas.Add("Linkin Park", new List<int> { 10, 8, 6 });
bandasRegistradas.Add("The Beatles", new List<int>());

// código omitido…

Você mostrou na aba "Gerenciador de Soluções" que existem algumas classes, mas ainda não a estamos usando. Em suma, temos o código principal mais algumas classes para utilizar nesse projeto.

Daniel: Esse é o primeiro desafio: integrar as classes que trouxemos no Program.cs.

Organização do projeto

Guilherme: Nessas classes, temos construtores, propriedades, alguns métodos e conseguimos entender o propósito de cada uma claramente. Afinal, nesse projeto educacional, temos apenas três classes e o programa principal para manipular, editar e atualizar.

Porém, em um projeto real podemos ter centenas de classes. Se o nosso projeto tivesse muitas classes para fazer integração, não conseguiríamos saber nem em qual classe mexer atualmente.

Daniel: Fica difícil de encontrar, principalmente porque estão todas na mesma pasta e no mesmo nível. Precisaríamos usar ferramentas da IDE para encontrar o arquivo.

Podemos facilitar essa busca ao trazer uma melhor organização de classes.

Guilherme: Nesse primeiro momento, não vamos aplicar as classes. Na verdade, vamos entender como organizar os arquivos, pensando em manutenção, suporte e facilidade de acesso.

Daniel: Sim, como fazemos manutenção na classe Banda.cs, se não conseguimos encontrá-la dentre centenas de arquivos? Precisamos começar a separá-las em diretórios.

Para isso, no "Gerenciador de soluções" à direita, vamos clicar com o botão direito do mouse em cima do projeto ScreenSound e escolher a opção "Adicionar > Nova Pasta".

Vamos dar um nome arbitrário comumente utilizado nos projetos no mercado de trabalho para separar classes que representam o modelo de negócio trabalhado. Vamos colocar "Modelos" no plural.

Essa pasta ainda está vazia. Agora, vamos mover os arquivos Album.cs, Banda.cs e Musica.cs para dentro dessa nova pasta. Basta clicar no primeiro, apertar a tecla "Shift" e clicar no último para selecionar todos e arrastá-los para cima da pasta "Modelos".

Aparece um alerta para confirmar se queremos movê-los para um novo local. Vamos apertar "OK".

Em seguida, aparece outro alerta para ajustar namespaces para arquivos movidos. Queremos dar mais atenção a esse alerta e podemos fazê-lo no próximo vídeo.

Guilherme: Segura a ansiedade e não aperte nenhum botão. Vamos fazer essa correção logo após dar ênfase nessa palavra tão importante para o C#.

Organizando o projeto - Namespaces

Daniel: Apareceu no Visual Studio um alerta com a seguinte pergunta:

Ajustar namespaces para arquivos movidos?

Esse termo namespaces é algo novo que deveríamos prestar atenção. Quando aparece um termo novo sobre o qual queremos conhecer, geralmente acessamos a documentação da linguagem ou da biblioteca.

Nesse caso, separamos um link da documentação do C# sobre namespaces, um fundamento da linguagem.

Basicamente, a documentação explica que o namespace é usado para organizar os tipos, sejam classes ou outros.

Nós começamos um processo de organização ao levar as classes para uma pasta. O Visual Studio tem uma extensão que vai tentar criar um namespace para refletir aquela pasta criada.

Guilherme: A documentação traz um exemplo interessante com o Console.WriteLine(), que usamos bastante. Nesse caso, system é o namespace e Console é uma classe.

System.Console.WriteLine("Hello World!");

Podemos usar using e o nome do namespace para não precisar referenciar sempre o caminho exato onde estão aqueles arquivos.

using System;

Console.WriteLine("Hello World!");

Daniel: É uma maneira de economizar digitação. Vamos aprender isso, na prática. Primeiro, vamos fazer o caminho longo e depois com o using para perceber como fica mais fácil.

Nessa versão específica do Visual Studio que estamos rodando, essa ferramenta de ajustar namespaces não funcionou. Por isso, vamos apertar o "Não" e fazer esse ajuste manualmente para mostrar como deveria ficar no arquivo.

Ajustar namespaces

Primeiro, vamos abrir o arquivo Banda.cs para começar pela hierarquia maior.

O que seria colocar o namespace no seu tipo? Na primeira linha, vamos apertar "Enter" para criar uma linha acima da declaração da classe Banda. Nela, vamos escrever a palavra reserva namespace e o próximo identificador será o nome do namespace.

Existem regras de nomenclaturas para o namespace. É comum colocar nome do projeto/empresa, em seguida o nome do módulo/pasta. A separação desses segmentos é o ponto.

Nesse caso, vamos escrever ScreenSound.Modelos. Ao final, colocamos o ponto e vírgula.

Banda.cs:

namespace ScreenSound.Modelos;

class Banda
{

// código omitido…

}

Se você pegar um código legado, isto é, que já existe de projetos anteriores, você pode encontrar uma declaração de namespace diferente.

Por exemplo, em vez de ponto e vírgula no final, tem abre e fecha chaves. Entre as chaves, ficaria a classe. Tem o mesmo significado.

Exemplo

namespace ScreenSound.Modelos
{
    class Banda
    {

// código omitido…

    }
}

A diferença é que, quando usamos ponto e vírgula, temos um código mais elegante e enxuto, economizando indentação. Com isso, tudo que vier embaixo dessa declaração vai fazer parte desse namespace. Por isso, vamos usar essa recomendação do C# 10 a partir daqui.

Guilherme: Esse nome de namespace ScreenSound.Modelos referente ao nome do projeto e da pasta vai ser o mesmo para as outras classes?

Daniel: Sim, basta copiar com "Ctrl + C" e colar com "Ctrl + V" na primeira linha dos arquivos Album.cs e Musica.cs. Salvamos os arquivos.

Diretiva using

Guilherme: Agora que aplicamos os namespaces, o desafio é de fato começar a utilizar essas classes no nosso arquivo principal.

Daniel: Em Program.cs, na três primeiras linhas, criamos um dicionário onde a chave é do tipo string com o nome da banda e o valor é uma lista de inteiros com as respectivas notas. Mas, o que queremos é um dicionário de bandas.

Para começar a entender como funcionaria, vamos criar as bandas Ira! e The Beatles como objetos da classe Banda.

Primeiro, vamos fazer referência ao tipo Banda. Repare que demos "Esc" para não autocompletar, porque queremos mostrar a questão do using.

Em seguida, colocamos ira como variável igual ao objeto new Banda() através do construtor, onde passamos o nome da Banda Ira! entre aspas duplas.

Program.cs:

Banda ira = new Banda("Ira!");

Repare que o compilador coloca Banda sublinhado de vermelho, indicando que não reconhece essa classe.

Guilherme: O Visual Studio não sabe o que é Banda. Se passamos o mouse por cima do erro, o aviso é que o nome do tipo ou do namespace Banda não pode ser encontrado.

Daniel: Inclusive, dá uma sugestão de usar uma diretiva using ou uma referência de assembly. É isso o que vamos fazer, mas antes vamos mostrar na prática como poderíamos escrever diretamente para fazer o compilador reconhecer essa classe.

Antes de Banda, poderíamos escrever ScreenSound.Modelos.. Assim, ele já consegue reconhecer.

Exemplo

ScreenSound.Modelos.Banda ira = new ScreenSound.Modelos.Banda("Ira!");

Guilherme: Teria que escrever muito! Fora de cogitação.

Daniel: Sim, imagine ter que fazer o mesmo para a banda do The Beatles e outras bandas. Seria uma quantidade enorme de código repetido só para tentar achar a classe Banda.

Por isso, a diretiva using é tão importante. Se colocamos no topo do documento o using ScreenSound.Modelos, não precisamos mais colocar a referência antes da Banda. Por isso, esse trecho do código fica na cor cinza, pois não é mais necessário.

Inclusive, podemos economizar mais ao não colocar Banda após new. Afinal, já declaramos a variável do tipo Banda, portanto, seu tipo está explícito.

using ScreenSound.Modelos;

Banda ira = new Banda("Ira!");
Banda beatles = new("The Beatles");

Se a variável é do tipo Banda, então usar o mesmo tipo podemos no construtor.

O próximo passo é colocar os tipos na aplicação Program.cs.

Sobre o curso C#: dominando Orientação a Objetos

O curso C#: dominando Orientação a Objetos possui 130 minutos de vídeos, em um total de 49 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas