Domanda

Mi chiedo se sia una buona idea da realizzare verifiche In getter E setter, o altrove nel codice.

Questo potrebbe sorprenderti quando si tratta ottimizzazioni E eccesso di velocità up il codice, penso che non dovresti fare verifiche in getter e setter, ma nel codice in cui ti trovi in aggiornamento i tuoi file o database.Ho sbagliato?

È stato utile?

Soluzione

Bene, uno dei motivi per cui le classi solitamente contengono membri privati ​​con getter/setter pubblici è proprio perché possono verificare i dati.

Se hai un numero che può essere compreso tra 1 e 100, inserirei sicuramente qualcosa nel setter che lo convalidi e quindi forse lancerò un'eccezione che viene catturata dal codice.Il motivo è semplice:Se non lo fai nel setter, devi ricordare quella limitazione da 1 a 100 ogni volta che la imposti, il che porta a un codice duplicato o quando lo dimentichi, porta a uno stato non valido.

Per quanto riguarda le prestazioni, sono con Knuth qui:

"Dovremmo dimenticare le piccole efficienze, diciamo circa il 97% delle volte:l’ottimizzazione prematura è la radice di tutti i mali”.

Altri suggerimenti

@Terrapin, riferimento:

Se tutto ciò che hai è un mucchio di [semplici set pubbliche/get] proprietà ...Potrebbero anche essere campi

Le proprietà hanno altri vantaggi rispetto ai campi.Sono un contratto più esplicito, sono serializzati, è possibile eseguire il debug in seguito, sono un bel posto per l'estensione tramite ereditarietà.La sintassi più goffa è una complessità accidentale: .net 3.5 ad esempio lo supera.

Una pratica comune (e imperfetta) è quella di iniziare con i campi pubblici e trasformarli in proprietà in un secondo momento, in base alle necessità.Questo rompe il tuo contratto con chiunque consumi la tua classe, quindi è meglio iniziare con le proprietà.

Dipende.

In generale, il codice dovrebbe fallire rapidamente.Se il valore può essere impostato da più punti nel codice e si effettua la convalida solo dopo aver recuperato il valore, il bug sembra essere nel codice che esegue l'aggiornamento.Se i setter convalidano l'input, sai quale codice sta tentando di impostare valori non validi.

Dal punto di vista di avere il codice più gestibile, penso che dovresti fare quanta più convalida possibile nel setter di una proprietà.In questo modo non dovrai memorizzare nella cache o gestire in altro modo dati non validi.

Dopotutto, è a questo che servono le proprietà.Se tutto quello che hai è un mucchio di proprietà come...

public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

...potrebbero anche essere campi

Potresti voler dare un'occhiata Progettazione guidata dal dominio, di Eric Evans.DDD ha questa nozione di Specifica:

...Oggetti di valore simili a predicati espliciti per scopi specializzati.Una specifica è un predicato che determina se un oggetto fa o non soddisfa alcuni criteri.

Penso che fallire velocemente sia una cosa, l'altra è dove mantenere la logica per la convalida.Il dominio è il posto giusto per mantenere la logica e penso che un oggetto Specifica o un metodo di convalida sugli oggetti Dominio sarebbe un buon posto.

La convalida dovrebbe essere acquisita separatamente dai getter o dai setter in un metodo di convalida.In questo modo, se la convalida deve essere riutilizzata su più componenti, è disponibile.

Quando viene chiamato il setter, tale servizio di convalida dovrebbe essere utilizzato per disinfettare l'input nell'oggetto.In questo modo sai che tutte le informazioni memorizzate in un oggetto sono sempre valide.

Non è necessario alcun tipo di convalida per il getter, poiché le informazioni sull'oggetto sono già considerate valide.

Non salvare la convalida fino all'aggiornamento del database!!È meglio farlo fallire velocemente.

Mi piace implementare IDataErrorInfo e inserisco la mia logica di convalida nelle sue proprietà Error e this[columnName].In questo modo, se desideri verificare a livello di codice se è presente un errore, puoi semplicemente testare una di queste proprietà nel codice oppure puoi trasferire la convalida all'associazione dati in Web Form, Windows Form o WPF.

La proprietà di associazione "ValidatesOnDataError" di WPF lo rende particolarmente semplice.

Cerco di non lasciare mai che i miei oggetti entrino in uno stato non valido, quindi i setter avrebbero sicuramente la convalida così come tutti i metodi che cambiano stato.In questo modo non devo mai preoccuparmi che l'oggetto con cui ho a che fare non sia valido.Se mantieni i tuoi metodi come limiti di validazione, non dovrai mai preoccuparti dei framework di validazione e delle chiamate al metodo IsValid() sparse ovunque.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top