Aller au contenu

Introduction décente à l'orienté objet ?


Yozz

Messages recommandés

Hmmm, mais c'est pas vraiment du PHP, t'utilises un framework, donc forcement c'est plus concis: il y a tout le code qui provient de l'import et qu'on ne voit pas.

 

Et puis la concision c'est pas tout dans la vie. C'est toujours bon de faire plus avec moins, mais ca doit pas être l'unique critère pour choisir un langage.

 

Mon exemple en PHP n'utilise pas de framework, ni d'import mais uniquement des fonctions basiques de la « bibliothèque standard ». Le tableau associatif PHP est l’élément central du langage qui n'a pas d'équivalent aussi pratique en Java.

 

@Pankkake : ton dernier programme ne répond pas à la question ? La sortie n'est pas triée.

 

contents = contents.split()
print [(word, contents.count(word)) for word in set(contents)]
Lien vers le commentaire

Mon exemple en PHP n'utilise pas de framework, ni d'import mais uniquement des fonctions basiques de la « bibliothèque standard ». Le tableau associatif PHP est l’élément central du langage qui n'a pas d'équivalent aussi pratique en Java.

 

C'est exact, ils auraient pu exposer la méthode dans Map cela dit, c'est trivial à ajouter (meme si un peu verbeux à la définition...)

 

public class SortedMapInverter<KeyType, ValueType extends Comparable<ValueType>> {

    public List<Map.Entry<KeyType, ValueType>> internalsort(
            Map<KeyType, ValueType> input) {
        ArrayList<Map.Entry<KeyType, ValueType>> list = new ArrayList<Map.Entry<KeyType, ValueType>>(
                input.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<KeyType, ValueType>>() {
            @Override
            public int compare(Entry<KeyType, ValueType> e1,
                    Entry<KeyType, ValueType> e2) {
                return e1.getValue().compareTo(e2.getValue());
            }
        });
        return list;
    }

}

 

