Ha senso implementare un design di Class Factory in un modulo di creazione di personaggi RPG

2

Sono un ingegnere autodidatta, un principiante in Java e sto cercando di creare un modulo di creazione dei personaggi Dungeons and Dragons per un gioco più grande per consolidare la mia comprensione dei concetti chiave mentre apprendo le migliori pratiche per determinati scenari. Di seguito ho uno schema di implementazione, ma credo che ci siano scelte di progettazione migliori che potrei fare.

Sto cercando di seguire SOLID e Composition over Inheritance; Penso che questo piano segua quei concetti.

Come posso migliorare questo design di implementazione?

Attuazione

Conterrà

  • Un'interfaccia per caratteri che contiene getter e setter per Nome, Età, Altezza, ecc ...

  • Un'interfaccia per le razze di personaggi per incapsulare i tratti razziali in un modello portatile

  • Molteplici classi che implementano l'interfaccia di carattere e l'interfaccia di gara per l'obiettivo di creare il personaggio e la classe (RPG) del personaggio attraverso una fabbrica di classe.

    • Questo potrebbe essere un sacco di classi da definire a causa delle possibilità di combinazioni. Esiste un modo migliore per istanziare un oggetto personaggio che astrae Class e Race in un unico oggetto.
  • Una classe di classe class avrebbe 2 argomenti, uno per la razza e uno per la classe per creare un oggetto personaggio e una dichiarazione caso-interruttore prenderebbe la razza e la classe per determinare la combinazione classe-razza e restituire un oggetto classe-razza (personaggio).

    • Stesso collo a bottiglia come sopra.

L'esecuzione

  • La classe Main richiederebbe l'input dell'utente per la Race del personaggio e la classe del personaggio per chiamare la Class Factory che restituisce un oggetto personaggio.
    • Potrebbe valere la pena creare una classe astratta di caratteri che possa essere utilizzata per estendere le classi di combinazione di classi uniche, in modo che sia più facile capire quando si maneggiano gli oggetti personaggio.

Così:

Character character = new ElfWizard();
  • Quindi richiederà all'utente il nome dei caratteri che verrà usato per chiamare un metodo Setter per il personaggio.

  • Richiede di nuovo le specifiche relative alle dimensioni (Tiny, Small, Medium, Large, Extra Large) che chiamerà anche un setter.

    • A seconda della razza, le scelte di dimensioni saranno limitate tramite un flusso condizionale.
  • Statistiche degli attributi di base a 10 e assegna punti statici per l'allocazione con un limite rigido a 20 che chiama setter per ogni input fornito.

    • Può essere difficile da implementare in un'applicazione console. Sarebbe bello scoprire come farlo.
  • Quindi chiama i metodi dell'oggetto carattere per testare le abilità.

Riepilogo delle preoccupazioni

C'è un modo migliore di attaccare tutto in Main? Sarebbe meglio creare una classe di creazione di personaggi che verrà istanziata in main per chiamare un metodo di creazione dell'utente che richiede all'utente l'input per creare l'oggetto carattere e quindi richiede gli input per impostare le informazioni sui caratteri?

Esistono framework UI correnti che posso utilizzare per richiedere input invece della console?

Ho interesse a trasformarlo in un'API in seguito per memorizzare i valori in un database. Questo è così che posso creare un'applicazione Web per lavorare con questi metodi.

Grazie per qualsiasi feedback.

    
posta brndng 10.12.2018 - 07:46
fonte

2 risposte

1

Dato che stai scrivendo in Java e la tua spiegazione del problema dipende molto dai membri dei dati e non dalle chiamate API tramite un'interfaccia, ti consiglio di preferire la composizione sull'ereditarietà. La creazione di una classe oggetto di classe race (ElfWizard) per ogni combinazione non preferisce la composizione sull'ereditarietà.

Inoltre, se Size è un tratto di carattere e dipende da Race, non è appropriato separarlo dalla classe Character poiché sono coesi.

Suggerisco di creare una classe Personaggio con due membri dati privati per le classi Race e Stats. Il personaggio deve esporre un'API per l'utente e implementa la logica che hai menzionato prima di impostare i valori (Race Size, il limite delle statistiche, ecc.).

E poiché Carattere / Razza / Statistiche sono molto coese, Race e Stats possono essere (a seconda delle tue esigenze) classi interne di Carattere nel tuo sistema.

* Esistono molti framework UI per Java, ma è un argomento separato.

    
risposta data 02.01.2019 - 17:29
fonte
0

Credo che tu stia cercando di eseguire prima di poter eseguire la scansione.

Come ho detto nel mio commento alla tua domanda, il tuo esempio non è la composizione, ma solo l'ereditarietà regolare. Tuttavia, se tutto ciò che stai costruendo è un creatore di statistiche di personaggi, non hai nemmeno bisogno di composizione o eredità. Questi hanno a che fare con il comportamento, e poiché questo è un creatore di statistiche, e non un gioco, i tuoi personaggi non hanno alcun comportamento.

Inoltre, una fabbrica non è appropriata qui; lo schema di fabbrica è per il tuo codice , non per il tuo utente. Se mai, lo schema del builder sarebbe più appropriato qui, ma anche quello potrebbe essere eccessivo per la tua applicazione.

L'unica cosa che posso immaginare (non sono un giocatore di D & D) che necessita di un'interfaccia sarebbe il generatore di caratteri stesso poiché diverse versioni del gioco potrebbero avere regole diverse.

Ancora una volta, non ho molta familiarità con D & D oltre che in agguato su RPG Stack Exchange, ma immagino che la struttura della tua classe assomigli più a questa:

class Character {
     String getName() {} //snipped for brevity
     void setName() {}
     Race getRace() {}
     CharacterClass getClass() {}
     int getStrength(){
         return strengthRoll + getClass().getStrengthBoon() + getRace().getStrengthBoon();
     }
     // ect...
}

class Race
{
     int getStrengthBoon() {}
     void setStrengthBoon() {}
     // ect
}


// building your character
Character character = new Character();
character.setRace(raceDictionary.get(raceName));
character.setClass(classDictionary.get(className));
character.setStrengthRoll(rolledStrength);
character.setDexterityRoll(rolledDex);
    
risposta data 02.01.2019 - 22:19
fonte