Devo raggruppare campi dati e viste relativi, oppure racchiudere tutti i campi dati (e anche le viste) in una singola classe?

2

Ad esempio, se ho un gioco che ha alcuni componenti, che hanno Player e Enemy, così come il contenitore genitore, Game, ad esempio:

Versione 1 :

public class Player{
    private int hp;
    private Label hpLabel();
    //some other properties
}

public class Enemy{
    private int hp;
    private Label hpLabel();
    //some other properties
}

//some other component classes

public class Game{
    Player player;
    Enemy enemy;
    //some other components
    public void changeState(int state){
        //game loop
    }
}

e un altro stile che raggruppa i campi di dati (così come le viste) in una singola classe:

Versione 2

public class GameData{
    public int playerHp;
    public int enemyHp;
    //some other data field
}

public class GameViews{
    public Label playerHpLabel;
    public Label enemyHpLabel;
    //some other views
}

public class Game{
    public GameData gameData;
    public GameViews gameViews;
    public void changeState(int state){
        //game loop
    }
}

So che la versione 1 è il modo standard per farlo, ma ho anche scoperto che la versione 2 ha alcuni vantaggi, ad esempio: mi consente di avere una visione generale dei dati o dello stato del gioco, nonché dei componenti dell'interfaccia utente disponibile sullo schermo. quale versione dovrei usare?

    
posta mmmaaa 09.02.2018 - 10:32
fonte

1 risposta

1

Which version should I use?

Nessuno dei due. O entrambi. A seconda di come la guardi.

Versione 1

  • stai incapsulando correttamente la logica di Player e Enemy nelle rispettive classi.

  • Sfortunatamente, stai anche mescolando la logica di business (come hp ) con problemi di presentazione (come hpLabel ).

Versione 2

  • La logica relativa alla presentazione è nettamente separata dalla logica aziendale.

  • Sfortunatamente, le diverse entità ( Player e Enemy ) sono ora distribuite su tutto il livello aziendale. Prima o poi, avrai un casino.

Soluzione

L'approccio orientato agli oggetti 'corretto' è quello di avere una classe Player e una Enemy che posseggano i rispettivi stati e implementino la logica di business appropriata (come Move() , Die() , ecc.). Tuttavia, non contengono elementi correlati alla vista, come le etichette.

Inoltre, hai PlayerView e EnemyView che hanno un riferimento ai loro rispettivi oggetti di dominio. Questo è dove si implementa tutta la logica dell'interfaccia utente. Le classi di vista non devono rispecchiare le tue classi di dominio - una vista può fare riferimento a più classi di dominio e una classe di dominio può essere referenziata da più viste.

Il tuo oggetto di gioco mantiene quindi un riferimento agli oggetti del modello di livello superiore, nonché agli oggetti di visualizzazione di primo livello.

    
risposta data 10.02.2018 - 20:07
fonte

Leggi altre domande sui tag