En scala, ou en groovy (ou en C# d'ailleurs), ça se rajoute directement à Map pour plus de lisibilité, Java est le language de bas niveau, pour coder la partie "systeme" ou on souhaite savoir ce qui se passe, c'est le C de la JVM.

 

Disclaimer: code fait a la rache, non testé, ne pas livrer en production, domaine public...

 

Edit: si je le faisait en prod, ça serait un functor qui implémenterai com.google.common.base.Function

Lien vers le commentaire

Soit, un peu dans la continuité du topic : une fois que l'on s'est déjà tapé une introduction plus que décente à l'OOP et que l'on veut commencer à se perfectionner, qu'est-ce qu'on lit ?

 

Le meilleur, comme ça a déjà été dit, c'est la pratique. En ce qui me concerne, j'ai squatté les forums de Developpez. Au début j'ai posé des questions. Ensuite j'ai vu que je pouvais répondre à certaines, et plus je pouvais répondre, plus je lisais les questions et plus je répondais. Au début tu te fais rattraper par quelques membres expérimentés. Et à force de lire leurs réponses, tu commences à les assimiler et à les ressortir au besoin.

Lien vers le commentaire

@Pankkake : ton dernier programme ne répond pas à la question ? La sortie n'est pas triée.

Oups, en effet. Faut rajouter le sorted() de l'autre exemple. On peut rester à deux lignes mais ça devient encore pire !

Le meilleur, comme ça a déjà été dit, c'est la pratique. En ce qui me concerne, j'ai squatté les forums de Developpez.

Maintenant je conseillerai plutôt StackOverflow.
Lien vers le commentaire

C'est pas un framework, c'est la bibliothèque standard Python. On fait rarement un programme sans y placer un import (en comparaison le programme Java en a 6).

Quant aux nombres de lignes, oui ; le dernier exemple est court mais pas vraiment mieux que le premier.

 

 

 

Mon exemple en PHP n'utilise pas de framework, ni d'import mais uniquement des fonctions basiques de la « bibliothèque standard ». Le tableau associatif PHP est l’élément central du langage qui n'a pas d'équivalent aussi pratique en Java.

 

@Pankkake : ton dernier programme ne répond pas à la question ? La sortie n'est pas triée.

 



contents = contents.split()
print [(word, contents.count(word)) for word in set(contents)]

 

Laissez tomber: j'ai lu trop vite et j'ai confondu PHP avec Python   :online2long: 

Lien vers le commentaire

C'est exact, ils auraient pu exposer la méthode dans Map cela dit, c'est trivial à ajouter (meme si un peu verbeux à la définition...)

public class SortedMapInverter<KeyType, ValueType extends Comparable<ValueType>> {

    public List<Map.Entry<KeyType, ValueType>> internalsort(
            Map<KeyType, ValueType> input) {
        ArrayList<Map.Entry<KeyType, ValueType>> list = new ArrayList<Map.Entry<KeyType, ValueType>>(
                input.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<KeyType, ValueType>>() {
            @Override
            public int compare(Entry<KeyType, ValueType> e1,
                    Entry<KeyType, ValueType> e2) {
                return e1.getValue().compareTo(e2.getValue());
            }
        });
        return list;
    }

}
Java a indubitablement un côté terrible.

À part ça le tableau associatif en PHP bénéficie aussi du copy-on-write, ce qui le rend utilisable à la place de petits objets garnis de getters. Java ne peut pas fournir l'équivalent, ce ne serait même pas recommandé. Pour info, j'avais tenté une analyse ici.

Lien vers le commentaire

Java a indubitablement un côté terrible.

  

C'est la solution la plus canonique, ce n'est probablement pas comme ça que je le ferais dans la rue, mais pour que je me demande comment je le ferais moi même, il faudrait un vrai besoin, avec des informations de volumétrie, de temps de réponse, de budget, etc... :D

 

Lien vers le commentaire

À part ça le tableau associatif en PHP bénéficie aussi du copy-on-write, ce qui le rend utilisable à la place de petits objets garnis de getters. Java ne peut pas fournir l'équivalent, ce ne serait même pas recommandé. Pour info, j'avais tenté une analyse ici.

 

 

Euu, les concurrent collections de doug lea (dans java.utils.concurrent), ou les collections scala (et pour les mêmes raisons) sont COW, pour des grosses collections avec un gros volume de lecture et un petit volume d'écriture, en multi-core, c'est fortement recommandé au contraire.

 

Maintenant, dans certains cas, je préfère une copie tout court qu’une copy on write, pour profiter au maximum de la localité de cache sans peter le pipeline et le L2 et attendre des précieuses microsecondes que l’ami QPI fasse son taf a travers 40 cœurs...

 

De façon générale, dans une architecture « classique » trois tiers sans caching ou avec un caching assez simple, ou l’intelligence est globalement dans la base de donnée, ou le working set est soit inexistant, soit gigantesque (et ailleurs que dans le frontal :D), la puissance de la JVM ne sers strictement à rien et un simple moteur PHP à un cout d’entrée moindre.

 

Ce qu’il faut comprendre c’est que Java est le langage système de la JVM, c’est fait pour remplacer le C, pas PHP ou Python, maintenant au delà d’un certain point, si on ne sais pas comment marche toute la stack, du haut en bas, on fait de la merde, quel que soit le langage et la plateforme, si on sais comment elle marche, certaines plateformes sont plus chiantes que d’autres, java est justement d’assez bas niveau pour aller chatouiller le métal tout en ayant les abstractions de haut niveau nécessaires pour faire des grosses applis.

 

Et pitié, pas de FUD des années 90 sur la vitesse du code généré, hotspot génère du langage machine de très bonne facture et il est extrêmement difficile de faire mieux (ceux qui font mieux sont en général assez vétérans pour savoir à quel point faire mieux est horriblement couteux en dette technique, et ne le font que très rarement !)

 

La grosse valeur de la stack Whatever/PHP/Mysql, c’est le cout initial quasi-nul d’une nouvelle application, la possibilité de mutualiser massivement des milliers d’applications sur du hardware cheap, le niveau d’expérience (relativement) moindre nécéssaire pour l’utiliser pour livrer du web qui marche et enfin (et a terme, je dirait surtout…) la plus grande compétence de la communauté sur les technologies web que la communauté java dans laquelle même les bons développeurs sont rarement opérationnels dans le reste de la stack web (sans parler de l’immense foule des zombies pisseurs de code copié/collé et leur armée de réserve de bengalériens…)

Lien vers le commentaire

Et pitié, pas de FUD des années 90 sur la vitesse du code généré, hotspot génère du langage machine de très bonne facture et il est extrêmement difficile de faire mieux (ceux qui font mieux sont en général assez vétérans pour savoir à quel point faire mieux est horriblement couteux en dette technique, et ne le font que très rarement !)

 

Oué et quand on parle de faire mieux, il s'agit pas de se dire pif paf je vais le faire en C et ça va poutrer. De mon expérience et des gens que je connais ayant dû le faire, ça peut impliquer de passer par des routines en assembleur (en 2013 quelle horreur).

Lien vers le commentaire

Oué et quand on parle de faire mieux, il s'agit pas de se dire pif paf je vais le faire en C et ça va poutrer. De mon expérience et des gens que je connais ayant dû le faire, ça peut impliquer de passer par des routines en assembleur.

 

Et surtout de connaitre la plateforme exacte d'execution, pas "ouais, c'est un x86 quoi !", quelle architecture physique, quelle longueur de pipeline, et en multithread, quelle topologie de bus, numa or not numa, etc...

Lien vers le commentaire

Euu, les concurrent collections de doug lea (dans java.utils.concurrent), ou les collections scala (et pour les mêmes raisons) sont COW, pour des grosses collections avec un gros volume de lecture et un petit volume d'écriture, en multi-core, c'est fortement recommandé au contraire.

Ah ? J'ignorais.

Et pitié, pas de FUD des années 90 sur la vitesse du code généré, hotspot génère du langage machine de très bonne facture et il est extrêmement difficile de faire mieux (ceux qui font mieux sont en général assez vétérans pour savoir à quel point faire mieux est horriblement couteux en dette technique, et ne le font que très rarement !)

De toute manière ma comparaison était avec PHP qui possède aussi un code machine exécuté par une machine virtuelle.
Lien vers le commentaire

De toute manière ma comparaison était avec PHP qui possède aussi un code machine exécuté par une machine virtuelle.

 

 

Justement, c'est incomparable, non pas à cause du langage (rien n'interdit d'utiliser des techniques de JIT spéculatif transactionnel sur du PHP), mais à cause de l'implémentation, la VM PHP "classique" est un simple interpréteur.

 

Il serait plus correct de comparer HHVM avec la JVM que la VM PHP classique, un interpréteur naïf n'est pas du tout dans la même cour.

Lien vers le commentaire

Mon sujet est la manière de penser objets hein. On peut comparer PHP avec Java, non pas à cause de l'implémentation, mais parce que des programmeurs Java sont parfois amenés à coder en PHP (l'inverse est je pense plus rare).

