IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Java, un bon choix pour mes besoins ?


Sujet :

Java

  1. #21
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Si on part du principe que tous les attributs initialisés dans un constructeur doivent être placé dans un pointeur intelligent, alors beaucoup de pointeurs nus devront être transformés en pointeur intelligent non ?
    Je pense qu'il faudrait améliorer le système des pointeurs et constructeurs pour les rendre plus safe, utiliser un moyen détourné qui alourdit la syntaxe (pointeur intelligent), sous prétexte peut-être que cela risquerait autrement d'impacter négativement les performances... Je ne sais pas, il faut juger le pour et le contre, trouver un moyen d'optimiser cet ensemble.
    Oui, mais en C++ on choisi où l'on à besoin de créer ses objets (pile ou tas). On peut souvent utiliser la pile (sans new, donc sans possibilité de fuite mémoire).
    Mais de manière générale oui, une classe gérant des ressources qu'elle alloue sur la pile (avec un new donc) utilisera des pointeurs intelligents.
    Le coût d'un std::unique_ptr est nul : aucun impact sur les performance par rapport à un pointeur nu.
    Un std::shared_ptr par contre à un coût : le comptage de référence, c'est pas gratuit. Après que ce coût soit négligeable ou pas et dépend vraiment du cas d'utilisation.

    Personnellement ça ne me dérange pas les new dans un constructeur, même sans pointeur intelligent : si le new échoue et throw (il éxiste une version nothrow d'ailleurs ), le programme ne pourra de toute façon plus continuer par manque de mémoire, donc risque de fuite mémoire ou pas, c'est la merde.


    Citation Envoyé par Gugelhupf Voir le message
    C'est un peut comme le RAII, qu'est-ce qui m'assure que mon destructeur sera appelé ?
    La norme

    Citation Envoyé par Gugelhupf Voir le message
    La signature de la méthode parente est censée indiquer toutes les exceptions qu'elle est susceptible de lancer, ainsi que ses implémentations.
    L’implémentation, peut lancer moins d'exception, mais pas d'exception supplémentaire.
    Si durant la phase de développement tu t’aperçois du fait que durant la phase de conception tu as oublié d'ajouter une exception dans la signature de la méthode parente, il est possible d'ajouter cet exception dans la signature de la méthode parente. Ça ne "cassera" pas le programme.
    Les indications de throw ne sont donc pas obligatoires ?
    Je trouve d'ailleurs l'approche de C++ plus propre la dessus (depuis C++11) : au lieu d'indiquer quelles exceptions une fonction peut lancer, on indique qu'une fonction ne peut en aucun cas lancer d'exceptions.

  2. #22
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Juste quelques petites remarques en passant :

    Citation Envoyé par Iradrille Voir le message
    Venant du C++, les generics (Java ou C#) c'est vraiment le gros point noir de ces langages, le fait de devoir définir des interfaces limite vraiment l'utilisation.
    (En tout cas, c'est ce qui me dérange le plus).
    Il n'y a aucune obligation de définir des interfaces pour utiliser les Generics...

    Citation Envoyé par Gugelhupf Voir le message
    Ouvrir en lecture et ouverture en même temps, non je ne crois pas, d'ailleurs, si cette possibilité n'est pas fournit, c'est qu'il doit forcément y avoir une raison.
    Il est tout à fait possible d'ouvrir un fichier à la fois en lecture ET en écriture, via la classe RandomAccessFile disponible depuis Java 1.0 !


    Citation Envoyé par Iradrille Voir le message
    Les indications de throw ne sont donc pas obligatoires ?
    Cela dépend.
    Il y a deux types d'exceptions en Java.

    Par défaut les exceptions sont "checked", et une méthode qui peut renvoyer une telle exception doit impérativement l'indiquer via throws dans sa signature, ce qui obligera à la traiter lorsqu'on utilisera la méthode.

    Mais il existe également des exceptions "unchecked" (RuntimeException, Error) qui n'ont pas besoin d'être déclarée ni traitée.
    C'est toujours bien de les déclarer (pour la doc), mais cela n'aura aucun impact.


    a++

  3. #23
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Il n'y a aucune obligation de définir des interfaces pour utiliser les Generics...
    J'ai toujours cru qu'il n'y avait pas de duck typing en Java.
    Quelque chose comme ça est possible ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    template <class T>
    struct CompareParFoo {
        bool operator()(T lhs, T rhs) const {
           return lhs.foo() < rhs.foo();
        }
    };
     
    template <class T, class Predicat>
    T min(T lhs, T rhs, Predicat pred) {
        return pred(lhs, rhs) ? lhs : rhs;
    }
     
    struct UnType {
       int val;
       int foo() const { return val; }
    };
     
    UnType a{1}, b{2};
    auto min_ab = min(a, b, CompareParFoo());
    edit : Ça me fait penser à un autre défaut de Java : le "tout-objet" qui empêche de définir des fonctions libres.
    Dès que je dois coder en Java / C#, je me retrouve avec une classe non destinée à être instanciée (statique en C#, souvent avec un nom stupide type "FreeFunctions") qui ne contient que des fonctions statiques (que j'aurais déclarées comme fonctions libres en C++).
    Ça indique un problème de conception ? Ou c'est quelque chose de commun ?

  4. #24
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 740
    Points
    3 740
    Billets dans le blog
    12
    Par défaut
    Je vous trouve un peu dur concernant la syntaxe de Java.
    Rien n'empêche en C++ d'abuser du mot-clé const dans le prototype d'une fonction (au moins deux par pointeur, pour chaque paramètre et type de retour), d'utiliser des macros, ou faire un goto. Un mal pour un bien, en Java vous ne pourrez pas.


    Chaque langage possède sa philosophie, et de nouvelle naissent lorsqu'un nouveau besoin apparait (je pense surtout à des langages comme Dart ou Typescript).
    Si vous estimez que l'approche des exceptions ou autre fonctionnalité en Java est mauvaise, ou que vous préférez adopter une autre manière, rien ne vous en empêche. Vous pouvez par exemple écrire vos API (en utilisant JNI), avec des fonctions systèmes en C, pour ensuite les utiliser en Java de manière transparente. Plus de try/catch.
    Ce n'était amha pas quelque chose d'impossible à faire en Java, mais cela ne doit surement pas faire parti de la philosophie.


    Le C++ a donné naissance à la plupart des langages OO que nous utilisons, mais sans les langages comme Smalltalk ou C, il n'en serait pas ainsi.
    Les mot-clés comme final et override (dont je parle juste au dessus), ou d'autres concepts comme les templates, et depuis récemment les lambdas, le range-based for loop et délégation du constructeur ne sont pas apparu par magie en C++. Il suffit de voir la syntaxe, et leur période d'apparition.
    Ce n'est pas par hasard non plus que les concepteurs de Java voie d'un bon oeil la gestion de mémoire en C11 et C++11 pour l'adapter au Java (voir article).
    Chacun pique une idée à droite à gauche.
    Si demain la syntaxe des exceptions se retrouvaient simplifié, parce que je ne trouve pas qu'ils le sont (et consommant moins de ressource au passage), et que Bjarne ou autre personnalité incitait les développeurs à l'adopter, je suis sur que vous changerez d'idée ^^. Mais bon pour une moi une exception n'est pas quelque chose qu'on devrait utiliser rarement, là c'est comme si vous demandiez à un développeur Assembleur de ne pas faire de goto/jump.


    Merci pour l'info adiGuba Par contre je n'ai pas l'impression que ce soit une classe très utilisée en Java


    EDIT :
    @Iradrille
    Ça me fait penser à un autre défaut de Java : le "tout-objet" qui empêche de définir des fonctions libres.
    Il y a les classes anonymes, et depuis Java 8, les lambdas.
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  5. #25
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Je vous trouve un peu dur concernant la syntaxe de Java.
    Énormément de dev C++ (moi y compris) feront des remarques sur les exceptions et l'héritage.
    Tout simplement parce que ce n'est pas dans la philosophie du C++ de les utiliser autant.

    Un exemple simple, si j'utilise une fonction qui peut lancer une exception si les arguments sont invalides, mais que je sais que les arguments sont valides (codés en dur, ou vérification de validité déjà faite), bah j'ai pas envie de me faire ch*** avec un try-catch.

    Citation Envoyé par Gugelhupf Voir le message
    Rien n'empêche en C++ d'abuser du mot-clé const dans le prototype d'une fonction (au moins deux par pointeur, pour chaque paramètre et type de retour), d'utiliser des macros, ou faire un goto. Un mal pour un bien, en Java vous ne pourrez pas.
    De la même manière on peut abuser du mot clef final pour les paramètres d'une fonction.

    Mais si on va par là, il est évident que si on cherche à faire du code crade, on y arrivera, et ce, quelque soit le langage.

    Citation Envoyé par Gugelhupf Voir le message
    Il y a les classes anonymes, et depuis Java 8, les lambdas.
    Dac, je connaissais pas.

  6. #26
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Rien n'empêche en C++ d'abuser du mot-clé const dans le prototype d'une fonction (au moins deux par pointeur, pour chaque paramètre et type de retour)
    Abuser de const ?

    d'utiliser des macros, ou faire un goto. Un mal pour un bien, en Java vous ne pourrez pas.
    goto n'a effectivement pas de sens en Java puisque vous utiliserez des exceptions à la place et que vous ne pouvez pas faire des programmes avec des contrainte temporelles très fortes dans quel cas on passera soit vers du C++, du C ou directement de l'assembleur.

    Pour les macro, il est vrai qu'avec les fonctions-inlines, les templates/generics et les enum/constantes, elles sont un peu moins utilisée.
    Par contre, je ne pense pas qu'en Java, vous puissiez passer des options au "compilateur" qui changeraient le comportement du code ce qui est possible grâce aux macro (debug/release, utiliser telle ou telle bibliothèque, intégrer telle ou telle fonctionnalité, etc.).

    Chacun pique une idée à droite à gauche.
    Et alors ?


    @Gugelhupf : on ne dit pas "pouah ! Le Java c'est nul !".
    J'ai juste dit que je ne portais pas le Java dans mon cœur, ce qui est tout à fait mon droit, et comme tu voulais savoir pourquoi je t'ai répondu et on a commencé à débattre autours de ces points.
    Mais là j'ai l'impression que tu commences à te placer dans une logique "il faut défendre Java, j'enfile mon armure pour rejoindre la croisade", alors qu'on ne l'attaque pas.

    Bref, je pense qu'il vaut mieux s'arrêter là, sinon on va partir en guerre de religion.

  7. #27
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Abuser de const ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int const * const * const * const fonctionRelou(int const * const * const * const arg) {
    	return arg;
    }
    Ce n'est pas de l'abus en soit si c'est justifié, mais ça peut devenir lourd.

  8. #28
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 740
    Points
    3 740
    Billets dans le blog
    12
    Par défaut
    Il y a un dév du nom shakal sur le SdZ qui a développé un jeu 3D du nom de Yildiz Online, avec un mélange de Java et C++, en se servant de OpenGL il me semble.
    Tu pourrais lui poser des questions peut-être
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  9. #29
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Citation Envoyé par Gugelhupf Voir le message
    Il y a un dév du nom shakal sur le SdZ qui a développé un jeu 3D du nom de Yildiz Online
    Je connais, il est aussi sur DVP : http://www.developpez.net/forums/d12...ueur-l-espace/

    avec un mélange de Java et C++, en se servant de OpenGL il me semble.
    Tu pourrais lui poser des questions peut-être
    Je n'avais pas vu qu'il mélangeais les deux, je vais essayer de regarder cela de plus près

  10. #30
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    J'ai toujours cru qu'il n'y avait pas de duck typing en Java.
    Non en effet il n'y a pas de duck typing en Java (en fait j'avais mal compris ton premier message).

    Après est-ce une mauvaise chose ? Je ne sais pas et la différence se joue à peu de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public <T extends Comparable<T>> T min(T value1, T value2) {
    	return (value1.compareTo(value2) >=0) ? value1 : value2;
    }
     
     
     
    class UnType implements Comparable<UnType> {
       int val;
       int foo() {
    	   return this.val;
       }
     
       @Override
       public int compareTo(UnType other) {
    	return Integer.compare(this.val, other.val);
       }
    }
    Perso j'ai tendance à largement préféré les typage fort à un typage implicite.
    Mais au final ce n'est juste qu'une question de syntaxe...


    Citation Envoyé par Iradrille Voir le message
    edit : Ça me fait penser à un autre défaut de Java : le "tout-objet" qui empêche de définir des fonctions libres.
    Dès que je dois coder en Java / C#, je me retrouve avec une classe non destinée à être instanciée (statique en C#, souvent avec un nom stupide type "FreeFunctions") qui ne contient que des fonctions statiques (que j'aurais déclarées comme fonctions libres en C++).
    Ça indique un problème de conception ? Ou c'est quelque chose de commun ?
    Non c'est commun.
    Souvent on utilise une classe dont le nom informe sur le type manipulé (par exemple les méthodes static manipulant des Date se trouveront dans la classe Dates).

    Ce n'est certainement pas parfait (et je n'ai pas vu de solution parfaite pour cela), mais je ne trouve pas cela pire que d'avoir des méthodes définies un peu partout...


    Citation Envoyé par Neckara Voir le message
    Par contre, je ne pense pas qu'en Java, vous puissiez passer des options au "compilateur" qui changeraient le comportement du code ce qui est possible grâce aux macro (debug/release, utiliser telle ou telle bibliothèque, intégrer telle ou telle fonctionnalité, etc.).
    C'est pourtant possible !
    Pas au compilateur javac, mais au compilateur JIT à l'exécution via l'option -D !
    Et oui il ne faut pas oublier que toutes les optimisations du compilateur sont effectué par le compilateur JIT.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Main {
    	private static final boolean IS_DEBUG_ENABLED = Boolean.getBoolean("DEBUG");
     
    	public static void main(String[] args) {
    		System.out.println("Hello");
    		if (IS_DEBUG_ENABLED) {
    			System.out.println("World");
    		}
    	}
    }
    java Main affichera "Hello"
    java -DDEBUG=true Main affichera "Hello World"

    Si tout le code sera bien stocké dans le fichier *.class avec le passage par le compilateur javac, il sera toutefois bien supprimé à l'exécution si le flag est absent.


    Citation Envoyé par Neckara Voir le message
    Bref, je pense qu'il vaut mieux s'arrêter là, sinon on va partir en guerre de religion.
    Java et C++ adapte tout deux une approche très différente de la POO... et il peut être difficile de passer de l'un à l'autre lorsqu'on est habitué à travailler avec l'un.

    Mais ce n'est pas pour autant qu'il y en a un meilleur que l'autre.
    Si tu prend les fonctionnalités différentes une à une, tout est ouvert à discussion, et chaque solution est tout à fait viable (sinon ce ne serait pas deux langages aussi utilisés).
    Chaque choix a ses raisons, ses points forts et ses défauts... le tout suivant l'historique du langage.

    Le problème c'est lorsqu'on passe de l'un à l'autre, on à tendance à apporter toute son expérience et ses habitudes avec soit (volontairement ou pas).
    Bref de faire du C++ en Java, ou de faire du Java en C++. Et là ce n'est généralement vraiment pas adapté !


    a++

  11. #31
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Mais ce n'est pas pour autant qu'il y en a un meilleur que l'autre.
    Je n'ai jamais dit cela, juste que je ne portais pas Java dans mon cœur.

    Chaque choix a ses raisons, ses points forts et ses défauts... le tout suivant l'historique du langage.
    Ce qui ne nous empêche pas d'avoir notre propre avis concernant ces choix.
    C'est d'ailleurs grâce à cela qu'on peut comprendre un peu mieux la philosophie du langage et comprendre ses nuances.

  12. #32
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Je n'ai jamais dit cela, juste que je ne portais pas Java dans mon cœur.
    Je ne te visais pas, ni personne en particulier (désolé si tu t'es senti visé ce n'était pas du tout le cas).

    En fait je te rejoignais juste sur le fait que ce genre de discussion part vite "en guerre de religion", justement à cause de préférence personnelle...
    Je suis juste intervenu sur un ou deux erreurs qu'il me semblait avoir vu.


    Ce genre de discussion peut être intéressante si on compare vraiment les fonctionnalités en analysant les qualités et leurs défauts, sans émettre de jugement de valeurs personnel... mais ce n'est pas évident !


    a++

  13. #33
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Non en effet il n'y a pas de duck typing en Java (en fait j'avais mal compris ton premier message).

    Après est-ce une mauvaise chose ? Je ne sais pas et la différence se joue à peu de chose
    Ça à ses avantages et ses inconvénients.
    Ça évite de se taper des centaines de lignes d'erreurs pour une faute de frappe (comment ça se fait que personne n'en ai parlé ? ), mais ça crée de l'héritage artificiel et relativement inutile.

    Après je comprend bien que des templates (type C++) en Java sont impossibles du fait que le Java permette la "création" de nouveaux type durant l’exécution (chargement dynamique de .class par exemple), ce qui rend impossible le duck typing, il faut une interface commune pour s'assurer que le type passé à une classe / méthode template soit valide.

    D'ailleurs si j'ai bien compris le système de "concept" qui devrait arriver avec C++14, ça se rapproche un peu de ce que fait Java : imposer des contraintes précises sur le type template, mais avec une différence : les contraintes ne seront pas garanties via l'héritage. (Toujours pareil, les templates sont résolus lors de la compilation en C++, pas besoin d'interface commune).

  14. #34
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Ça à ses avantages et ses inconvénients.
    Ça évite de se taper des centaines de lignes d'erreurs pour une faute de frappe (comment ça se fait que personne n'en ai parlé ? ), mais ça crée de l'héritage artificiel et relativement inutile.
    Je n'ai pas l'habitude des Templates de C++, mais avec les Generics on a pas de "centaines de lignes d'erreurs pour une faute de frappe".

    Par contre il est vrai que certaines erreurs sont difficilement compréhensible et que cela peut ne pas être très clair du tout à comprendre.

    Citation Envoyé par Iradrille Voir le message
    Après je comprend bien que des templates (type C++) en Java sont impossibles du fait que le Java permette la "création" de nouveaux type durant l’exécution (chargement dynamique de .class par exemple), ce qui rend impossible le duck typing, il faut une interface commune pour s'assurer que le type passé à une classe / méthode template soit valide.
    Je ne pense pas que cela soit techniquement impossible.
    C'est plutôt une question de philosophie : en Java on fait cela en utilisant une interface explicitement, c'est tout.

    Il n'y a pas de raison de vouloir le faire différemment.


    Citation Envoyé par Iradrille Voir le message
    D'ailleurs si j'ai bien compris le système de "concept" qui devrait arriver avec C++14, ça se rapproche un peu de ce que fait Java : imposer des contraintes précises sur le type template, mais avec une différence : les contraintes ne seront pas garanties via l'héritage. (Toujours pareil, les templates sont résolus lors de la compilation en C++, pas besoin d'interface commune).
    Je dirais que cela montre une approche différente de la POO.
    Contrairement à C++, Java est très axé sur l'héritage et les méthodes virtuelles, avec une pelletée d'interface décrivant plusieurs comportements, donc c'est tout naturellement que ceci est utilisé pour les Generics et d'autres choses (comme les lambda dans Java 8).

    A l'inverse en C++ on s'orientera plus vers la présence (ou non) de méthodes spécifiques pour décrire un comportement, d'où le duck typing entre autres...



    a++

  15. #35
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Je n'ai pas l'habitude des Templates de C++, mais avec les Generics on a pas de "centaines de lignes d'erreurs pour une faute de frappe".

    Par contre il est vrai que certaines erreurs sont difficilement compréhensible et que cela peut ne pas être très clair du tout à comprendre.
    Je parlais bien évidement des erreurs en C++.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <set>
     
    struct Foo { }; // opérateur< manquant.
     
    int main() {
    	std::set<Foo> test;
    	test.insert(Foo());
    	return 0;
    }
    Donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xstddef(180): error C2676: binary '<' : 'const Foo' does not define this operator or a conversion to a type acceptable to the predefined operator
    1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xstddef(179) : while compiling class template member function 'bool std::less<_Kty>::operator ()(const _Ty &,const _Ty &) const'
    1>          with
    1>          [
    1>              _Kty=Foo
    1>  ,            _Ty=Foo
    1>          ]
    1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xtree(1792) : see reference to function template instantiation 'bool std::less<_Kty>::operator ()(const _Ty &,const _Ty &) const' being compiled
    1>          with
    1>          [
    1>              _Kty=Foo
    1>  ,            _Ty=Foo
    1>          ]
    1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\type_traits(743) : see reference to class template instantiation 'std::less<_Kty>' being compiled
    1>          with
    1>          [
    1>              _Kty=Foo
    1>          ]
    1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xtree(1028) : see reference to class template instantiation 'std::is_empty<std::less<_Kty>>' being compiled
    1>          with
    1>          [
    1>              _Kty=Foo
    1>          ]
    1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\set(44) : see reference to class template instantiation 'std::_Tree<std::_Tset_traits<_Kty,_Pr,_Alloc,false>>' being compiled
    1>          with
    1>          [
    1>              _Kty=Foo
    1>  ,            _Pr=std::less<Foo>
    1>  ,            _Alloc=std::allocator<Foo>
    1>          ]
    1>          main.cpp(6) : see reference to class template instantiation 'std::set<Foo,std::less<_Kty>,std::allocator<_Kty>>' being compiled
    1>          with
    1>          [
    1>              _Kty=Foo
    1>          ]
    Ça reste ici relativement explicite (voir la première ligne de l'erreur), mais c'est affreusement long, et c'est rare d'avoir une erreur aussi claire avec un problème de template.

  16. #36
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Les messages d'erreurs de compilations non-explicites ne sont pas intrinsèque au langage mais au compilateur utilisé.

    En C++ par exemple, Clang a la réputation de donner des messages d'erreurs plus explicites.

  17. #37
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Si le code est portable, peut-être à l'exception de quelques petites erreurs, il n'y a pas de raison.
    Pour l'instant, avant de casser du code c++ open source avec mes vieux reflexes de Javateux, je me contente de jouer avec les makefiles. Et quand je parlais des différences qui font qu'un code compile ou non, j'ai juste remarqué que certains headers sont importés ou non selon le compilateur. Par exemple, j'ai vu plusieurs fois du code qui ne compile pas avec MinGW parce que <sys/types.h> n'est pas importé mais qui compile avec gcc (surement parce qu'il est inclus ailleurs). Et ca, du point de vue du developpeur, j'aurais aimé ne pas avoir à m'en soucier. Si un code compile avec MinGW, je m'attends à ce qu'il compile avec n'importe quel compilateur qui respecte la meme norme. Hors, ce n'est pas le cas.

    Citation Envoyé par Neckara Voir le message
    Soit tu regardes du code très sale, ce qui est un très mauvais exemple, soit tu regardes des fichiers de bibliothèques standard ou autre qui sont en effet imbuvables.
    Comme je l'ai dit, je joue avec les makefiles donc je suis amené à regarder pourquoi j'ai des erreurs de compilation différentes selon les compilateurs. Et ca vient souvent des bibliotheques standard. Et je confirme que c'est imbuvable

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/04/2013, 11h04
  2. Réponses: 58
    Dernier message: 29/10/2010, 13h35
  3. Faire le bon choix pour ?
    Par Benew dans le forum Débuter
    Réponses: 1
    Dernier message: 07/04/2008, 22h02
  4. Quel écran pour mes besoins?
    Par virgul dans le forum Périphériques
    Réponses: 11
    Dernier message: 26/04/2006, 16h44
  5. Serveur FTP - Lequel choisir pour mes besoins
    Par etumed dans le forum Réseau
    Réponses: 3
    Dernier message: 19/03/2006, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo