Sono rimasto bloccato per qualche tempo su un problema di riferimento circolare con la serializzazione JSON. Ho un gioco di carte che sto decapitando in un negozio di redis. Mentre recupero lo stato di gioco da redis, sto provando a serializzarlo in JSON in modo che possa passarlo a React.js e renderlo sullo schermo. Ho citato React.js perché il mio obiettivo è quello di passare avanti e indietro l'intero stato del gioco ad ogni cambio di stato.
Di seguito è riportato il codice semplificato della mia struttura di classe. La classe di gioco tiene riferimento a tutto. Il giocatore detiene i riferimenti al gioco e alle carte, le carte contengono riferimenti al giocatore.
Questo design è disperatamente sbagliato? Invece di fare riferimento agli oggetti dovrei semplicemente riferirmi al loro ID dell'elemento e poi recuperarli separatamente quando devo rendere il nuovo stato? Qualsiasi modello di progettazione che potrebbe venire utile?
Se può essere utile rispondere alla domanda, lo stack che sto usando è Python, Django, Redis, React
class Card(object):
def __init__(self, suit, face):
self.face = face
self.suit = suit
self.is_trump = False
self.owner = None
class Deck(object):
def __init__(self):
self.deck = []
class Player(object):
def __init__(self, name, autopilot=False):
self.score = 0
self.uid = self._new_uid()
self.name = name
self.cards = []
self.is_first = False # used to determine the winner in case of draw
self.autopilot = autopilot
# updated when the game is joined by the Game instance
self.game = None
class Game(object):
def __init__(self, players, deck, table):
self.hands = []
self.winner = None
self.players = players
self.uid = self._new_uid()
self.deck = deck
self.table = table
self.over = False
class Hand(object):
def __init__(self, carda, cardb, game, simulate=False):
self._carda = carda
self._cardb = cardb
self._first = self._get_first()
self._winner = self._play()
# is it a regular hand or a simulation?
if not simulate:
self._update_score()
game.table.clean()
game.hands.append(self)
class Table(object):
def __init__(self):
self.cards = []
self.played = []