Tout d'abord, l'exemple que vous avez fourni n'est pas incroyablement inefficace; ce n'est que légèrement inefficace; son inefficacité est inférieure au niveau perceptible. Mais, en tout cas, passons à la question.
D'après ce que je comprends, lorsque nous parlons de séparation de l'interface utilisateur et de la logique , nous entendons éviter le couplage étroit .
Le couplage étroit fait référence à la situation dans laquelle l'interface utilisateur connaît (et invoque) la logique, et la logique connaît (et invoque) l'interface utilisateur. Pour éviter un couplage étroit, il n'est pas nécessaire de recourir à l'abolition totale du couplage. (C'est ce que vous semblez viser en démolissant l'interface entre eux en une interface de chaîne au plus petit dénominateur commun.) Tout ce qu'il faut faire est d'utiliser un couplage lâche .
Un couplage lâche signifie que A connaît B, mais B ne connaît pas A. En d'autres termes, les deux parties impliquées jouent des rôles client et serveur distincts , où le client connaît le serveur, mais le serveur ne connaît pas le client.
Dans le cas de l'interface utilisateur et de la logique, la meilleure façon d'organiser cela à mon avis est de voir la logique comme un serveur et l'interface utilisateur comme un client. Ainsi, l'interface utilisateur est conçue pour la logique, a connaissance de la logique et appelle la logique, tandis que la logique ne sait rien de l'interface utilisateur et répond simplement aux demandes qu'elle reçoit. (Et ces demandes proviennent de l'interface utilisateur, mais la logique ne le sait pas.)
Pour le dire en termes plus pratiques, vous ne trouverez nulle part dans les fichiers de code source de la logique des instructions d'inclusion / importation / utilisation faisant référence à des fichiers d'interface utilisateur, tandis que les fichiers de code source de l'interface utilisateur seront remplis d'inclusion / importation / utilisation les instructions qui font référence aux fichiers logiques.
Donc, pour revenir à votre cas, il n'y a absolument rien de mal à ce que le code de l'interface utilisateur qui remplit la zone de liste déroulante connaisse la classe des hamburgers. Il y aurait un problème si la classe de hamburger savait quelque chose sur les combos.
Soit dit en passant, cette conception permet une autre chose que vous devriez attendre d'un tel système: il devrait être possible de connecter autant d'interfaces différentes que vous le souhaitez à la logique, et le tout devrait toujours fonctionner.