Alcuni sostengono che se si prendono i principi SOLID ai massimi livelli, si finisce con la programmazione funzionale . Sono d'accordo con questo articolo ma penso che alcune semantiche si perdano nel passaggio dall'interfaccia / oggetto alla funzione / chiusura e voglio sapere come la Programmazione funzionale può mitigare la perdita.
Dall'articolo:
Inoltre, se applichi rigorosamente il principio di segregazione dell'interfaccia (ISP), capirai che dovresti favorire le interfacce di ruolo rispetto alle interfacce di intestazione.
Se continui a guidare il tuo progetto verso interfacce sempre più piccole, alla fine arriverai all'interfaccia ruolo definitiva: un'interfaccia con un solo metodo. Questo mi succede molto. Ecco un esempio:
public interface IMessageQuery
{
string Read(int id);
}
Se prendo una dipendenza da un IMessageQuery
, parte del contratto implicito è che la chiamata Read(id)
cercherà e restituirà un messaggio con l'ID specificato.
Confronta questo a prendere una dipendenza da sua firma funzionali equivalente, int -> string
. Senza ulteriori spunti, questa funzione potrebbe essere semplice ToString()
. Se ti avessi implementato IMessageQuery.Read(int id)
con un, ToString()
potrei accusarti di essere deliberatamente sovversivo!
Quindi, cosa possono fare i programmatori funzionali per preservare la semantica di un'interfaccia ben definita? È convenzionale, ad esempio, creare un tipo di record con un singolo membro?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
... forse è per questo che la documentazione fa parte del contratto ?