3
respostas

Desafio: hora da prática (1/3)

Atividade 1, gerei uma imagem com minha modelagem para facilitar o processo mas não está no padrão de um diagrama de classes, é apenas representativo.

Modelagem ![[Pasted image 20260312100615.png]]

Program.cs

using PetShop.Modelos;
void LimpaTela() {
    Console.ReadKey();
    Console.Clear();
}

// Instanciando Objetos:
var cachorro01 = new Pet (1, "Thomas", "Maltês");
var medico01 = new Medico (1, "Romário", 15000m);
var consulta01 = new Consulta(1, medico01, cachorro01, new DateTime(2023,12,15));

Console.Clear();
Console.WriteLine("Apresentando Dono: ");
Console.WriteLine($"{Dono.Descricao}");
LimpaTela();


Console.WriteLine("Apresentando Cachorro: ");
cachorro01.ExibeDetalhes();
LimpaTela();

Console.WriteLine("Apresentando Médico: ");
medico01.ExibeDetalhes();
LimpaTela();

Console.WriteLine("Apresentando Consulta: ");
consulta01.ExibeDetalhes();
LimpaTela();

Dono.cs

namespace PetShop.Modelos;
internal class Dono {
    public static string? Nome = "Carlos";
    public static string? Descricao => $"{Nome} é proprietário do Pet Shop, atuando na área de cuidados e bem-estar animal.";
}

Pet.cs

namespace PetShop.Modelos;
internal class Pet {
    private List<Consulta> listaConsultas = new();
    public int Id {get;}
    public string? Nome {get;}
    public string? Raca {get;}

    public override string ToString() {
        return $"{Nome}";
    }
    public Pet(int id, string? nome, string? raca) {
        Id = id;
        Nome = nome;
        Raca = raca;
    }

    public void ExibeDetalhes() {
        Console.WriteLine($"ID: {Id}");
        Console.WriteLine($"Nome: {Nome}");
        Console.WriteLine($"Raça: {Raca}");
        Console.WriteLine("Lista de Consultas: ");
        listaConsultas.ForEach(consulta => Console.WriteLine($"- {consulta}"));
    }

    public void AdicionarConsulta(Consulta consulta) {
        listaConsultas.Add(consulta);
    }
}

Medico.cs

namespace PetShop.Modelos;
internal class Medico {
    private List<Consulta> listaConsultas = new();
    public int Id {get;}
    public string? Nome {get;}
    public decimal Salario {get;}

    public override string ToString() {
        return $"{Nome}";
    }

    public Medico(int id, string? nome, decimal salario) {
        Id = id;
        Nome = nome;
        Salario = salario;
    }

    public void AdicionarConsulta(Consulta consulta) {
        listaConsultas.Add(consulta);
    }

    public void ExibeDetalhes() {
        Console.WriteLine($"ID: {Id}");
        Console.WriteLine($"Nome: {Nome}");
        Console.WriteLine($"Salário: R${Salario}");
        Console.WriteLine("Lista de Consultas: ");
        listaConsultas.ForEach(consulta => Console.WriteLine($"- {consulta}"));
    }
}

Consulta.cs

namespace PetShop.Modelos;
internal class Consulta {
    public int Id {get;set;}
    public Medico? MedicoAtendente {get;}
    public Pet? PetAtendido {get;}
    public DateTime DataConsulta {get;}

    public override string ToString() {
        return $"{DataConsulta.ToString("dd/MM/yyyy")}";
    }

    public Consulta(int id, Medico? medicoAtendente, Pet? petAtendido, DateTime dataConsulta) {
        Id = id;
        MedicoAtendente = medicoAtendente;
        PetAtendido = petAtendido;
        DataConsulta = dataConsulta;

        medicoAtendente!.AdicionarConsulta(this);
        petAtendido!.AdicionarConsulta(this);
    }

    public void ExibeDetalhes() {
        Console.WriteLine($"Médico: {MedicoAtendente}");
        Console.WriteLine($"Pet: {PetAtendido}");
        Console.WriteLine($"Data da Consulta: {DataConsulta.ToString("dd/MM/yyyy")}");
    }
}
3 respostas

Para a atividade 2
Program.cs

