• [^] # Re: Performance

    Posté par (site web personnel) . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 2.

    C'est en effet un exemple intéressant !

    Si tu veux un proxy parfait qui prend n'importe quel objet et remplace toutes les méthodes par une méthode wrappée qui ajoute du comportement, en effet, tu feras cela très facilement en python, plus difficilement que dans d'autres langages moins dynamiques.

    Si tu en veux faire un proxy de seulement une méthode / fonction. C'est assez simple (et tu peux le faire de façon assez générique) en C++ en créant un "functor" et en exploitant des templates variadics. Cependant le type de l'objet va changer (i.e. ce sera celui du Proxy) et donc il faudra que tes fonctions acceptants l'objet initial puisse accepter le nouveau. Si tes fonctions sont initialement "templatées", c'est faisable, sinon, c'est mort. Point de plus pour le langage dynamique.

    Un point où un langage statique s'en sort très bien ce serait le cas du proxy d'une fonction. En prog fonctionelle, on a très souvent tendance à passer des fonctions en argument d'autres fonctions. Le type d'une fonction étant défini juste par ses arguments / valeur de retour, si ton proxy à la même interface, cela passera sans problème.

    Par exemple, en Haskell, la fonction databaseQuery :: DbHandle -> Query -> IO DBResult qui prend une requete SQL et retourne un résultat, pourra être remplacée en ajoutant du log de la façon suivante:

    log f arg = do
     putStrLn "Avant la fonction"
     res <- f arg
     putStrLn "Après la fonction"
     pure res

    Ainsi, que tu passes dataBaseQuery handle ou log (dataBaseQuery handle) (i.e. ton proxy) en argument d'une autre fonction, le système de type sera satisfait.

    Cependant cela demande de penser son interface en avance et c'est donc moins souple. De mon expérience, je suis rarement limité par ce point, mais j'admet cette limitation.

    Merci de m'avoir fourni un exemple valide de l’intérêt d'un typage dynamique.