Deux styles de programmation existent pour une fonction qui fait une analyse de cas sur la nature de son argument :

La version classes (comme en Java) est adaptée à l'extension horizontale, i.e. l'ajout d'un nouveau cas. C'est-à-dire qu'on ajoute alors un nouveau fichier, ne contenant que ce qui est spécifique au nouveau cas. Mais l'ajout d'une nouvelle fonction est malaisé car explosé à plusieurs endroits.

La version type algébrique + filtrage (comme en OCaml) est adaptée à l'extension verticale, i.e. l'ajout d'une nouvelle fonction. C'est-à-dire qu'on ajoute alors une nouvelle définition de fonction, où tous les cas sont traités au même endroit. Mais l'ajout d'un nouveau cas est malaisé car explosé à plusieurs endroits.

Cette dualité est bien expliquée notamment dans le livre de compilation d'Appel dans sa version Java, où il explique justement comment faire des arbres de syntaxe abstraite avec des objets.