Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

7
respostas

[Projeto] Desafio: hora da prática

class Conta
{
    public int NumeroIndicador { get; set; }
    public string Titular { get; set; }
    public int Senha { get; set; }
    public decimal Saldo { get; set; }
}

2°/3°

class Carro
{
    public string Fabricante { get; set; }
    public string Modelo { get; set; }
    
    private int _ano;
    public int Ano
    {
        get => _ano;
        set => _ano = value >= 1960 && value <= 2023 ? 
            value : throw new ArgumentException("Ano inválido");
    }

    public string DescricaoDetalhada => $"Fabricante: {Fabricante}, Modelo: {Modelo}, Ano: {Ano}";
}

class Produto
{
    public string nome;
    public string marca;
    private decimal preco;
    private int estoque;
    public string DescricaoProduto => $"Nome: {nome}" +
        $"\nMarca: {marca}" +
        $"\nPreço: R$: {ObterPreco()}" +
        $"\nQuantidade em estoque: {ObterQuantidadeEstoque()}";

    public void AtribuirPreco (decimal valor)
    {
        if (valor > 0)
        {
            preco = valor;
        }
        else
        {
            Console.WriteLine("Preço inválido");
        }
    }

    public decimal ObterPreco ()
    {
        return preco;
    }

    public void AtribuirQuantidadeEstoque(int quantidade)
    {
        if (quantidade > 0)
        {
            estoque = quantidade;
        }
        else
        {
            Console.WriteLine("Quantidade inválida");
        }
    }

    public int ObterQuantidadeEstoque()
    {
        return estoque;
    }

}
7 respostas

Olá José.
Obrigado por compartilhar seu aprendizado.
Colocar o conteúdo das aulas em pratica é a maneira mais eficiente de aprender.
Continue praticando e se pintar alguma dúvida pode perguntar aqui no fórum.
Bons estudos.

Esperava um feedback mais técnico do que esse, algo que me trouxesse algum aprendizado ou dica.

Ola José.
Tentei lhe passar uma mensagem de apoio sabendo que esta dando os primeiros passos.
Seu codigo é basico demais para qualquer analise e não serve para nenhum proposito real.
Quando estiver mais preparado com um codigo mais robusto e consistente com objetivo pode ter certeza que faço uma analise mais detalhada.
Se quiser uma analise sem contexto pode colar em uma llm e veja os pontos de melhoria mas tera uma resposta generica assim como seu codigo.
Opinião pessoal independente da plataforma.
Bons estudos.

Fiz esse questionamento pois já entreguei trechos de códigos mais simples que esse e tive feedbacks mais relevantes e com um valor técnico maior, por menor que seja a dica, sempre é util para o aprendizado de todos, me limitei apenas em entregar o que o exercício em questão pedia. Mesmo assim obrigado pelo incentivo, mas se você se esforçar um pouco mas pode somar no aprendizado de muita gente, tenho certeza que não te falta capacidade para isso, obrigado.

Desculpa amigo.
É que me senti um pouco ofendido com seu comentario...
Vou fazer uma analise mais tecnica para voce,mas no momento estou muito ocupado.
Assim que possivel lhe retorno...
Espero que ainda possamos ser amigos.
Até...

Olá José!
Como prometido segue uma analise mais detalhada sobre o seu código:
A estrutura geral está coerente para um exercício introdutório, mas há vários pontos que podem ser melhorados em termos de encapsulamento, segurança, coesão e robustez.
Segue a analise de cada classe:

  1. Classe Conta
    Problemas encontrados:
    A senha não deveria ser armazenada como número inteiro.
    Problemas: remove zeros à esquerda; limita caracteres; não representa corretamente o conceito de senha; facilita exposição indevida.
    Saldo possui set público e isso quebra totalmente o encapsulamento.
    Hoje qualquer código pode fazer: conta.Saldo = -999999; Isso é um bug lógico grave.
    Nenhuma propriedade possui validação: titular pode ser vazio; número da conta pode ser negativo; saldo pode ser negativo.
    A classe representa apenas dados, mas uma conta bancária deveria possuir comportamentos: sacar; depositar; transferir; validar senha.
    Sugestão correta:
class Conta
{
    public int NumeroConta { get; private set; }

    private string _titular;
    public string Titular
    {
        get => _titular;
        set
        {
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentException("Titular inválido");

            _titular = value;
        }
    }

    private string _senha;

    public decimal Saldo { get; private set; }