using Oficina.Modelos;
void LimpaTela() {
    Console.ReadKey();
    Console.Clear();
}
Console.Clear();
var cliente01 = new Cliente(1, "José");
var carro01 = new Carro(1, "Honda", "Civic", 2020, cliente01);
var funcionario01 = new Funcionario(1, "Rafael", 5000, "Mecânico");
var servico01 = new Servico(1,"Manutenção",cliente01,carro01,funcionario01,new DateTime(2025,12,20));
servico01.ExibirDetalhes();LimpaTela();
carro01.ExibirDetalhes();
LimpaTela();
cliente01.ExibirDetalhes();
LimpaTela();
funcionario01.ExibirDetalhes();
LimpaTela();

Cliente.cs

namespace Oficina.Modelos;
internal class Cliente {
    internal List<Carro> listaCarros = new ();
    private List<Servico> listaServicos = new();
    public int ID {get;}
    public string? Nome {get;}
    public override string ToString() {
        return $"{Nome}";
    }
    public Cliente(int iD, string? nome) {
        ID = iD;
        Nome = nome;
    }
    public void AdicionarServico(Servico servico) {
        listaServicos.Add(servico);
    }
    public void AdicionarCarros(Carro carro) {
        listaCarros.Add(carro);
    }
    public void ExibirDetalhes() {
        Console.WriteLine($"ID do Cliente: {ID}");
        Console.WriteLine($"Nome: {Nome}");
        Console.WriteLine("Lista de Carro: ");
        listaCarros.ForEach(carro => Console.WriteLine($"- {carro.Modelo}"));
        Console.WriteLine("Lista de Serviços: ");
        listaServicos.ForEach(servico => Console.WriteLine($"- {servico.DataServico.ToString("dd/MM/yyyy")}"));
    }
}

Funcionario.cs

namespace Oficina.Modelos;
internal class Funcionario {
    private List<Servico> listaServicos = new();
    public int ID {get;}
    public string? Nome {get;}
    public string Cargo {get;}
    public decimal Salario {get;}
    public override string ToString() {
        return $"{Nome}";
    }
    public Funcionario(int iD, string? nome, decimal salario, string cargo) {
        ID = iD;
        Nome = nome;
        Salario = salario;
        Cargo = cargo;
    }
    public void AdicionarServico(Servico servico) {
        listaServicos.Add(servico);
    }
    public void ExibirDetalhes() {
        Console.WriteLine($"ID do Funcionario: {ID}");
        Console.WriteLine($"Nome: {Nome}");
        Console.WriteLine($"Cargo: {Cargo}");
        Console.WriteLine($"Salário: R${Salario}");
        Console.WriteLine("Lista de Serviços: ");
        listaServicos.ForEach(servico => Console.WriteLine($"- {servico.DataServico.ToString("dd/MM/yyyy")}"));
    }
}

Carro.cs

namespace Oficina.Modelos;
internal class Carro {
    public int ID {get;}
    public string? Marca {get;}
    public string? Modelo {get;}
    public int Ano {get;}
    public Cliente DonoCarro {get;}
    public Carro(int iD, string? marca, string? modelo, int ano, Cliente cliente) {
        ID = iD;
        Marca = marca;
        Modelo = modelo;
        Ano = ano;
        DonoCarro = cliente;
        cliente.AdicionarCarros(this);
    }
    public void ExibirDetalhes() {
        Console.WriteLine($"ID do Carro: {ID}");
        Console.WriteLine($"Marca: {Marca}");
        Console.WriteLine($"Modelo: {Modelo}");
        Console.WriteLine($"Ano: {Ano}");
        Console.WriteLine($"Dono do Carro: {DonoCarro}");    
    }
}

Servico.cs

namespace Oficina.Modelos;
internal class Servico {
    public int ID {get;}
    public string? Tipo {get;}
    public Cliente? ClienteRequisitante {get;}
    public Carro? CarroCliente {get;}
    public Funcionario? FuncionarioAtendente {get;}
    public DateTime DataServico = new();
    public Servico(int iD, string? tipo, Cliente? clienteRequisitante, Carro? carroCliente, Funcionario? funcionarioAtendente, DateTime dataServico) {
        if (clienteRequisitante!.listaCarros.Contains(carroCliente!)) {
            ID = iD;
            Tipo = tipo;
            ClienteRequisitante = clienteRequisitante;
            CarroCliente = carroCliente;
            FuncionarioAtendente = funcionarioAtendente;
            DataServico = dataServico;
            ClienteRequisitante!.AdicionarServico(this);
            FuncionarioAtendente!.AdicionarServico(this);
        } else {
            Console.WriteLine($"O carro {carroCliente!.ID} não pertence ao cliente {clienteRequisitante}.");
        }
    }
    public void ExibirDetalhes() {
        Console.WriteLine($"ID do Serviço: {ID}");
        Console.WriteLine($"Tipo de Serviço: {Tipo}");
        Console.WriteLine($"Cliente: {ClienteRequisitante}");
        Console.WriteLine($"Carro: {CarroCliente!.Marca}");
        Console.WriteLine($"Funcionário: {FuncionarioAtendente}");
        Console.WriteLine($"Data do Serviço: {DataServico.ToString("dd/MM/yyyy")}");
    }
}

