Piattaforma di e-learning
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 84 di 87.
Benvenuto nel capitolo delle sfide finali! Queste sfide sono pensate per mettere alla prova la padronanza di tutti i concetti di OOP che hai imparato durante questo corso.
In questa sfida, realizzerai un sistema di piattaforma di e-learning che combina ereditarietà, interfacce, polimorfismo, incapsulamento e pattern di progettazione in un’applicazione coerente.
La tua piattaforma dovrebbe modellare le relazioni tra corsi, studenti e insegnanti. Pensa a come una classe base User possa essere estesa dalle classi Student e Instructor, a come i corsi contengano lezioni e a come funziona il monitoraggio delle iscrizioni tra studenti e corsi.
Considera quali principi OOP si applicano: usa l’incapsulamento per proteggere i dati degli utenti, l’ereditarietà per condividere comportamenti comuni, le interfacce per definire contratti come Enrollable o Completable e il polimorfismo per gestire uniformemente i diversi tipi di utenti.
Buona fortuna nell'applicare tutto ciò che hai imparato!
Sfida
FacileCostruiamo una piattaforma di e-learning che riunisce tutti i concetti di OOP che hai imparato durante questo corso! Creerai un sistema che modella le relazioni tra corsi, studenti e insegnanti usando ereditarietà, interfacce, polimorfismo e incapsulamento.
Organizzerai il codice in sei file:
Enrollable.java: crea un'interfaccia che definisce il contratto per le operazioni di iscrizione. Dovrebbe dichiarare i metodienroll(Student student), che restituisce un booleano, egetEnrolledCount(), che restituisce un int.User.java: crea una classe base astratta che rappresenta qualsiasi utente della piattaforma. Includi i campi privatiid(String) ename(String), un costruttore che li inizializza entrambi, i getter appropriati e un metodo astrattogetRole()che restituisce una String che descrive il ruolo dell'utente.Student.java: crea una classe che estendeUser. Aggiungi un ArrayList privato per tenere traccia degli ID dei corsi a cui lo studente è iscritto. Includi un costruttore che chiama il costruttore della classe genitore, implementagetRole()in modo che restituisca"Student"e aggiungi i metodiaddCourse(String courseId)egetEnrolledCourseCount(). SovrascrivitoString()in modo che restituisca"Student: [name] ([enrolledCount] courses)".Instructor.java: crea una classe che estendeUser. Aggiungi un campo privato perspecialty(String). Includi un costruttore che accetta id, name e specialty, implementagetRole()in modo che restituisca"Instructor", aggiungi un getter per specialty e sovrascrivitoString()in modo che restituisca"Instructor: [name] - [specialty]".Course.java: crea una classe che implementaEnrollable. Includi i campi privaticourseId(String),title(String),instructor(Instructor) e un ArrayList degli studenti iscritti. Il costruttore accetta courseId, title e instructor. Implementaenroll(Student student)per aggiungere lo studente all'elenco, chiamare il metodoaddCourse()dello studente con l'ID di questo corso e restituire true. ImplementagetEnrolledCount(). Aggiungi un metodogetDetails()che restituisce l'ID del corso racchiuso tra parentesi quadre letterali, seguito dal titolo e dal nome dell'insegnante, composto come"[" + courseId + "] " + title + " by " + instructorName.Main.java: crea la tua piattaforma! Riceverai una stringa di comandi separati da virgole:ADD_INSTRUCTOR:id:name:specialtyADD_STUDENT:id:nameADD_COURSE:courseId:title:instructorIdENROLL:studentId:courseIdINFO:userId
Mantieni raccolte di insegnanti, studenti e corsi. Elabora ogni comando e stampa:
- ADD_INSTRUCTOR:
Instructor added: [name] - ADD_STUDENT:
Student added: [name] - ADD_COURSE:
Course added: [title] - ENROLL:
[studentName] enrolled in [courseTitle] - INFO: stampa l'output di
toString()dell'utente
Dopo tutti i comandi, stampa
--- Platform Summary ---seguito dai dettagli di ciascun corso e dal numero di iscritti nel formato[courseDetails] - [count] student(s).
Riceverai un input: la stringa di comandi separati da virgole.
Per esempio, con l'input 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, il tuo output sarà:
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)Questa sfida combina ereditarietà (gerarchia User), interfacce (Enrollable), polimorfismo (diversi tipi di utente con le proprie implementazioni di toString) e incapsulamento (campi privati con accesso controllato) in un sistema coerente!
Provalo tu
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: Crea raccolte per memorizzare istruttori, studenti e corsi
// Suggerimento: usa HashMap con id come chiave per facilitare la ricerca
// TODO: Dividi input in corrispondenza delle virgole per ottenere i singoli comandi
// TODO: Elabora ogni comando:
// - ADD_INSTRUCTOR:id:name:specialty -> Crea un istruttore, aggiungilo alla raccolta e stampa "Instructor added: [name]"
// - ADD_STUDENT:id:name -> Crea uno studente, aggiungilo alla raccolta e stampa "Student added: [name]"
// - ADD_COURSE:courseId:title:instructorId -> Crea un corso con un istruttore, aggiungilo alla raccolta e stampa "Course added: [title]"
// - ENROLL:studentId:courseId -> Iscrivi lo studente al corso e stampa "[studentName] enrolled in [courseTitle]"
// - INFO:userId -> Trova l'utente (studente o istruttore) e stampa il risultato di toString()
// TODO: Dopo aver elaborato tutti i comandi, stampa "--- Platform Summary ---"
// TODO: Per ogni corso, stampa "[courseDetails] - [count] student(s)"
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy14Sfide finali
Piattaforma di e-learningSistema bancarioSviluppo del personaggio di un giocoServizio di noleggio veicoli3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online