Sur le plan technique des machines virtuelles je n'y connais pas grand chose alors tu as surement raison.

Lien vers le commentaire

Justement, c'est incomparable, non pas à cause du langage (rien n'interdit d'utiliser des techniques de JIT spéculatif transactionnel sur du PHP), mais à cause de l'implémentation, la VM PHP "classique" est un simple interpréteur.

 

Il serait plus correct de comparer HHVM avec la JVM que la VM PHP classique, un interpréteur naïf n'est pas du tout dans la même cour.

 

Tiens je connaissais pas hhvm, ça m'a l'air très amusant, sûrement que ça doit faire moins de segfault que zend php.

Je serais de chez Zend j'aurais un peu la honte quand même. Les langages développés par le top 5  (Microsoft Oracle Facebook Google IBM ) c'est quand même un peu plus impressionnant.

(Le seul gros absent c'est Apple, ils développaient pas une vm top pour Ruby ? )

Lien vers le commentaire

Apple, ceux qui ont crée une plateforme ou tu avais le droit de déployer un binaire à condition qu'il ai été compilé avec leurs outils depuis leur langage et qu'il ne puisse pas  manipuler de code "mobile" ? Nahh

Lien vers le commentaire

Apple, ceux qui ont crée une plateforme ou tu avais le droit de déployer un binaire à condition qu'il ai été compilé avec leurs outils depuis leur langage et qu'il ne puisse pas  manipuler de code "mobile" ? Nahh

 

zut mon ptit troll

 

Blague à part je pensais à ces langages qu'on peut utiliser pour autre chose qu'une bête application GUI.

Apple c'était intéressé à Ruby pour je ne sais quelle raison obscure, (il y avait pas un port de ruby vers llvm ?)

Lien vers le commentaire

Apple c'était intéressé à Ruby pour je ne sais quelle raison obscure, (il y avait pas un port de ruby vers llvm ?)

Parce que les gens qui font du Ruby (surtout On Rails) sont des hipsters, et donc des clients Apple.

C'est probablement un des rares projets libres où la plate-forme recommandée est Mac OS (alors que c'est pourtant assez peu pratique niveau installation).

