Come impedire a un mediatore di diventare un oggetto divino

4

Per mantenere le classi disaccoppiate sto utilizzando il modello di mediatore in questo modo:

class Mediator {
  constructor(canvas, selectionBox, undoManager) {
    this.canvas = canvas
    this.selectionBox = selectionBox
    this.undoManager = undoManager
  }

  addText(text) {
    this.canvas.addText(text)
    this.undoManager.captureUndo()
    this.selectionBox.update()
  }

  addImage(image) {
    this.canvas.addImage(image)
    this.undoManager.captureUndo()
    this.selectionBox.update()
  }

  // ... etc
}

man mano che vengono aggiunti sempre più metodi alla classe Mediator, non diventerà un oggetto divino?

In questo caso, come posso risolvere questo? Magari creare sub-mediatori che raggruppino le azioni e usino un mediatore genitore per coordinarle?

(*) Per la cronaca ho appena iniziato a utilizzare questo pattern e non sono sicuro di farlo correttamente.

    
posta Nik Kyriakides 20.04.2018 - 11:30
fonte

2 risposte

3

Il ruolo del modello di mediatore è quello di incapsulare la logica di comunicazione tra gli oggetti, riducendo le dipendenze tra di loro (riducendo l'accoppiamento).

Tuttavia, come con qualsiasi incapsulamento se metti tutto in un sacchetto, puoi finire con il cosiddetto Oggetto di Dio .

La soluzione per questo è utilizzare Principio di responsabilità singola e dividere gli oggetti mediatore, creando gruppi attorno allo stesso comportamento. Suggerimento pratico può essere quello di usare la convenzione - nome + nome verbale (ad esempio ImageResizer, ImageTextUpdater).

Non si tratta di un modello di mediatore in sé ma di un incapsulamento errato (troppo ampio) in una classe.

    
risposta data 20.04.2018 - 12:38
fonte
1

No, la tua classe Mediator non sembra che stia diventando un oggetto di Dio. Una classe non è un oggetto di Dio perché ha molti metodi, ma perché può interagire con quasi tutti gli altri oggetti nel tuo sistema. Questo non è il caso della tua classe Mediator .

Su un nodo laterale, la classe Mediator assomiglia più all'implementazione del modello di design Facciata .
In una corretta implementazione del modello Mediator, la classe Mediator potrebbe aiutare ad aggiornare il selectionBox quando la tela cambia e viceversa. Normalmente non verrebbe attivato da classi esterne al modello Mediator.

    
risposta data 20.04.2018 - 12:31
fonte

Leggi altre domande sui tag