Citation :Bah faut pas pousser, faut penser au cas d'utilisation quand même. Qui va comparer deux adresses juste sur le nom de la rue ?Donc, il ne faut pas de méthode "isEqual()" pour la classe "Rue" si on considère que cela ne fait pas sens de comparer deux rues. Je Trouve que c'est c'est là le drame de beaucoup de projets "objets": on crée des classes avec des méthodes qui n'ont de sens que dans un contexte d'utilisation particulier.
Soit la méthode "Rue::isEqual()" existe, est fiable et ne compare que deux rues sans se soucier de "pourquoi est-ce que cette méthode est appelée / dans quelle cas est-elle appelée" (donc, se baser sur le seul nom de rue est léger, ou alors il faut que la classe représente un NomDeRue et non une Rue, puisqu'une Rue n'est pas représentée par son seul nom), soit la méthode n'existe pas (voire, la classe n'existe pas si elle est "interne" à la classe Adresse).
Du coup, si dans l'exemple Elixir, meme_rue() est privée, c'est envisageable (puisque le scope est limité à la classe, donc on sait dans quel contexte ces méthodes privées son appelées). Si c'est publique, c'est problématique:
adresse_de_jean = Adresse.new(4, "de la mairie", "Paris")
adresse_de_bob = Adresse.new(44,"de la mairie","Lyon")
Jean et Bob habitent la même rue pour vous? C'est une question qui fait sens (je peux avoir besoin de savoir s'ils habitent la même rue sans être forcément à la même adresse) mais la réponse donnée par meme_rue() serait "true" il me semble...
Tiens, typiquement, c'est exactement comme si on comparait deux personnes dans une BDD uniquement sur la base de leur nom: les homonymes, ça existe, c'est même pour cela qu'on utilise un id dédié.