Un oggetto dovrebbe interrogare il suo proprietario?

0

Ho un World

class World:
    def __init__(self):
        self.size = 10
        self.n_busStops = 10

        self.busStopMatrix = SpatialGraph(self.size, self.n_busStops, 1.0)
        self.buses = [Bus([0,1,2,3,4,5,6,7,8,9])]

Ora ciascuno degli autobus si muoverà in tutto il mondo, lasciandosi cadere e raccogliendo passeggeri.

Il bus contiene informazioni sul suo percorso. Quando arriva alla sua prossima fermata, ha bisogno di interrogare il busStopMatrix per scoprire quanti passeggeri ci sono, e quanto è lontana la prossima fermata sul suo percorso.

È una buona idea che un oggetto interroghi il genitore in questo modo? In tal caso, come si chiama questo modello di progettazione?

Qualcosa come:

class World:
    def __init__(self):
        self.size = 10
        self.n_busStops = 10

        self.busStopMatrix = SpatialGraph(self.size, self.n_busStops, 1.0)
        self.buses = [Bus([0,1,2,3,4,5,6,7,8,9], owner =self)]

class Bus:
    def __init__(self, route, parent):
        self.route = route
        self.currentStop = route[0]
        self.parent = parent
    def move(self): 
        ifAtDestination():
            pickUpPassengers(self.parent.getPassengersAtStop(currentStop))

Altrimenti non riesco a pensare a come Bus possa ottenere informazioni sul mondo in cui si trova. L'alternativa che posso pensare è che il percorso è costituito da riferimenti direttamente alle BusStops, quindi può interrogarli direttamente .

ad es.

class World:
    def __init__(self):
        self.size = 10
        self.n_busStops = 10

        self.busStopMatrix = SpatialGraph(self.size, self.n_busStops, 1.0)
        self.buses = [Bus([busStopmatrix.getAllStops()])]

class Bus:
    def __init__(self, route):
        self.route = route
        self.currentStop = route[0]

    def move(self): 
        ifAtDestination():
            pickUpPassengers(currentBusStop)
    
posta dwjohnston 05.09.2014 - 04:46
fonte

1 risposta

2

Hai un modo abbastanza elegante per farlo anche che consiste nel fornire la tua classe Bus con una funzione nel costruttore per recuperare i passeggeri:

class World:
def __init__(self):
    self.size = 10
    self.n_busStops = 10

    busStopMatrix = SpatialGraph(self.size, self.n_busStops, 1.0)
    self.buses = [Bus([0,1,2,3,4,5,6,7,8,9], owner = self.getPassengersAtStop)]

class Bus:
    def __init__(self, route, passenger_function):
        self.route = route
        self.currentStop = route[0]
        self.passenger_function = passenger_function
    def move(self): 
        ifAtDestination():
            pickUpPassengers(self.passenger_function(currentStop))

In questo modo, non si dipende realmente dal nome di una funzione o da qualsiasi altra cosa e Bus non è consapevole della classe World .

    
risposta data 05.09.2014 - 08:55
fonte

Leggi altre domande sui tag