Design pattern per l'accesso al database ad albero in Java?

3

Sto sviluppando un visualizzatore di caratteri di ruolo / programma manageriale per un sistema LARP locap. I personaggi hanno accesso alle abilità che sono disposte in una struttura ad albero. Ci sono molte abilità e potenzialmente molto per carattere.

So che posso solo importare la libreria Java di swing per ottenere l'accesso a un albero, ma credo che questo possa impantanarmi, quando tutto ciò che deve essere fatto è accedere a un database ad albero e il personaggio ha bisogno solo sapere che hanno accesso a un sottoinsieme delle competenze.

Non sono sicuro che il modello di struttura ad albero sia la scelta migliore per questo (cioè istanzia un albero per le abilità conosciute per carattere, e aggiungi / cancelli le parti secondo necessità) o "fai le cose intelligenti" e usa un lista per carattere per vedere quali parti (competenze) del database (albero esterno) sono "di proprietà".

Le mie capacità sono suddivise più o meno così:
Course catogory -> Weapon Type -> Actual Weapon -> Proficiency-->Special Skill , che va piuttosto in profondità. Oltre a questo c'è poco bisogno di sapere cosa c'è ad ogni livello, solo che sono bambini, finché non colpisci la foglia, e quella in alto.

Il mio database esiste già sul sito Web di LARP, quindi se non dovessi riprodurlo, sarebbe buono. Ecco un esempio

Weapons and Shields     Warrior Priest Scout Mage 
1H Weapon Proficiency     3        6     6     9 
1H Weapon Specialisation  6        12    12    18 
1H Weapon Expertise       12       24    24    36 
1H Weapon Mastery         24       48    48    72 

E in seguito:

Magic           Warrior       Priest        Scout         Mage 
Learn Spell     9 x (l + 1)   9 x (l + 1)   6 x (l + 1)   3 x (l + 1) 
l = spell level,  
...
Create Talisman 9 + l         9 + l         6 + l         3 + l 
l = level, 
    
posta Pureferret 13.07.2012 - 10:44
fonte

2 risposte

1

L'utilizzo di un albero in un normale database (relazionale) è difficile. Memorizzato correttamente, ogni abilità si riferisce solo alla sua abilità genitore, e cercando di trovare figli e fratelli richiede sempre, anche con un tavolino. Questo può essere risolto un po 'de-normalizzando il database (aggiungendo colonne per fornire una discendenza completa per ogni abilità) ma poi devi conoscere il numero massimo di livelli nella tua struttura e collegarlo con hard-wire alla tua progettazione DB.

Dato che un essere umano ha dovuto inventare i tuoi dati, non può essercene troppa, quindi lo inserisco nella tua struttura ad albero in memoria. Ogni nodo farebbe riferimento al suo genitore e avrà una lista dei suoi figli, in modo da poter girare intorno alla cosa secondo necessità. Avresti bisogno solo di una semplice classe Skill, con genitore, lista figli, nome e dati associati, quindi è molto semplice da fare e da usare.

Usa una mappa (java.util.HashMap potrebbe essere la cosa migliore, dato che conoscerai la dimensione dell'albero) per localizzare ogni voce. Rilasciare ogni oggetto Skill in esso, con chiave, molto probabilmente, per nome. Quindi, se vuoi conoscere una "Spada lunga", la trovi nella Mappa per nome, e ora hai tutte le informazioni, più i suoi genitori e tutti i suoi figli.

(Una cosa non è così semplice: quando si legge il DB è probabile che si ottenga il nome di un genitore che non si trova nell'albero (e Mappa). È necessario crearlo al volo. Questo significa che quando si legge una nuova abilità dal DB potrebbe già essere nell'albero. Quindi, invece di aggiungerlo, è sufficiente inserire le informazioni e il genitore . (E se il genitore non è nell'albero, devi crearlo al volo.))

Cerca di cavartela mostrando solo un genitore e il suo elenco figlio. Anche visualizzare tutto come una tabella semplice può funzionare. Ma una volta che inizi a comprimere parti dell'albero nel display diventa complicato. Fare un buon albero / struttura / esplorazione / tabella / elenco è molto più lavoro di qualsiasi altra cosa qui.

Ho usato la libreria swing JTree anni fa. Probabilmente è la soluzione migliore se devi mostrare l'intero albero come albero. Sfortunatamente, avevo bisogno di renderlo parte di una tabella, ed è stato più facile saltare il JTree ed espandere e comprimere le righe direttamente in JTable. E 'stato uno sforzo enorme. Quindi, per esempio, non lasciare che nessuno ti parli di aggiungere il costo per ogni riga, dove tutti i costi sono allineati nella loro colonna.

    
risposta data 13.07.2012 - 16:39
fonte
4

Il modello di progettazione canonica utilizzato per strutture di dati ad albero è il visitatore . Si inizia dalla radice (o dal nodo corrente) e si visita ciascun nodo in ordine (preorder, postorder, qualunque ordine sia necessario), eseguendo l'attività richiesta su ciascun nodo.

Non è chiaro dalla descrizione, ma ho l'impressione che un visitatore abbia restituito le informazioni richieste per visualizzare le informazioni su tutti i figli primari del nodo corrente (ovvero, tutti i nodi figlio del nodo corrente ma non il loro discendenti) avrebbe funzionato. Questo presuppone che tu abbia delle abilità suddivise in categorie progressivamente più fini (combattimento - > armi - > combattimento ravvicinato - > armi con le ali - > lama corto - > pugnale). I giocatori sarebbero in grado di approfondire qualsiasi categoria e vedere quali sono le loro capacità. Puoi anche comprimere le categorie che hanno solo figli singoli (ad esempio se una persona ha solo un'abilità, vai direttamente ad essa e non farle selezionare un gruppo di singoli link).

    
risposta data 13.07.2012 - 14:36
fonte

Leggi altre domande sui tag