Ne demande pas qui tu es. Demande si tu réponds.Don't ask what you are. Ask whether you respond.
Deux volumes durant, on a envoyé des messages sans jamais demander le type de personne. C'était le sujet sans le nommer. Le voici : le duck typing. « Si ça marche comme un canard et que ça cancane comme un canard, c'est un canard. » Une méthode qui appelle x.quack fonctionne sur n'importe quel objet répondant à quack — sans interface à implémenter, sans superclasse commune. Le seul contrat, c'est le message lui-même.For two volumes we've sent messages without ever asking anyone's type. That was the subject, unnamed. Here it is: duck typing. 'If it walks like a duck and quacks like a duck, it's a duck.' A method calling x.quack works on any object responding to quack — no interface to implement, no shared superclass. The only contract is the message itself.
def faire_crier(x) = x.quack # j'envoie juste le message quack class Canard; def quack = "Coin !" end class Klaxon; def quack = "POUET !" end # aucun lien avec Canard class FauxCanard; def quack = "(silence)" end # un objet de test faire_crier(Canard.new) # => "Coin !" faire_crier(Klaxon.new) # => "POUET !" faire_crier(FauxCanard.new) # => "(silence)" # aucune interface, aucune superclasse commune : il suffit de répondre
Aucune des trois classes n'« est » un canard, ne partage d'ancêtre, ne déclare d'interface. Elles sont interchangeables parce qu'elles répondent au même message, point.None of the three "is" a duck, shares an ancestor, or declares an interface. They're interchangeable because they answer the same message, full stop.
« Je ne demande pas quel type tu es — je demande si tu réponds à ce message. » Code contre un protocole (le ou les messages attendus), jamais contre une classe nommée. Ce que ton objet « est » ne te regarde pas ; ce qu'il sait faire, si."I don't ask what type you are — I ask whether you respond to this message." Code against a protocol (the expected message(s)), never against a named class. What your object "is" is none of your business; what it can do, is.
Le Vol 1 a posé que tout est un message à un objet ; le Vol 2, qu'on délègue du comportement. Le duck typing est leur conséquence directe : si seul compte le message qu'un objet reçoit, alors son type n'a jamais été la question. Ce volume ne fait que nommer ce qu'on pratiquait déjà — et en montrer le prix.Vol 1 set that everything is a message to an object; Vol 2, that you delegate behavior. Duck typing is their direct consequence: if only the message an object receives matters, then its type was never the question. This volume merely names what we were already doing — and shows its price.