E 'una buona idea restituire un valore predefinito se non è possibile trovare un campo in una query?

4

Nel posto in cui lavoro stiamo utilizzando una classe SafeReader che include un IDataReader. Una delle "funzionalità" è che se il campo a cui stai tentando di accedere non era nella query, restituisce semplicemente un valore predefinito.

Quindi sto lavorando con un codice che è già in atto, ma apparentemente non ha mai funzionato completamente poiché accede a campi che non vengono restituiti dal proc memorizzato che sta chiamando ma non ha generato eccezioni dal momento che SafeReader ha gentilmente restituito il valore predefinito valori.

Personalmente non mi piace perché significa che quando ci sono errori nel codice (qualcuno dimentica di includere un campo nella query, o forse un errore di ortografia), allora è più difficile da cogliere.

La mia domanda è se questo viola le "migliori pratiche" generali di sviluppo o ideali di programmazione orientata agli oggetti? O sembra perfettamente ragionevole?

    
posta BVernon 03.07.2014 - 17:43
fonte

3 risposte

2

My question is whether this violates any general 'best practices' of development or object oriented programming ideals?

A volte succede. A volte, l'accesso a una colonna che non esiste è una chiara disconnessione tra il contratto implicito implementato dal lettore di dati tra il codice chiamante e l'origine dati. Se si tratta chiaramente di un problema, restituire il valore predefinito viola la "best practice, fallire ovviamente".

Ma a volte no. In qualcosa di simile a un servizio web, non includere una colonna viene fatto come implicito "non specificato" o "usa default" (vedi EmitDefaultValue su DataMember per esempio). Ciò riduce il carico utile delle chiamate al servizio web. Avere le colonne non incorporate fornisce un valore predefinito è molto più pulito qui poiché ti permette di obbedire a DRY (non ripeterti) piuttosto che controllare ogni singola chiamata di accesso ai dati.

Personalmente, eviterei di far lavorare la tua roba con DataReader o i suoi parenti direttamente dove possibile. L'intero problema esiste perché stai usando un dizionario glorificato piuttosto che un oggetto reale. Che è la vera violazione degli ideali OO. Tutto il resto è un compromesso basato sulla tua particolare situazione.

    
risposta data 03.07.2014 - 18:09
fonte
2

Dipende se il valore predefinito è il valore giusto o meno. Vedo quel modello troppo spesso quando sembra essere il modo più veloce per far funzionare un particolare caso d'uso. Rende solo più difficile il debug di altri casi d'uso in futuro.

Che cosa intendo per valore predefinito come valore corretto? Bene, prendi un campo intero, per esempio. Come dovrebbe essere predefinito? Se hai detto che non lo sai, dai un biscotto. Se hai detto zero, questa è la risposta giusta per, diciamo, "numero di voti positivi", ma non "secondi fino all'autodistruzione".

In altre parole, un valore predefinito corretto è specifico per il campo e può essere utilizzato in tutti i casi d'uso senza verificarlo. Se devo pepare il mio codice con if IntegerField == -1 , il valore predefinito non solo non mi sta comprando nulla che non potrei ottenere con null , o ancora meglio un'opzione o un'eccezione, mi fa davvero male perché il controllo è più facile dimenticare e gli errori gravi sono più facili da ignorare. Perché rinunciare a utilizzare gli strumenti specificamente progettati per aiutare i programmatori in questa situazione?

Tuttavia, se posso semplicemente scrivere Upvotes += 1 senza preoccuparmi se quel campo è già stato utilizzato in precedenza, e sapere che produrrà il risultato corretto a causa di un valore predefinito zero, allora il valore predefinito mi sta comprando qualcosa di utile.

Il problema con la classe SafeReader che descrivi è che si tratta di ipotesi su campi di cui non sa nulla. Posso pensare a casi d'uso in cui potrebbe essere utile includere i valori predefiniti per i campi che non sono in una query, ma tutti implicano qualche altra forma di convalida dei nomi dei campi, ad esempio rispetto a uno schema.

Personalmente considero qualsiasi cosa chiamata SafeWhatever un odore di codice. Il nome mi sembra un po 'orwelliano, perché la sicurezza è quasi sempre un'illusione. È come abbattere i guard rail in modo che una strada non sia così pericolosa.

    
risposta data 03.07.2014 - 19:35
fonte
1

No, non è una buona idea in generale. È una pessima idea.

Per ALCUNE cose, sarà OK restituire un valore predefinito, ma questo deve essere risolto caso per caso per quella particolare cosa. Per poter eseguire la risoluzione caso per caso, devi fornire il caso in cui NON è OK restituire un valore predefinito.

Consideriamo ad esempio un sistema di badge dei dipendenti. Tutti i dipendenti sono ammessi per impostazione predefinita in una determinata struttura, ma solo alcuni hanno accesso a determinate stanze nella struttura. Il database è progettato per restituire il valore di accesso consentito durante la ricerca per numero di dipendenti. In questo caso, sarebbe allettante restituire un valore predefinito e archiviare solo i numeri di badge con livelli di accesso PIÙ ALTI. Questo fallisce immediatamente, quando Ivan Ivanovitch del GRU (o chiunque sia l'attuale ufficio di spook esterno russo) presenta un badge contraffatto con il nome "John Johnson" e un falso numero di impiegati, e il lettore di badge apre la porta per lui. (Sì, sto dando via la mia età qui.)

La mia esperienza personale è che, se la tua lingua supporta le eccezioni, lanci un'eccezione nel caso "not found" e FORCE il prossimo ragazzo per fornire un gestore di eccezioni. Una vasta esperienza nel settore dimostra oltre ogni ragionevole dubbio che la stragrande maggioranza dei programmatori C e C ++ non controlla mai i codici di ritorno delle funzioni. (Del resto, troppi di loro non riescono a controllare i puntatori per non-null prima di dereferenziarli, anche quando il loro datore di lavoro ha degli standard di codifica scritti rigidi che richiedono tali controlli. Sì, quella frase è scritta nel sangue, grazie per chiedendo.)

    
risposta data 03.07.2014 - 17:57
fonte

Leggi altre domande sui tag