Plataforma de E-Learning
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 84 de 87.
Bem-vindo ao capítulo dos Desafios Finais! Esses desafios foram elaborados para testar seu domínio de todos os conceitos de POO que você aprendeu ao longo deste curso.
Neste desafio, você construirá um sistema de Plataforma de E-Learning que combina herança, interfaces, polimorfismo, encapsulamento e padrões de projeto em uma aplicação coesa.
Sua plataforma deve modelar as relações entre cursos, estudantes e instrutores. Pense em como uma classe base User pode ser estendida pelas classes Student e Instructor, como os cursos contêm lições e como funciona o acompanhamento das matrículas entre estudantes e cursos.
Considere quais princípios de OOP se aplicam: use encapsulamento para proteger os dados do usuário, herança para compartilhar comportamentos comuns, interfaces para definir contratos como Enrollable ou Completable e polimorfismo para lidar uniformemente com diferentes tipos de usuário.
Boa sorte ao aplicar tudo o que você aprendeu!
Desafio
FácilVamos construir uma Plataforma de E-Learning que reúne todos os conceitos de OOP que você dominou ao longo deste curso! Você criará um sistema que modela as relações entre cursos, estudantes e instrutores usando herança, interfaces, polimorfismo e encapsulamento.
Você organizará seu código em seis arquivos:
Enrollable.java: Crie uma interface que define o contrato para operações de matrícula. Ela deve declarar os métodosenroll(Student student), que retorna um booleano, egetEnrolledCount(), que retorna um int.User.java: Crie uma classe base abstrata que represente qualquer usuário da plataforma. Inclua campos privados paraid(String) ename(String), um construtor que inicialize ambos, getters apropriados e um método abstratogetRole()que retorne uma String descrevendo a função do usuário.Student.java: Crie uma classe que estendaUser. Adicione um ArrayList privado para acompanhar os IDs dos cursos nos quais o estudante está matriculado. Inclua um construtor que chame o construtor da classe pai, implementegetRole()para retornar"Student"e adicione os métodosaddCourse(String courseId)egetEnrolledCourseCount(). SubstituatoString()para retornar"Student: [name] ([enrolledCount] courses)".Instructor.java: Crie uma classe que estendaUser. Adicione um campo privado paraspecialty(String). Inclua um construtor que receba id, name e specialty, implementegetRole()para retornar"Instructor", adicione um getter para specialty e substituatoString()para retornar"Instructor: [name] - [specialty]".Course.java: Crie uma classe que implementeEnrollable. Inclua campos privados paracourseId(String),title(String),instructor(Instructor) e um ArrayList de estudantes matriculados. O construtor recebe courseId, title e instructor. Implementeenroll(Student student)para adicionar o estudante à lista, chamar o métodoaddCourse()do estudante com o ID deste curso e retornar true. ImplementegetEnrolledCount(). Adicione um métodogetDetails()que retorne o ID do curso entre colchetes literais, seguido pelo título e pelo nome do instrutor, construído como"[" + courseId + "] " + title + " by " + instructorName.Main.java: Construa sua plataforma! Você receberá uma string de comandos separados por vírgulas:ADD_INSTRUCTOR:id:name:specialtyADD_STUDENT:id:nameADD_COURSE:courseId:title:instructorIdENROLL:studentId:courseIdINFO:userId
Mantenha coleções de instrutores, estudantes e cursos. Processe cada comando e imprima:
- ADD_INSTRUCTOR:
Instructor added: [name] - ADD_STUDENT:
Student added: [name] - ADD_COURSE:
Course added: [title] - ENROLL:
[studentName] enrolled in [courseTitle] - INFO: Imprima a saída de
toString()do usuário
Após todos os comandos, imprima
--- Platform Summary ---, seguido pelos detalhes de cada curso e pela quantidade de matrículas no formato[courseDetails] - [count] student(s).
Você receberá uma entrada: a string de comandos separados por vírgulas.
Por exemplo, com a entrada ADD_INSTRUCTOR:I001:Dr. Smith:Java,ADD_STUDENT:S001:Alice,ADD_STUDENT:S002:Bob,ADD_COURSE:C001:OOP Fundamentals:I001,ENROLL:S001:C001,ENROLL:S002:C001,INFO:S001,INFO:I001, sua saída seria:
Instructor added: Dr. Smith
Student added: Alice
Student added: Bob
Course added: OOP Fundamentals
Alice enrolled in OOP Fundamentals
Bob enrolled in OOP Fundamentals
Student: Alice (1 courses)
Instructor: Dr. Smith - Java
--- Platform Summary ---
[C001] OOP Fundamentals by Dr. Smith - 2 student(s)Este desafio combina herança (hierarquia de User), interfaces (Enrollable), polimorfismo (diferentes tipos de usuários com suas próprias implementações de toString) e encapsulamento (campos privados com acesso controlado) em um sistema coeso!
Experimente você mesmo
import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Crie coleções para armazenar instrutores, alunos e cursos
// Dica: Use HashMap com id como chave para fácil busca
// TODO: Divida a entrada por vírgula para obter os comandos individuais
// TODO: Processe cada comando:
// - ADD_INSTRUCTOR:id:name:specialty -> Create instructor, add to collection, print "Instructor added: [name]"
// - ADD_STUDENT:id:name -> Create student, add to collection, print "Student added: [name]"
// - ADD_COURSE:courseId:title:instructorId -> Create course with instructor, add to collection, print "Course added: [title]"
// - ENROLL:studentId:courseId -> Matricule o aluno no curso, imprima "[studentName] enrolled in [courseTitle]"
// - INFO:userId -> Encontre o usuário (aluno ou instrutor) e imprima o seu toString()
// TODO: After processing all commands, print "--- Platform Summary ---"
// TODO: Para cada curso, imprima "[courseDetails] - [count] student(s)"
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy14Desafios Finais
Plataforma de E-LearningSistema BancárioDesenvolvimento de Personagens de JogosServiço de Aluguel de Veículos3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão IteratorPratique por conta própria: Compilador de Java online