La convalida del setter influisce sulle prestazioni?

2

In uno scenario in cui si utilizza un ORM per mappare le entità al DB e si hanno convalide del setter (nullable, data inferiore alla convalida odierna, ecc.), ogni volta che l'ORM ottiene un risultato, passerà nel setter a istanza l'oggetto.

Se ho una griglia che in genere restituisce 500 record, presumo che per ogni record passi tutte le convalide. Se la mia entità ha 5 convalide setter, allora ho passato in 2.500 convalide.

  • Queste convalide 2.500 avranno effetto sul rendimento?
  • Se era 15.000 di convalida, sarà diverso?

Secondo me e in base a questa risposta , setter la validazione è utile rispetto alla convalida dei costruttori.

  • C'è un modo per evitare la convalida non necessaria, dal momento che sono sicuro di dirlo i valori che invio al DB quando si salva l'entità non cambieranno fino a I modificarlo sul mio sistema?
posta TiagoBrenck 23.10.2013 - 12:51
fonte

3 risposte

7

Ha effetto sulle prestazioni? Certo.

Importa? Chiedi al tuo profiler.

È peggio di cattivi dati nel tuo database? Non è una possibilità.

    
risposta data 23.10.2013 - 13:32
fonte
5

Può influire sulle prestazioni?

Certo, lo sarà.

Se stai convalidando qualcosa, hai un sovraccarico lì. A volte questo overhead è significativo, altre volte è trascurabile.

Devo convalidare il setter?

Se la convalida sul setter della proprietà fa male alla tua performance, forse dovresti eseguire la validazione solo quando strettamente necessario, come quando lo stai persistendo in un database (qualcosa come un metodo isValid ). Lo svantaggio di questo approccio è che potresti avere oggetti non validi in giro.

C'è anche una terza scuola di pensiero qui:

  • Oggetti mutevoli che non sono mai validi (convalida sempre sul setter, come il tuo scenario)
  • Oggetti mutabili che possono trovarsi in uno stato non valido (convalidare solo se necessario, come ho detto sopra)
  • Oggetti immutabili che non possono essere non validi (se non è valido non costruisci affatto l'oggetto)

Uno svantaggio con il primo, quello che stai attualmente utilizzando, è che potresti eseguire la convalida quando non è necessario.

Tutti hanno pro e contro, quale scegliere dipende molto dal tuo scenario e dal tuo background di (colleghi).

La validazione deve essere eseguita sull'oggetto stesso?

Questo è ancora più discutibile. La separazione dei dati dalla logica aziendale viene spesso definita come modello di dominio anemico . Un famoso obiettore del modello di dominio anemico è Martin Fowler , che in questo particolare argomento non sono d'accordo con lui, ma va bene , è il mio parere:)

Sto semplificando troppo qui, ma la principale differenza tra lasciare che il tuo dominio sia anemico e non quello è più conforme al puro teorico OOP e, all'inizio, richiede meno sforzo per progettare e mantenere; l'altro fa una migliore separazione delle preoccupazioni ed è molto meglio quando si ha a che fare con la concorrenza (dato che gli oggetti sono senza stato).

Questo argomento è un ottimo spunto di riflessione. Ti suggerisco di lasciare tutto così com'è se ti trovi in uno scenario di risoluzione dei problemi maggiore; grandi cambiamenti sullo status quo potrebbero non essere salutari se il tempo non è corretto.

P.S.

Essendo specifico per il tuo ORM, a seconda della lingua o del framework che stai utilizzando, il tuo ORM può trovare un modo per serializzare / deserializzare senza usare getter o setter.

    
risposta data 23.10.2013 - 18:15
fonte
0

If I have a grid that usually returns 500 records, I assume that for each record it passes on all validations. If my entity has 5 setter validations, than I have passed in 2,500 validations.

Solo se ogni record nella griglia è stato modificato dall'utente.

La convalida avviene solo sull'immissione dei dati. Se stai solo visualizzando i record, non è in corso alcuna convalida. Presumibilmente, i dati che stai visualizzando erano già stati convalidati quando sono stati immessi dai dati, o convalidati quando sono stati utilizzati da un sistema diverso.

Suggerirei che qualunque sia il costo di convalida di un nuovo record, è quasi certamente più piccolo di quello che digitava il nuovo record.

    
risposta data 25.01.2018 - 01:53
fonte

Leggi altre domande sui tag