Alguns dizem que, se você levar os princípios do SOLID ao extremo, você termina em programação funcional . Eu concordo com este artigo, mas acho que algumas semânticas são perdidas na transição da interface / objeto para a função / fechamento, e quero saber como a Programação Funcional pode mitigar a perda.
Do artigo:
Além disso, se você aplicar rigorosamente o Princípio de Segregação de Interface (ISP), entenderá que deve favorecer as Interfaces de Função em vez das Interfaces de Cabeçalho.
Se você continuar dirigindo seu design para interfaces cada vez menores, chegará à Role Interface: uma interface com um único método. Isso acontece muito comigo. Aqui está um exemplo:
public interface IMessageQuery
{
string Read(int id);
}
Se eu aceitar uma dependência IMessageQuery
, parte do contrato implícito é que a chamada Read(id)
procurará e retornará uma mensagem com o ID fornecido.
Compare isso com a dependência de sua assinatura funcional equivalente int -> string
,. Sem nenhuma dica adicional, essa função pode ser simples ToString()
. Se você implementou IMessageQuery.Read(int id)
com um, ToString()
posso acusá-lo de ser deliberadamente subversivo!
Então, o que os programadores funcionais podem fazer para preservar a semântica de uma interface bem nomeada? É convencional, por exemplo, criar um tipo de registro com um único membro?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
... talvez seja por isso que a documentação faça parte do contrato ?