Chi mastica programmazione a pranzo e cena, ed anche a merenda, senz'altro avrà già sentito parlare dei Magic Numbers. Si tratta di una pratica di cattiva programmazione in cui si usa inserire direttamente all'interno del codice delle costanti numeriche senza fornire alcuna spiegazione.
# check whether the account have more domain available raise NoMoreDomainAvailable unless User.nof_domains < 25
In questo codice è ancora abbastanza comprensibile che 25 sia il limite, ma la domanda resta: di chi o cosa? Prendete quest'altro esempio.
log.status = 1 log.save!()
Qua proprio si capisce poco! Cos'è 1? DEBUG o FATAL ERROR? La pratica corretta sarebbe di riscrivere, ad esempio, l'ultimo script in questo modo.
# Define status list LOG_STATUS_DEBUG = 0 LOG_STATUS_INFO = 1 LOG_STATUS_ERROR = 2 log.status = LOG_STATUS_INFO log.save!()
Nei nostri due esempi 1 e 25 sono magic numbers.
Poiché è essenziale che il codice che io scrivo possa essere compreso agevolmente da chi lavora nel mio team, il problema affrontato in questo post è quello di individuare la posizione ed il formato corretto per salvare questo tipo di elementi.
Innanzitutto, così rapidamente, si tratta di costanti. Dunque il tipo l'ho individuato.
Queste costanti sono globali, speso vengono condivise da più controller
così come da view
o model
. A questo punto la soluzione è quella di individuare un posto globale nell'ambiente.
Cosa? Hai detto ambiente?!?
Ma certo. Apriamo il file config/environment.rb
ed inseriamo all'interno, verso il fondo, le costanti che ci servono.
# See Rails::Configuration for more options end # Include your application configuration below LOG_STATUS_DEBUG = 0 LOG_STATUS_INFO = 1 LOG_STATUS_ERROR = 2 LIMIT_MAX_NOF_DOMAINS_PER_USER_BASIC = 25 LIMIT_MAX_NOF_DOMAINS_PER_USER_PRO = 100 LIMIT_MAX_NOF_DOMAINS_PER_USER_PREMIUM = nil
Tutte le costanti inserite nel file config/environment.rb
sono automaticamente disponibili in qualsiasi controller, view e model. Direi che per ora abbiamo trovato la soluzione ai nostri problemi... o no? Consigli per migliorare?