Lien vers le commentaire

Parce que les gens qui font du Ruby (surtout On Rails) sont des hipsters, et donc des clients Apple.

C'est probablement un des rares projets libres où la plate-forme recommandée est Mac OS (alors que c'est pourtant assez peu pratique niveau installation).

 

Oui peut-être bien, sinon question installation, je connais rien de mieux que RVM. Même sous Ubuntu je l'utilisais quand je devais en faire.

J'ai cru comprendre qu'avec python 3.3, il y aurait un truc sensiblement équivalent, t'as des infos précises à ce sujet ?

Lien vers le commentaire

C'est pas encore tout à fait ça j'ai l'impression, RVM permet d'installer une autre version de ruby pour tester son code avec plein d'autres version.

Là j'ai l'impression que tu as encore besoin de l'installer via la distribution, peut-être que je me trompe.

Dans le help, il y a seulement un flag -p pour donner un autre binaire python, mais ça fera pas télécharger/compiler/installer une autre version de python.

Par contre comme je l'avais utiliser, je crois que je pouvais nommer un environnement, donc avoir plusieurs environnement 2.7 par exemple.

Ce qui est sympa si on veut tester différent module sur une même plateforme.

Lien vers le commentaire

Tiens je connaissais pas hhvm, ça m'a l'air très amusant, sûrement que ça doit faire moins de segfault que zend php.

Je serais de chez Zend j'aurais un peu la honte quand même.

Ils peuvent au contraire être fiers. PHP est un moteur de template devenu géant du Web. L'épisode de Facebook a au contraire prouvé que PHP tient la charge même sur des projets démesurés. La contribution de Facebook n'est pas une gifle.
Lien vers le commentaire

L'orienté objet ne repose pas sur un modèle de calcul comme c'est le cas pour les langages impératifs (machine de Turing), la programmation fonctionnelle (le lambda calcul), les algèbres de processus (le pi calcul, ccs) ou la programmation logique (les clauses de Horn). Bref ça tient plus d'une discipline de programmation que d'une manière de penser le calcul (un peu comme indenter son code et le commenter). C'est plutôt pas mal pour cadrer les idées et donner des résultats lisibles/compréhensibles (un peu comme les techniques de génie logiciel) mais scientifiquement ça se rapproche quand même pas mal du pipeau (la modularité c'est autre chose cf Ocaml et les foncteurs par exemple). Le coup de l'héritage c'est rigolo mais en pratique ça correspond pas vraiment à beaucoup d'applications (ce n'est pas une manière primitive de coder les choses).    Alors les langages où tout est objet etc. pour moi ça tient plus de la figure de style où on se tripote en croyant tutoyer la Vérité (avec un grand 'V').

 

C'était mon quart d'heure misanthrorientéobjet.

Lien vers le commentaire

L'orienté objet ne repose pas sur un modèle de calcul comme c'est le cas pour les langages impératifs (machine de Turing), la programmation fonctionnelle (le lambda calcul), les algèbres de processus (le pi calcul, ccs) ou la programmation logique (les clauses de Horn). Bref ça tient plus d'une discipline de programmation que d'une manière de penser le calcul (un peu comme indenter son code et le commenter). C'est plutôt pas mal pour cadrer les idées et donner des résultats lisibles/compréhensibles (un peu comme les techniques de génie logiciel) mais scientifiquement ça se rapproche quand même pas mal du pipeau (la modularité c'est autre chose cf Ocaml et les foncteurs par exemple). Le coup de l'héritage c'est rigolo mais en pratique ça correspond pas vraiment à beaucoup d'applications (ce n'est pas une manière primitive de coder les choses).    Alors les langages où tout est objet etc. pour moi ça tient plus de la figure de style où on se tripote en croyant tutoyer la Vérité (avec un grand 'V').

 