    public Conta(int numeroConta, string titular, string senha)
    {
        NumeroConta = numeroConta;
        Titular = titular;
        _senha = senha;
        Saldo = 0;
    }

    public void Depositar(decimal valor)
    {
        if (valor <= 0)
            throw new ArgumentException("Valor inválido");

        Saldo += valor;
    }

    public bool Sacar(decimal valor)
    {
        if (valor <= 0 || valor > Saldo)
            return false;

        Saldo -= valor;
        return true;
    }

    public bool ValidarSenha(string senha)
    {
        return _senha == senha;
    }
}
  1. Classe Carro
    Essa foi a melhor implementação entre as três.
    Você já utilizou: encapsulamento; validação em propriedade; expression-bodied members; propriedade calculada.
    Boa aplicação de OOP.
    Problemas encontrados:
    Ano fixo em 2023. Esse é um bug de manutenção. Em 2026 o código já está desatualizado.
    Correção:
value >= 1960 && value <= DateTime.Now.Year

Falta validação em Fabricante e Modelo
Hoje é possível:

carro.Modelo = "";

Sugestão correta:

private string _fabricante;
public string Fabricante
{
    get => _fabricante;
    set
    {
        if (string.IsNullOrWhiteSpace(value))
            throw new ArgumentException("Fabricante inválido");

        _fabricante = value;
    }
}

Mesmo conceito para Modelo.
Sua Classe está sem construtor.
O objeto pode nascer inconsistente:

var carro = new Carro();

Melhor abordagem:

public Carro(string fabricante, string modelo, int ano)
{
    Fabricante = fabricante;
    Modelo = modelo;
    Ano = ano;
}
  1. Classe Produto
    Está possui problemas graves.
    Campos públicos:
public string nome;
public string marca;

Isso viola encapsulamento.
Qualquer código pode alterar diretamente:

produto.nome = null;

O ideal é usar propriedades.
Mistura de português e convenção incorreta
Em C#: propriedades=PascalCase; campos privados= camelCase com _.
Hoje:nome, marca, preco fogem do padrão.
Uso de Console.WriteLine dentro da entidade.
Esse é um problema arquitetural importante.
A classe de domínio não deve controlar interface/saída.
Isso acopla a entidade ao console.
Métodos ObterPreco() e AtribuirPreco() mais parece Java antigo.
Em C#, propriedades resolvem isso de forma mais elegante.
Estoque não permite zero:

if (quantidade > 0)

Isso impede estoque zerado.
Mas estoque 0 é válido.
Bug lógico.
Refatoração recomendada

class Produto
{
    public string Nome { get; set; }
    public string Marca { get; set; }

    private decimal _preco;
    public decimal Preco
    {
        get => _preco;
        set
        {
            if (value < 0)
                throw new ArgumentException("Preço inválido");

            _preco = value;
        }
    }

    private int _estoque;
    public int Estoque
    {
        get => _estoque;
        set
        {
            if (value < 0)
                throw new ArgumentException("Quantidade inválida");

            _estoque = value;
        }
    }

    public string DescricaoProduto =>
        $"Nome: {Nome}" +
        $"\nMarca: {Marca}" +
        $"\nPreço: R$ {Preco:F2}" +
        $"\nQuantidade em estoque: {Estoque}";
}

....tem mais...

Seu código apresenta uma boa base para estudos, mas ainda possui pontos importantes de melhoria relacionados à arquitetura e boas práticas.
Entre as principais recomendações estão o uso de construtores para evitar objetos inválidos, a aplicação correta do encapsulamento evitando campos públicos e setters desnecessários, além da preferência pelo uso de exceções no lugar de Console.WriteLine dentro das classes de domínio.
Também é importante seguir as convenções da linguagem, utilizando padrões de nomenclatura adequados para propriedades e atributos privados, o que melhora a legibilidade e manutenção do código. Outro ponto essencial é a aplicação do princípio da responsabilidade única (SRP), garantindo que as entidades sejam responsáveis apenas por representar estado e regras de negócio, sem lidar diretamente com interface ou exibição de mensagens.
Na avaliação geral, a classe Carro apresentou a implementação mais consistente, utilizando melhor os conceitos de encapsulamento e validação. Já as classes Conta e Produto possuem estrutura funcional, mas ainda precisam evoluir em robustez, padronização e modelagem orientada a objetos.
Analisa minha resposta com calma , testa as melhorias e avise qualquer duvida.
E caso minha analise tenha lhe ajudado marca como solução ai.
Bons estudos.