J'ai hélàs pas d'expérience en C++. Cependant j'émet un doute sur la portabilité des .o, .so et .dll.
Concernant ces bibliothèques, elles sont codées avec des instructions préprocesseurs ou elles utilisent des .h génériques couplés à des .cpp spécifiques ou autre ? Parce que dans ce cas, soit tu considères que tu as déportés le problème, soit tu considères que tu utilises une VM ...
Ce n'est pas pour rien qu'on parle de langage semi-interprété ou semi-compilé (c'est comme le verre à moitié plein, à moitié vide).
Ensuite les langages interprétés n'ont pas vérifications statiques du code dans sa globalité et de pré-transformation pour accélérer la transformation en code binaire à l'exécution. Ces étapes sont effectuées à chaque exécution du programme et perdues à la fin de celui-ci. Ce qui conduit à ce qu'une ligne de code soit toute pourrie mais jamais contrôler tant qu'elle n'est pas exécutée.
Ensuite en Java on est très adepte des librairies tierces, et ne pas avoir à les recompiler à chaque fois est une chose non négligeable.
En Java j'ai rarement ressenti un tel besoin qui d'ailleurs tend faire à confondre héritage et composition. Mais j'avoue en avoir parfois ressenti le besoin.
Par ailleurs, il y un pattern assez connu pour contourner le problème en utilisant la composition. Ensuite preuve de ce manque, Java a vu émergé les annotations et la programmation par aspet.
Il s'agit en fait d'injecter de l'appel à du code factorisé dans un coin directement dans les classes semi-compilées. Ce qui revient à automatiser le premier contournement dont je faisais mention.
Donc il existe bien un contournement, certes pas élégant à ce problème.
D'ailleurs, il serait intéressant de voir comment les autres langages qui ont fait le même choix s'en sortent.
Merci pour ce petit coursJ'aurais bien aimé que mes profs me présentent les choses de cette manière ; ils n'ont jamais évoqué le Liskov.
Si je résume bien, cela dit qu'un contrat fixé par un type est valable pour tous les sous-types ? Dommage et heureusement que la programmation par contrat (pré-condition/post-condition) n'existe pas vraiment en Java ... Ca m'arrive de contourer ce principeMais c'est peut-etre à cause de code mal fichu à la base ...
Tout est affaire de pragmatisme et plus particulièrement d'optimisation dans ce cas. Et ce n'est pas pour rien qu'ils ont leur wrapper.
J'attendrai ta confirmation sur mon interprétation du LSP.
Tu as un concet de fonction trigo, non ? Donc d'un point de vue OO, un type "Fonction trigonométrique".
Oui, via son wrapper Integer.
Le choix d'utiliser Object (notemment pour les méthodes get et delete) sont là pour éviter les cast qui ne sont pas nécessaires ; et qui peuvent être couteux (type checking) si on sait d'un objet tel qu'une map peut être souvent sollicité dans un programme. Encore et toujours affaire de pragmatisme.
Si tu prends le cas d'une Reference Map, elle permet de créer une association non pas entre des clés mais bel et bien des instances (comprendre que la clé c'est l'adresse mémoire). Dans ce cas tu te retrouves bien avec des clés totalement hétérogène. Le but de toutes façons n'est pas d'avoir des clés hétérogènes mais de traiter les Hash map (quelque soit la nature de leurs clés) de manière unique. De la généricité quoi.
J'avoue que les generics c'est un peu bidon mais pour te rassurer il existe les "checked collections". Et les "templates" ne sont pas la panacée car chaque "type" regénère du binaire supplémentaire. Et une question, deux "type" d'un même template avec les mêmes paramètres génériques sont-ils substituables ? En gros est-ce que deux déclarations de List d'entier sont substituables ? Si oui, est-ce toujours vrai pour une Liste de voiture et une liste de véhicule ?
Concernant la vérification à la compilation elle n'est valable que si tes listes sont bien spécifiques mais dès que tu en veux des génériques ... T'as le même problème.
Pourquoi ne pas le faire si c'est nécessaire ?
Si je prends une classe assez con : les ensembles. Ton idée ca serait de faire une classe SetElement ? Idem pour les clés d'une map avec MapKey ? Dans ce cas, je pense que finalement Java n'a pas tant de wrapper que ça ...
Bah s'ils ont pas de racine commune tu te retrouves ni plus, ni moins qu'avec des void* ! Mais sans comportement commun.
Pas de soucisC'est juste que je suis pleinement conscient que ma manière de m'exprimer est agressive. Mais il faudrait plutôt voir toutes mes phrases avec des points d'interrogations ;-)
Je suis un développeur C++ contrarié et je suis preneur d'un point de vue honnête, complet, sérieux sur ce langage qui me semble bien mieux que Java mais dont hélàs les opportunités sont plus réduites et que mon parcours professionnel témoigne énormément en ce sens (un peu plus d'un an en Cobol et environ 3 en Java).
Partager