Certains disent que si vous prenez les principes SOLIDES à l'extrême, vous vous retrouvez à la programmation fonctionnelle . Je suis d'accord avec cet article mais je pense que certaines sémantiques sont perdues dans la transition de l'interface / objet à la fonction / fermeture, et je veux savoir comment la programmation fonctionnelle peut atténuer la perte.
De l'article:
De plus, si vous appliquez rigoureusement le principe de séparation des interfaces (ISP), vous comprendrez que vous devriez privilégier les interfaces de rôle par rapport aux interfaces d'en-tête.
Si vous continuez à orienter votre conception vers des interfaces de plus en plus petites, vous arriverez finalement à l'interface de rôle ultime: une interface avec une seule méthode. Cela m'arrive beaucoup. Voici un exemple:
public interface IMessageQuery
{
string Read(int id);
}
Si je prends une dépendance sur un IMessageQuery
, une partie du contrat implicite est que l'appel Read(id)
recherche et renvoie un message avec l'ID donné.
Comparez cela à prendre une dépendance à l' égard de sa signature fonctionnelle équivalente, int -> string
. Sans indices supplémentaires, cette fonction pourrait être simple ToString()
. Si vous avez implémenté IMessageQuery.Read(int id)
avec un ToString()
je peux vous accuser d'être délibérément subversif!
Alors, que peuvent faire les programmeurs fonctionnels pour préserver la sémantique d'une interface bien nommée? Est-il conventionnel, par exemple, de créer un type d'enregistrement avec un seul membre?
type MessageQuery = {
Read: int -> string
}
Without any additional clues
... c'est peut-être pourquoi la documentation fait partie du contrat ?