Menu
Coddy logo textTech

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!

challenge icon

Sfida

Facile

Costruiamo 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 metodi enroll(Student student), che restituisce un booleano, e getEnrolledCount(), che restituisce un int.
  • User.java: crea una classe base astratta che rappresenta qualsiasi utente della piattaforma. Includi i campi privati id (String) e name (String), un costruttore che li inizializza entrambi, i getter appropriati e un metodo astratto getRole() che restituisce una String che descrive il ruolo dell'utente.
  • Student.java: crea una classe che estende User. 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, implementa getRole() in modo che restituisca "Student" e aggiungi i metodi addCourse(String courseId) e getEnrolledCourseCount(). Sovrascrivi toString() in modo che restituisca "Student: [name] ([enrolledCount] courses)".
  • Instructor.java: crea una classe che estende User. Aggiungi un campo privato per specialty (String). Includi un costruttore che accetta id, name e specialty, implementa getRole() in modo che restituisca "Instructor", aggiungi un getter per specialty e sovrascrivi toString() in modo che restituisca "Instructor: [name] - [specialty]".
  • Course.java: crea una classe che implementa Enrollable. Includi i campi privati courseId (String), title (String), instructor (Instructor) e un ArrayList degli studenti iscritti. Il costruttore accetta courseId, title e instructor. Implementa enroll(Student student) per aggiungere lo studente all'elenco, chiamare il metodo addCourse() dello studente con l'ID di questo corso e restituire true. Implementa getEnrolledCount(). Aggiungi un metodo getDetails() 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:specialty
    • ADD_STUDENT:id:name
    • ADD_COURSE:courseId:title:instructorId
    • ENROLL:studentId:courseId
    • INFO: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)"
    }
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Java online