C'était mon quart d'heure misanthrorientéobjet.

 

Objectivement, +0.8, mais quand je suis face à un cultiste de l'objet, +1000.

Lien vers le commentaire

L'orienté objet ne repose pas sur un modèle de calcul comme c'est le cas pour les langages impératifs (machine de Turing), la programmation fonctionnelle (le lambda calcul), les algèbres de processus (le pi calcul, ccs) ou la programmation logique (les clauses de Horn). Bref ça tient plus d'une discipline de programmation que d'une manière de penser le calcul (un peu comme indenter son code et le commenter). C'est plutôt pas mal pour cadrer les idées et donner des résultats lisibles/compréhensibles (un peu comme les techniques de génie logiciel) mais scientifiquement ça se rapproche quand même pas mal du pipeau (la modularité c'est autre chose cf Ocaml et les foncteurs par exemple).

En programmation procédurale, le programmeur voit le microprocesseur avaler les instructions comme un pac-man dans son labyrinthe. En programmation à objets, le processeur disparait et le programmeur voit un réseau de boites noires qui interagissent. Le programmeur ne regarde l'intérieur que d'une boite à la fois, et voit alors les autres boites comme noires. C'est une manière de penser plus abstraite. Ou bien peut-être peut-on dire que la programmation à objets est la continuité de la programmation procédurale : plus on maitrise la technique et plus on ressent le besoin d'un niveau d'abstraction dans l'organisation du code.

Le coup de l'héritage c'est rigolo mais en pratique ça correspond pas vraiment à beaucoup d'applications (ce n'est pas une manière primitive de coder les choses).

Je crois aussi. Mais le mécanisme interfaces / implémentations ?

 

L'objet c'est surtout du sucre syntaxique.

Pas "sucre", "aide". La facilité a son rôle dans la production de la qualité. On peut utiliser la manière de penser objets avec un langage procédural, c'est juste pénible.

Lien vers le commentaire

Tiens, un exemple tout frais du taf, on m'apelle à l'aide sur une problematique d’une trivialité fonctionnelle assez elevée mais avec des soucis techniques:

 

Plein de XML pourri en entrée (plein== plusieurs Gb à traiter VITE), plein de XML pourri différent en sortie, un mécanisme de transformation XSLT qui vaut ce qu’il vaut, mais le mapping existe en XSLT et coute une fortune à migrer (et dans quoi, je n’en sais rien en plus…)

 

En tests, sur des quad cores, ça marche tout seul, c’est linéairement scalable.

 

En intégration, sur des Xeon E5, j’ai déjà du faire du taf de relativement bas niveau pour rendre le transformateur lock-free, ça scale quasi-linéairement jusqu’à 16 threads en exploitant l’hyperthreading, au delà ça chie un peu à cause de la bande passante mémoire…

 

En production, sur une machine neuve hors de prix, avec des Xeon E7 tous neufs, paf, c’est plus lent qu’en dev par thread (pas surprenant), mais c’est également moins scalable (arghh), résultat, la machine de dev a 6k€ va plus vite que la machine de prod a 40k€, youpy.

 

Quand on tombe la dessus, les couches d’abstractions, c’était nécessaire pour faire le traitement a un cout humain pas trop atroce, mais il faut être capable de visualiser la full stack pour comprendre ce qu’il se passe, la conception de l’informatique comme « les langages de haut niveau vont nous sauver » tape dans le dur mur du vrai métal dans lequel passe des ondes radios et du vrai silicium qui fait des trucs quantiques zarbis…

 

Je suis prêt à parier que l’immense majorité des gens qui se la racontent « le C c’est plus rapide que le Java, yeah» (sans parler des hipsters pour qui tout peut etre fait en ruby ou en php  :P) seraient juste paralysés devant ce problème sans se rendre compte que si on ne sais pas travailler sur des problèmes comme ça, on n’a même pas le début de la légitimité pour parler de performance…

 

Voila, c’était la section je raconte ma life et le java c’est pas que de l’informatique de gestion verbeuse et chiante…

Lien vers le commentaire

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...