Prendo spunto dal post di Luka su come ridurre la complessità del codice eliminando i conditional statement come if, swicth ecc. per fare qualche considerazione.
Premetto che ho aderito alla campagna anti-if e che sono pienamente d'accordo ad avere un codice con una complessità ciclomatica molto bassa.
Ci sono if che secondo me non è conveniente eliminare.
Partiamo da un esempio:
Ho un software che simula una tastiera elettronica con la tastiera del PC e ad ogni tasto premuto corrisponde un suono. Nel caso in cui premo un tasto che non fa parte della tastiera musicale deve essere emesso un suono di default.
Il codice più semplice e manuntenibile che mi viene in mente è questo:
public class Sounds
{
private readonly Dictionary<Keys, Sound> m_sounds;
private readonly Sound m_defaultSound;
public Sounds(Sound defaultSound, Dictionary<Keys, Sound> sounds)
{
m_defaultSound = defaultSound;
m_sounds = sounds;
}
public void Play(Keys keyCode)
{
if (m_sounds.ContainsKey(keyCode))
{
m_sounds[keyCode].Play();
}
else
{
m_defaultSound.Play();
}
}
}
Nei commenti del Post di Luka ho visto delle idee per eliminare questo If:
Aggiungere tutti i possibili valori di Keys all'interno del Dictionary, in questo modo verrebbe associato il default sound a tutti i tasti che ora andrebbero nell'esle. Questa idea ha un pericoloso side effect: cosa succede se premo ad esempio ctrl+a? Avrei un eccezione. Inoltre è piuttosto laborioso inizializzare il dictionary con tutti i valory di keys anche usando la reflection.
Altra alternativa: descrivere una macchina a stati. Mi sembra uno strumento troppo sofisticato per questo semplice scenario.
Notare che queste due alternative sarebbero anche più complicate da testare. Mentre nel codice riportato sopra sono sufficienti due test.
Arriviamo quindi al punto. Quali sono gli if che conviene eliminare e quali no?
Gli che dipendono dal valore che assume una variabile vanno tolti, esempi che mi vengono in mente:
if sounds == null
if movieType == ...
Le condizioni che descrivono il comportamento del sistema vanno valutate caso per caso magari si valutano diverse alternative e si sceglie quella più mantenibile. Ora la domanda sorge spontanea cosa intendiamo per mantenibile?
In questo caso è la località dei comportamenti correlati. Immaginate di dover ricevere una richiesta di modifica in cui quando si preme shift devo suonare la nota un ottavo più alto quando tempo impiego ad individuare dove fare la modifica?