Agora, para a atividade 4, eu criei uma classe Calculadora com métodos estáticos para controlar as ações:

Calculadora.cs

class Calculadora {
    public static void Somar(int a, int b) {
        Console.Clear();
        Console.WriteLine($"{a} + {b} = {a + b}");
    }
    public static void Subtrair(int a, int b) {
        Console.Clear();
        Console.WriteLine($"{a} - {b} = {a - b}");
    }
    public static void Multiplicar(int a, int b) {
        Console.Clear();
        Console.WriteLine($"{a} x {b} = {a * b}");
    }
    public static void Dividir(int a, int b) {
        Console.Clear();
        Console.WriteLine($"{a} / {b} = {a / b}");
    }
    public static void Potencia(int a, int b) {
        Console.Clear();
        Console.WriteLine($"{a} ^ {b} = {Math.Pow(a,b)}");
    }
    public static void RaizQuadrada(int a) {
        Console.Clear();
        Console.WriteLine($"√{a} = {Math.Sqrt(a)}");
    }
}

Program.cs

Console.WriteLine("1. Somar");
Console.WriteLine("2. Subtrair");
Console.WriteLine("3. Multiplicar");
Console.WriteLine("4. Dividir");
Console.WriteLine("5. Potencia");
Console.WriteLine("6. Raiz Quadrada");
Console.Write("Escolha o que você quer fazer: ");
int opcao; int.TryParse(Console.ReadLine()!, out opcao);
Console.Clear();

Console.Write("Escolha um número: ");
int numeroA; int.TryParse(Console.ReadLine()!, out numeroA);

int numeroB = 0;
if (opcao != 6) {
    Console.Write("Escolha outro número: ");
    int.TryParse(Console.ReadLine()!, out numeroB);
}

switch (opcao) {
    case 1: Calculadora.Somar(numeroA, numeroB); break;
    case 2: Calculadora.Subtrair(numeroA, numeroB); break;
    case 3: Calculadora.Multiplicar(numeroA, numeroB); break;
    case 4: Calculadora.Dividir(numeroA, numeroB); break;
    case 5: Calculadora.Potencia(numeroA, numeroB); break;
    case 6: Calculadora.RaizQuadrada(numeroA); break;
}

Oii, Diego.

Parabéns pela dedicação na resolução dos desafios! É muito bom ver como você estruturou as classes e aplicou os conceitos de Orientação a Objetos no C#.

Notei que você teve um cuidado especial com as relações entre os objetos e a organização do código.

  • Relacionamentos bidirecionais: Na atividade da Oficina, você implementou uma lógica excelente no construtor da classe Servico. Ao verificar se o carro realmente pertence ao cliente antes de registrar o serviço, você garantiu a integridade dos dados.
  • Encapsulamento e listas: O uso de listas privadas (listaServicos, listaConsultas) com métodos para adicionar itens é uma prática recomendada, pois evita que a lista seja manipulada externamente de forma indevida.
  • Uso de membros estáticos: Na classe Dono e na Calculadora, o uso de static foi bem aplicado. Como a calculadora não precisa armazenar um estado interno para realizar as operações, os métodos estáticos tornam o uso mais direto.

Sugestões para Enriquecer o Código

Se quiser levar o seu projeto para o próximo nível, aqui estão algumas pequenas sugestões:

  • Tratamento de divisão por zero: Na classe Calculadora.Dividir, seria interessante adicionar uma verificação para o caso do divisor ser zero, evitando que o programa apresente um erro inesperado.
  • Propriedades Expression-Bodied: Em métodos simples como o ToString() ou propriedades somente de leitura, você pode usar a sintaxe de flecha (=>) para deixar o código mais enxuto. Por exemplo:
    public override string ToString() => Nome ?? "Sem nome";

Continue firme nos estudos.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!