Algunos dicen que si lleva los principios SOLID a sus extremos, terminará en la programación funcional . Estoy de acuerdo con este artículo, pero creo que se pierde algo de semántica en la transición de la interfaz / objeto a la función / cierre, y quiero saber cómo la programación funcional puede mitigar la pérdida.
Del artículo:
Además, si aplica rigurosamente el Principio de segregación de interfaz (ISP), comprenderá que debe favorecer las interfaces de rol sobre las interfaces de encabezado.
Si sigue impulsando su diseño hacia interfaces cada vez más pequeñas, eventualmente llegará a la interfaz de roles definitiva: una interfaz con un solo método. Esto me pasa mucho. Aquí hay un ejemplo:
public interface IMessageQuery
{
string Read(int id);
}
Si tomo una dependencia de una IMessageQueryparte del contrato implícito, esa llamada Read(id)buscará y devolverá un mensaje con la ID dada.
Compare esto con tomar una dependencia de su firma funcional equivalente int -> string. Sin señales adicionales, esta función podría ser simple ToString(). Si lo implementaste IMessageQuery.Read(int id)con un ToString()¡puedo acusarlo de ser deliberadamente subversivo!
Entonces, ¿qué pueden hacer los programadores funcionales para preservar la semántica de una interfaz bien nombrada? ¿Es convencional, por ejemplo, crear un tipo de registro con un solo miembro?
type MessageQuery = {
Read: int -> string
}
Without any additional clues... tal vez es por eso que la documentación es parte del contrato ?