Lavorando a un tool di sviluppo a oggetti, mi sono trovato a ragionare su quanto sia sbagliato usare la parola chiave if in un linguaggio a oggetti.
Le strutture di controllo come gli if sono fortemente procedurali e spingono a non programmare a oggetti.
Il succo della programmazione a oggetti è l’invio di messaggi; non è un caso se Smalltalk (l’unico linguaggio veramente a oggetti che conosco) implementa gli if come dei messaggi.
In Ruby i booleani sono le due classi TrueClass e FalseClass.
Per ottenere un comportamento simile a quello di Smalltalk, si possono aggiungere i metodi if_true e if_false a queste classi:
class TrueClass
def if_true
yield
end
def if_false
end
end
class FalseClass
def if_true
end
def if_false
yield
end
end
aBoolean = 1==2
aBoolean.if_true { print "true!" }
# invece di
# print “true!” if aBoolean
aBoolean.if_false { print "false!" }
# invece di
# print “false!” unless aBoolean
Il metodo if_true di TrueClass esegue il blocco che viene passato, mentre if_false non fa nulla. La classe FalseClass ha il comportamento opposto.
Il bello di questo approccio è che non c’è nessun if; è un po’ come uno state pattern.
Non capisco perché in Ruby gli if non siano stati implementati in maniera analoga (mentre per i cicli è stato fatto): in teoria, qualunque linguaggio che supporti i blocchi permette di non dover creare keywords per le strutture di controllo del flusso.