Design della classe per la serializzazione JSON

2

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 = []
    
posta Lorenzo 20.03.2015 - 23:10
fonte

2 risposte

1

Per evitare riferimenti circolari, solo un nodo / classe genitore dovrebbe essere al corrente dei suoi figli.

Accedere a Game come nodo root dovrebbe consentire di raccogliere informazioni ovunque sia necessario.

    
risposta data 21.03.2015 - 05:45
fonte
1

...Is this design desperately wrong?

No . puoi serializzare i riferimenti circolari utilizzando JSON

Non so qual è il Python -approach. Ma dal punto di vista delle specifiche, ho sentito che json pointer fragment potrebbe essere la query di ricerca su Internet

Wikipedia → JSON → Riferimenti agli oggetti non è molto chiaro su questo argomento e sottolinea l'implementazione usata da dojox.json.ref JavaScript toolkit

La libreria Json.NET di Newtonsoft ("standard" nel mondo C# ) supporta i riferimenti a oggetti utilizzano completamente una convenzione leggermente differente con "$id" e "$ref" proprietà speciali.

Quindi nei mondi C# , JavaScript non dovrai appiattire o ristrutturare le tue strutture di dati simili a grafi

...Any design pattern that could come useful?

Utilizza gli strumenti giusti per il lavoro (linguaggio di programmazione o libreria più strong)

    
risposta data 21.03.2015 - 13:33
fonte