The primary purpose of the DATA statement is to give names to
constants; instead of referring to pi as 3.141592653589793 at every
appearance, the variable PI can be given that value with a DATA
statement and used instead of the longer form of the constant. This
also simplifies modifying the program, should the value of pi change.
FORTRAN di base Xerox e manuale FORTRAN IV di base , attribuito a David H. Owens. Fonte: link
Ovviamente, i valori costanti comunemente utilizzati dovrebbero essere utilizzati tramite dichiarazioni costanti che rendono evidente a chiunque stia osservando il codice quale sia il valore, e per rendere più semplice la modifica del valore in futuro, se necessario . Tuttavia, questo non deve essere visto come un dettame assolutamente vincolante che dovrebbe essere seguito con devozione dogmatica.
Considera la seguente implementazione di una funzione hashCode()
:
/**
* Computes the FNV hash code of all elements in this unmodifiable enumerable.
*/
static <E> int hashCode( UnmodifiableEnumerable<E> self )
{
int hash = 17;
for( E element : self )
hash = 31 * hash + Objects.hashCode( element );
return hash;
}
Come dice il commento, questa è la (più comune versione semplificata della) standard Funzione hash Fowler-Noll-Vo che la maggior parte dei programmatori conosce. Non ha senso creare costanti per il 17 e il 31, poiché ciò complicherebbe ulteriormente le cose. Sono solo due numeri primi, il loro uso è altamente localizzato, (solo all'interno di questa funzione,) è altamente improbabile che cambi mai, e se c'è mai la necessità di cambiarli, la persona che deciderà di cambiarli meglio sa molto bene quello che stanno facendo, e quindi meglio conoscere molto bene ciò che rappresentano.
Altre volte, esistono numeri che sono così permanentemente espressi nella pietra, e quindi molto ben conosciuti da tutti, che a volte le costanti non sono necessarie. L'esilarante citazione del Basic FORTRAN IV Manual lo illustra bene, ma ecco un altro esempio: una settimana ha sette giorni in tutto il mondo, e questo è altamente improbabile che cambi mai, quindi un'espressione semplice che coinvolge identificatori esistenti che hanno già i nomi significativi non hanno nulla a cui trarre beneficio sostituendo un valore letterale 7
con una costante. Chi ha davvero bisogno di vedere days = weeks * DAYS_PER_WEEK
invece di days = weeks * 7
?
(Naturalmente, se l'espressione è più complicata, o se gli altri identificatori che prendono parte all'espressione non hanno tali nomi che si spiegano da soli, potrebbe essere ancora meglio usare DAYS_PER_WEEK
piuttosto che 7
, allo scopo di documentare ciò che stai facendo.)
Detto questo, devi stare attento ai problemi culturali.
Alla pagina 300 del libro "Clean Code" di Prentice Hall, l'autore Robert C. Martin dice:
And in the FEET_PER_MILE case, the number 5280 is so very well known and so unique a constant that readers would recognize it even if it stood alone on a page with no context surrounding it.
A cui devo dire (estratto dal mio blog )
The world is not the USA. Most of the world uses the metric system, and knows very little about miles and feet. When given a number in "United States customary units", many people outside the USA know how to convert it to metric, but it is rare to meet someone who is proficient in converting from metric to US units, and even more rare to meet someone who has the slightest clue, or the slightest interest, in converting between US units. Therefore, the number 5280 means absolutely nothing to the vast majority of the population of the planet. As a matter of fact, there are so many non-USAians working as software engineers in the USA, that even in the USA it would be a bad idea to assume that anyone who sees the number 5280 in a piece of code will know what it stands for.
Infine, i numeri magici nel loro vero senso (di avere un significato segreto) dovrebbero essere quasi sempre dichiarati con una costante, altrimenti la loro presenza nel mezzo del codice sorgente può essere molto sconcertante, ma anche questa regola ha un'eccezione. Se utilizzerai solo un particolare numero magico una volta nella tua intera base di codice, e se deve apparire in un pezzo di codice come il seguente, allora va bene, perché ciò che sta accadendo è molto ovvio:
if( fileObject.getMagicNumber() == 0xbadbeef ) { ... }