Java: composizione di classi che implementano la stessa interfaccia

2

Consideriamo un esempio in cui devo modellare il seguente:

  1. Classe per programmare esami per uno studente, chiamiamolo StudentExamScheduler
  2. Classe per pianificare un esame per una classe. Chiamiamolo ClassExamScheduler e attualmente dipende dalla logica fornita da StudentExamScheduler .

Quindi, poiché entrambe le classi programmavano gli esami, ho creato un'interfaccia ExamScheduler che entrambe le classi avrebbero implementato. Il motivo è:

  • Stanno essenzialmente pianificando esami
  • mi darebbe la flessibilità di scambiare gli scheduler in-and-out con le modifiche di funzionalità.

Ecco come apparirà l'interfaccia:

interface ExamScheduler {
       scheduleExam(data);
}

Ora ogni mia classe concreta implementa questa interfaccia e ClassExamScheduler ora usa StudentExamScheduler per delegare alcune responsabilità.

class ClassExamScheduler implements ExamScheduler {

  private ExamScheduler studentExamScheduler;

  public scheduleExam() {

    studentExamScheduler.scheduleExam();
    // do other stuff
  }
}

È un uso valido di Interface & Composizione? In genere ho visto l'interfaccia utilizzata per il polimorfismo. Ma in questo caso d'uso lo uso per darmi la flessibilità di iniettare nuove classi quando i requisiti cambiano.

    
posta AgentX 06.07.2016 - 15:40
fonte

2 risposte

2

I miei due centesimi:

  • Non c'è contraddizione tra l'uso delle interfacce e della composizione.
  • Stai usando il polimorfismo. L'iniezione di dipendenza e la delega sono possibili a causa del polimorfismo.

Un paio di osservazioni:

  • Il studentExamScheduler deve essere denominato examScheduler . Dal momento che lo inietterai, non dovresti nominare la variabile dopo un implementos specifico di ExamScheduler .
  • Considera la possibilità di creare un'interfaccia Scheduler più generica, con una pianificazione (dati ScheduleData); tale interfaccia potrebbe essere implementata da qualsiasi tipo di schedulatore come LessonScheduler , MeetingScheduler ecc.
risposta data 06.07.2016 - 16:16
fonte
2

L'utilizzo di interfacce come questa è solitamente un modo facile e pulito per fornire flessibilità. Ad esempio, è possibile modificare l'implementazione di un'istanza ClassExamScheduler in fase di esecuzione senza modificare il codice sorgente. Ciò è possibile assegnando studentExamScheduler un altro tipo di ExamScheduler che fornisce un altro metodo di pianificazione. Questo tipo di polimorfismo è uno dei principali vantaggi dell'uso delle interfacce.

Tuttavia

Non vedo alcun reale vantaggio di avere ClassExamScheduler implementare ExamScheduler . Vedo dove stai andando con l'aspetto della composizione; poiché entrambe le classi programmano gli esami, potrebbero implementare un metodo comune.

Ma questo significa che un ClassExamScheduler può implementare il suo .scheduleExam(..) -method usando un'altra istanza ClassExamScheduler come intermediario, che per me sembra un po 'strana e inutilmente complicata.

In secondo luogo, questa struttura potrebbe causare il errore del programma se usato senza cautela. Se un ClassExamScheduler implementerebbe una catena chiusa di ClassExamSchedulers come:

ClassExamScheduler A, B, C;
A.studentExamScheduler = B;
B.studentExamScheduler = C;
C.studentExamScheduler = A;

O anche se stesso:

ClassExamScheduler A;
A.studentExamScheduler = A;

Si finirebbe con un ciclo ricorsivo che terminerebbe con un overflow dello stack.

Riguardo alla composizione

Penso che la sottile distinzione qui sia che StudentExamScheduler pianifica un esame e ClassExamScheduler usa un ExamScheduler (cioè un StudentExamScheduler ) per pianificare un esame, indirettamente .

    
risposta data 06.07.2016 - 17:06
fonte

Leggi altre domande sui tag