osservatore reciproco

0

Voglio che i miei oggetti Wire siano in collegamento con gli oggetti Port . Questo è Porta ha una lista di fili collegati e metodo Port.add(wire) . Allo stesso modo, Wire ha un elenco di porte a cui è connesso e Wire.add(port) .

class Port
  Set[Wire] connections
  method add(wire)joined)

class Wire
  Set[Port] ports
  method add(port)

Supponiamo ora che io usi uno di questi metodi, aggiungi una porta a un filo. Quel metodo dovrebbe chiamare port.add(this wire) in risposta, per mantenere la coerenza. Ma chiamare port.add(wire) dovrebbe fare la stessa cosa, dovrebbe chiamare wire.add(this port) per mantenere la coerenza. Sarà un circolo vizioso. Come lo rompi? Ti

  1. controlla che l'oggetto sia già connesso e non faccia nulla in questo caso o
  2. crea un metodo di connessione principale, forzando tutti gli utenti a utilizzare, ad esempio wire.add(port) , che chiamerà dumb port.wires.add(wire) e senza ulteriori chiamate
  3. o qualsiasi altra cosa?
posta Little Alien 20.10.2016 - 09:53
fonte

1 risposta

3

Quando aggiungi una porta a un filo, il filo "reagisce" chiamando la porta. Questa è una chiamata diversa da un port.add() esterno, da un punto di vista logico.

Potresti avere un metodo protetto ereditato da una superclasse, chiamato qualcosa come notifyAdd :

someone calls wire.add(port)
the wire initializes its own internals
the wire calls port.notifyAdd(wire)
the port initializes its own internals, but *does not* call wire.notifyAdd(port)

Le due funzioni add () e notifyAdd () sarebbero quasi identiche, e in realtà è probabile che add () farebbe qualcosa come chiamare notifyAdd () su se stesso e sull'oggetto chiamato:

notifyAdd(wire):
    ! A wire was added to this port.
    wireCount := wireCount + 1
    ! other things
    return self

! Called externally
add(wire): public
    ! We do not trust this to make sense.
    ! We might throw WireAlreadyConnectedRecoverableException,
    ! or InvalidWireCriticalException, or ...
    sanityAssertions(self, wire)

    ! Now yes, if we're here, it made sense and we act upon it
    self.notifyAdd(wire)
    wire.notifyAdd(self)
    return self
    
risposta data 20.10.2016 - 14:57
fonte