Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

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

Esse exercício eu vou realizá-lo por etapas. Inicialmente, vou focar em resolver a solução da 1 e da 2 e depois partir para a expansão do sistema com a 3 e 4.

1-2

Filme.cs

namespace Alura.Filmes;
class Filme {
    private List<string> listaElenco = new();
    public string? Titulo {get;set;}
    public int Duracao {get;set;}

    public Filme(List<string> elenco, string? titulo, int duracao) {
        listaElenco = elenco;
        Titulo = titulo;
        Duracao = duracao;
    }
    
    public void ExibirInformacoes() {
        Console.Clear();
        Console.WriteLine("=======================");
        Console.WriteLine($"Título: {Titulo}");
        Console.WriteLine($"Duração: {Duracao} segundos.");
        Console.WriteLine($"Elenco");
        listaElenco.ForEach(ator => Console.WriteLine($"- {ator}"));
        Console.WriteLine("=======================");
        Console.ReadKey();
    }
}

Program.cs

using Alura.Filmes;

var filme1 = new Filme (
    new List<string> { "Tim Robbins", "Morgan Freeman", "Bob Gunton" },
    "Um Sonho de Liberdade",
    8520
);

var filme2 = new Filme (
    new List<string> { "Marlon Brando", "Al Pacino", "James Caan" },
    "O Poderoso Chefão",
    10500
);

var filme3 = new Filme (
    new List<string> { "Christian Bale", "Heath Ledger", "Aaron Eckhart" },
    "Batman: O Cavaleiro das Trevas",
    9120
);

var filme4 = new Filme (
    new List<string> { "Elijah Wood", "Ian McKellen", "Viggo Mortensen" },
    "O Senhor dos Anéis: A Sociedade do Anel",
    10680
);

var filme5 = new Filme (
    new List<string> { "Leonardo DiCaprio", "Joseph Gordon-Levitt", "Elliot Page" },
    "A Origem",
    8880
);

var listaFilmes = new List<Filme>() {filme1, filme2, filme3, filme4, filme5};
listaFilmes.ForEach(filme => filme.ExibirInformacoes());
2 respostas

Agora, para a atividade 3–4, essa lista de string terá que se tornar uma lista da classe Artista. Além disso, a classe Artista terá uma nova lista, sendo uma lista de Filmes, que receberá os artistas.

OBS: Fiquei bons minutos pensando em como pegar o valor do próprio objeto para mandar para outro. Cheguei até ao ponto de enviar o título e pensei que teria chegado a uma resposta, mas entrei no Git e vi que seria possível fazer com o this, cuja utilidade eu ainda não conhecia. Todavia, agora que sei, não esqueço mais.

Program.cs

using Alura.Filmes;

var filme1 = new Filme (
    "Um Sonho de Liberdade",
    8520
);

var filme2 = new Filme (
    "O Poderoso Chefão",
    10500
);

var filme3 = new Filme (
    "Batman: O Cavaleiro das Trevas",
    9120
);

var filme4 = new Filme (
    "O Senhor dos Anéis: A Sociedade do Anel",
    10680
);

var filme5 = new Filme (
    "A Origem",
    8880
);

var artista01 = new Artista (
    "Tim Robbins",
    26
);

var artista02 = new Artista(
    "Morgan Freeman",
    87
);

var artista03 = new Artista(
    "Bob Gunton",
    78
);

var artista04 = new Artista(
    "Marlon Brando",
    80
);

var artista05 = new Artista(
    "Al Pacino",
    84
);

var artista06 = new Artista(
    "Christian Bale",
    51
);

var artista07 = new Artista(
    "Heath Ledger",
    28
);

var artista08 = new Artista(
    "Elijah Wood",
    44
);

var artista09 = new Artista(
    "Ian McKellen",
    85
);

var artista10 = new Artista(
    "Viggo Mortensen",
    66
);

filme1.AdicionarArtista(artista01);
filme1.AdicionarArtista(artista02);
filme1.AdicionarArtista(artista03);

filme2.AdicionarArtista(artista04);
filme2.AdicionarArtista(artista05);

filme3.AdicionarArtista(artista06);
filme3.AdicionarArtista(artista01);
filme3.AdicionarArtista(artista07);

filme4.AdicionarArtista(artista08);
filme4.AdicionarArtista(artista09);
filme4.AdicionarArtista(artista10);

var listaFilmes = new List<Filme>() {filme1, filme2, filme3, filme4, filme5};
listaFilmes.ForEach(filme => filme.ExibirInformacoes());
artista01.VerFilmes();

Filme.cs

namespace Alura.Filmes;
class Filme {
    public List<Artista> listaElenco = new();
    public string? Titulo {get;set;}
    public int Duracao {get;set;}

    public Filme(string? titulo, int duracao) {
        Titulo = titulo;
        Duracao = duracao;
    }
    
    public void ExibirInformacoes() {
        Console.Clear();
        Console.WriteLine("=======================");
        Console.WriteLine($"Título: {Titulo}");
        Console.WriteLine($"Duração: {Duracao} segundos.");
        Console.WriteLine($"Elenco:");
        listaElenco.ForEach(ator => Console.WriteLine($"- {ator.Nome}"));
        Console.WriteLine("=======================");
        Console.ReadKey();
    }

    public void AdicionarArtista(Artista artista) {
        listaElenco.Add(artista);
        artista.listaFilmes.Add(this);
    }
}

Artista.cs

namespace Alura.Filmes;

class Artista {
    public List<Filme> listaFilmes = new();
    public string? Nome {get;set;}
    public int Idade {get;set;}

    public Artista(string? nome, int idade) {
        Nome = nome;
        Idade = idade;
    }
    
    public void VerFilmes() {
        Console.WriteLine($"Filmes do {Nome}");
        foreach (Filme filme in listaFilmes) {
            Console.WriteLine($"- {filme.Titulo}");
        }
    }
}
solução!

Oi, Diego! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

A sua resolução ficou muito bem estruturada por etapas, e isso mostra organização no raciocínio pra evoluir o projeto com mais segurança. Gostei bastante da forma como você transformou a List<string> em uma lista de objetos Artista, porque isso aproxima o sistema de um modelo mais orientado a objetos.

Outro ponto que chamou atenção foi sua descoberta do this dentro do método AdicionarArtista(), fazendo a ligação entre Filme e Artista de forma bem prática.

Uma dica interessante para o futuro é utilizar o método Contains() antes de adicionar um artista ou filme em uma lista, evitando itens repetidos.


public void AdicionarArtista(Artista artista)
{
    if (!listaElenco.Contains(artista))
    {
        listaElenco.Add(artista);
    }
}

Esse código verifica se o objeto artista já tá na lista antes de adicionar, ajudando a manter os dados mais organizados no sistema.

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