Informazioni sulle classi e i loro stati validi

1

Mi blocco ogni volta che ho bisogno di scrivere un costruttore per qualsiasi progetto di classe I. Il motivo è che non sono sicuro di cosa dovrebbe andare in un costruttore e cosa non dovrebbe.

Nel cercare su google, ho la risposta che il costruttore deve fare solo per assicurarsi che l'opbect creato sia valido. Ma la mia domanda è

How do you know if an object is in the valid state?

La mia classe rappresenta una scacchiera:

public class ChessBoard
{
    List<ICellRow> lstRow;
    int cellOffset;

    //Other function

    public ChessBoard()
    {
        //What should go in here?
    }
}

Come decidi quando una classe ha le informazioni minime per essere nello stato valido? In questo specifico esempio, rende valida la classe della scheda?

    
posta TheSilverBullet 08.02.2013 - 07:48
fonte

3 risposte

4

Pensa a un oggetto come a un valore, proprio come un numero o una stringa. Quel valore rappresenta un concetto nel problema che stai cercando di risolvere. Ad esempio, è possibile utilizzare un int per indicare una distanza in miglia o un numero di punti o un insieme di flag booleani. Il valore non ha alcun significato da solo, ma ha un'interpretazione.

Ogni volta che crei un valore, vuoi assicurarti che la sua interpretazione abbia senso. Dovrebbe essere valido per costruzione -3 è un numero valido, e "ciao" è una stringa valida. In particolare, non c'è modo di costruire una stringa con un valore che non sia una stringa.

Inoltre, le operazioni sui valori dovrebbero essere progettate in modo tale che ogni operazione conduca a uno stato interno valido, oppure segnala un errore, sia in fase di compilazione tramite tipizzazione statica, sia in fase di runtime tramite eccezioni. La divisione per zero, ad esempio, non è consentita sui numeri interi.

Ciò significa per te che il costruttore della tua classe ChessBoard dovrebbe produrre uno stato della scheda legale in base alle regole del gioco. Ad esempio, è possibile utilizzare il costruttore per impostare la configurazione iniziale dei pezzi per l'inizio di un gioco. Le operazioni alla lavagna dovrebbero quindi consentire solo di passare ad altri stati di gioco legali. Pensando in questo modo, puoi assicurarti che il tuo ChessBoard rappresenti accuratamente il modo in cui un gioco di scacchi funziona nella vita reale.

    
risposta data 08.02.2013 - 08:03
fonte
0

Il costruttore dovrebbe anche assicurarsi che qualsiasi struttura (per esempio colloqui) sia inizializzata secondo le convenzioni.

Ad esempio, se si prevede che un metodo o una proprietà restituiscano sempre una raccolta non nullo (anche nel caso in cui non siano mai stati aggiunti articoli), il costruttore deve inizializzare la raccolta. In questo modo qualsiasi chiamata a metodi o proprietà dipendenti dalla collezione sarà in grado di fare affidamento su una collezione valida.

    
risposta data 08.02.2013 - 13:15
fonte
0

Lo scopo del costruttore è quello di impostare la classe in uno stato predefinito user-friendly.

es. Se la scacchiera fosse un oggetto grafico per un videogioco, sarebbe ragionevole aspettarsi che i colori delle tessere fossero predefiniti in bianco e nero, in modo da allontanare un po 'di tempo dal programmatore che deve farlo manualmente utilizzando chiamate di funzioni extra .

    
risposta data 08.02.2013 - 13:35
fonte

Leggi altre domande sui tag