Si dice che se si prendono i principi SOLIDI i loro estremi, si finisce con la programmazione funzionale . Sono d'accordo con questo articolo, ma penso che alcune semantiche si perdano nella transizione dall'interfaccia / oggetto alla funzione / chiusura, e voglio sapere come la programmazione funzionale può mitigare la perdita.
Dall'articolo:
Furthermore, if you rigorously apply the Interface Segregation Principle (ISP), you'll understand that you should favour Role Interfaces over Header Interfaces.
If you keep driving your design towards smaller and smaller interfaces, you'll eventually arrive at the ultimate Role Interface: an interface with a single method. This happens to me a lot. Here's an example:
public interface IMessageQuery
{
string Read(int id);
}
Se prendo una dipendenza su IMessageQuery
, parte del Read(id)
cercherà e restituirà un messaggio con l'ID specificato.
Confronta questo con la dipendenza dalla sua equivalente firma funzionale, int -> string
. Senza ulteriori spunti, questa funzione potrebbe essere un semplice ToString()
. Se hai implementato IMessageQuery.Read(int id)
con ToString()
, potrei accusarti di essere volutamente sovversivo!
Quindi, cosa possono fare i programmatori funzionali per preservare la semantica di un'interfaccia ben denominata? È convenzionale, ad esempio, creare un tipo di record con un singolo membro?
type MessageQuery = {
Read: int -> string
}