L'usage des classes en PHP est-il abusif ?
Un développeur allemand pense que oui

Les rubriques (actu, forums, tutos) de Développez
Tags
PHP
Réseaux sociaux


 Discussion forum

Le , par Benjamin Delespierre, Expert Confirmé Sénior
Les développeurs PHP sont-ils fonctionophobiques ? C'est en tout cas ce que pense un jeune développeur allemand. Sur sa page GitHub, nikic déplore la surdominance de l'OOP sur la programmation procédurale et dénonce la pratique selon lui trop répandue de programmation orientée classes.

D'après lui, cette réticence à utiliser des fonctions viendrait principalement du chargement automatique des classes, une fonctionnalité aujourd'hui largement répandue qui permet le chargement automatique de classes à la demande, ce qui est nativement impossible avec les fonctions. Les développeurs PHP seraient donc tentés d'exprimer leurs besoin au travers de méthodes, ce qui conduit à une approche orientée-classes moins naturelle que l'utilisation de fonctions.

nikic va jusqu'a dénoncer la pratique courante consitant à isoler chaque classe dans un fichier séparé et invite les développeurs à adopter l'approche Python où chaque fichier caractérise souvent un module et non une seule classe, permettant de ce fait l'usage naturel de fonctions.

Source : L'article sur le blog de nikic

Et vous ?

Trouvez-vous également que l'usage des classes est parfois abusif voire contre-productif ?
Préférez-vous l'approche procédurale ou objet ?
Comment structurez-vous votre application ?
Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de arkhamon arkhamon
http://www.developpez.com
Membre Expert
le 30/08/2012 9:57
Citation Envoyé par lilington  Voir le message
On se fait la bise?
t'apporte le vin et le fromage,moi les bouquins de POO et de procedural, c'est bon comme ca?

C'est pour moi l'invit ? Non je dis ça parce que les heures de ton post et le petit drapeau chinois me font penser que ca va pas être simple...
Avatar de lilington lilington
http://www.developpez.com
Membre Expert
le 30/08/2012 10:11
bon sinon j'arrive a comprendre le probleme des gens qui voient tout en objet et pensent meme que c'est pas possible autrement.
j'ai commencer le php sur le tas. c'etait un stage et on avait des trucs du genre:
Code :
$vehicule=Vehicle::getVehiculeByCItyID(12);
du coup on envoyait le resultat convertis en donnee json et l'affichage etait fait avec JS tranquillou.

je suis pas un bon web dev, donc quand j'ai voulu me faire une petites application pour gener des trucs a l'epoque et que je ne voulais pas utiliser de classe, j'ai mits du temps a comprendre tout le travail que faisait la class Vehicule et comment faire du simple procedural pour lire des donnnees dans la base et travailler avec surtout que je voulais pas de JS. Il me semblait impossible d'eviter les classes car j'ai appris php/*sql avec des classes.
bon a la fin j'ai laisse tomber pour faire une application python/gtk ca m'a pris une journee mais la au moins j'ai utiliser des classes quand j'en avais envie

mais je l'ai dis dans mon poste plus haut mon cerveau fonction dans le sens Bas_niveau ->Haut_niveau. je peux passer de l'assembleur a java mais pas de java a l'assembleur. je suis trop bete pour ca

Citation Envoyé par arkhamon  Voir le message
C'est pour moi l'invit ? Non je dis ça parce que les heures de ton post et le petit drapeau chinois me font penser que ca va pas être simple...

c'est surtout le drapeau qui pose probleme... et oui je suis a l'est mais t'en fait pas t'es pas complement a l'ouest non plus hein
Avatar de gene69 gene69
http://www.developpez.com
Membre Expert
le 30/08/2012 10:20
je suis d'accord sur un point, hors de l'orienté objet point de salut. Souvent j'ai écris des familles de méthodes avec des paramètres à n'en plus finir, pis un jour je me suis dit "bon on va lever le nez, prendre 10 minutes et utiliser $this, sortir les fonction des fonction (pour éviter quelles soit visible sur l'espace global ) utiliser des méthodes protégées et privées et le fichier a vu sa taille reduire de moitié.

Le procédural c'est bon pour les débutants. Il est suffisamment difficile de faire fonctionner une condition, une boucle et une variable et de savoir interpréter le message du compilateur php. On le voit tous les jours sur le forum.

quand au _() suffit pour traduire un texte en procédural, c'est faux. faites un site monolingue et posez les fichiers de de traductions, ajoutez les _() ça ne marchera pas. parce que ya toute une phase d'initialisation à faire pour gettext, qu'en objet on ferai dans le constructeur.
Avatar de gene69 gene69
http://www.developpez.com
Membre Expert
le 30/08/2012 10:32
l'avantage de l'objet c'est que c'est "la programmation de confiance", vous avez pas besoin de connaitre le fonctionnement d'une classe pour la dériver. On pourra utiliser des variables de classe sans vérifier qu'elles ont été initialisée car elles sont dans la classe.

En procédural, vous devez vérifier les parametres de chaques fonctions à chaque appel. Ce que presque personne ne fait parce que ça tuerai toutes les tentatives de programmer en recursif. Résultat les variables ne sont pas controlées et on se trouve avec des trous de sécu qui ont été inventé avant ma naissance dans du code pondu aujourd'hui.

Quand au code de goret, s'il y a la même proportion dans les deux styles, procédural ou orienté objet alors c'est la victoire de la POO, parce qu'il est bcp plus délicat de faire du code avec classe que sans.
Avatar de arkhamon arkhamon
http://www.developpez.com
Membre Expert
le 30/08/2012 10:55
Citation Envoyé par gene69  Voir le message
l'avantage de l'objet c'est que c'est "la programmation de confiance", vous avez pas besoin de connaitre le fonctionnement d'une classe pour la dériver.

Ca c'est tout à fait vrai, c'est même un des principes fondateurs de cette techno, et son implémentation avec les méthodes privées et publiques lui donne toute sa puissance. Donc ça méritait un +1 !
Citation Envoyé par gene69  Voir le message
On pourra utiliser des variables de classe sans vérifier qu'elles ont été initialisée car elles sont dans la classe.

Voila c'est exactement ce que je reproche au dev moderne : on balance sa merde sans se soucier de sa qualité, on laisse aux autres le soin de corriger... Le j'emn foutisme généralisé conduisant aux plus belles catastrophes. Marrant ça, che Toyota dans les années 70 ils se sont rendu compte que vérifier un élément le plus en amont permettait de réduire les couts au final. Et en info, on fait exactement le contraire...
Cette façon de faire conduit à cette abomination que les incompétents appellent "fuites mémoire". Doux acronyme utilisé pour masquer son incompétence et son manque de formation. Mon prof d'info m'avait appris un truc :
Un ordinateur, c'est comme les chiottes : on est prié de les laisser en partant dans l'état dans lesquels on les a trouvés en entrant.

Si tu laisses la merde sans tirer la chasse, viens pas te plaindre après que quand tu arrives, c'est sale... Vous je sais pas, mais moi quand je veux m'assoir sur le trône, j'aime bien ne pas passer 2 heures avant poru nettoyer... Il m'avait aussi appris ça :
une fonction, ou un bloc, c'est 3 phases :
  • une initialisation
  • un traitement
  • une fin

Et tout ce qui apparaissait dans l'initialisation (assignations) devait apparaitre en ordre inverse dans la fin (libération). Ca permet jsutement d'éviter les fuites mémoires... Traitez moi de fasciste et de vieuxc réac, j'adore, je prends même ça pour un compliment...

Citation Envoyé par gene69  Voir le message
En procédural, vous devez vérifier les parametres de chaques fonctions à chaque appel. Ce que presque personne ne fait parce que ça tuerai toutes les tentatives de programmer en recursif.

Je vois pas en quoi ca gène pour la récursivité : si tu t'assures que ce que tu transmets est correct, et que ta fonction produit un résultat correct, alors pas de soucis pour la récursivité... Tout le reste, c'est du pipeau !

Citation Envoyé par gene69  Voir le message
Résultat les variables ne sont pas controlées et on se trouve avec des trous de sécu qui ont été inventé avant ma naissance dans du code pondu aujourd'hui.

Un trou de sécu, c'est pas un autre mot pour désigner un morceau de code qui n'est pas développé dans les règles de l'art ?

Citation Envoyé par gene69  Voir le message
Quand au code de goret, s'il y a la même proportion dans les deux styles, procédural ou orienté objet alors c'est la victoire de la POO, parce qu'il est bcp plus délicat de faire du code avec classe que sans.

Non c'est la victoire de laisser-aller généralisé. Je fais de la POO parce que comme ça, je reporte sur le concepteur de la classe la nécessité de s'occuper de MES légèreté de développeur...
Avatar de gene69 gene69
http://www.developpez.com
Membre Expert
le 30/08/2012 12:02
Je vois pas en quoi ca gène pour la récursivité : si tu t'assures que ce que tu transmets est correct, et que ta fonction produit un résultat correct, alors pas de soucis pour la récursivité... Tout le reste, c'est du pipeau !

C'est une procédure récursive doit vérifier tous ses arguments avant de se relancer elle-meme / de faire ce qu'elle doit (l'un, l'autre ou les deux). Relancée elle revérifiera ses arguments. Du coup les performances se dégradent. En objet j'ai une méthode récursive privée ou protégée (les jours ou je suis généreux) et un wraper public qui fait les vérifications une seule fois et appelle la récursion. Le probleme d'une fonction n'est pas de transmettre des parametres corrects (surtout à elle-meme), c'est de les recevoir de potentiellement n'importe quel goret et de savoir planter glorieusement sans corrompre les informations.

Les classes ont proposé un modèle cohérent pour gérer ce problème avec "des bonne manière de faire". En procédural, ben moi j'attends. On peut s'imposer une hygiène de codage de façon volontaire ou l'imposer aux autres avec des classes et des portées. N'oublions pas que le goret, contrairement à la croyance est un animal plutôt propre sur lui.

Un trou de sécu, c'est pas un autre mot pour désigner un morceau de code qui n'est pas développé dans les règles de l'art ?

non un trou de sécurité est une fonctionnalité non maitrisée qui permet dans les faits à un utilisateur d’accéder à des informations sans y être habilité ou a modifier le fonctionnement normal d'une application. Le paradigme objet permet d'avoir des points d'entrée identifiés dans un programme donc réduit la surface d'exposition du code. Enfin je suis pas expert en sécu et je sais qu'un bon modèle ne fait pas tout.

moi j'arrete avec ce troll.
Avatar de arkhamon arkhamon
http://www.developpez.com
Membre Expert
le 30/08/2012 13:28
Je plusse, mais quand même...
Citation Envoyé par gene69  Voir le message
C'est une procédure récursive doit vérifier tous ses arguments avant de se relancer elle-meme / de faire ce qu'elle doit (l'un, l'autre ou les deux). Relancée elle revérifiera ses arguments. Du coup les performances se dégradent.

Ca faudrait caulculer la dégradation de perf car je suis pas convaincu. Ou alors la fonction est balaize et je vois pas trop comment elle peut être récursive.
Citation Envoyé par gene69  Voir le message
En objet j'ai une méthode récursive privée ou protégée (les jours ou je suis généreux) et un wraper public qui fait les vérifications une seule fois et appelle la récursion. Le probleme d'une fonction n'est pas de transmettre des parametres corrects (surtout à elle-meme), c'est de les recevoir de potentiellement n'importe quel goret et de savoir planter glorieusement sans corrompre les informations.

Ouaip. D'accord. Mais si on peut faire un truc propre, ca évite pas mal de soucis !

Citation Envoyé par gene69  Voir le message
Les classes ont proposé un modèle cohérent pour gérer ce problème avec "des bonne manière de faire". En procédural, ben moi j'attends. On peut s'imposer une hygiène de codage de façon volontaire ou l'imposer aux autres avec des classes et des portées.

Le développement, comme tout métier répond à des règles et suit des normes. Ou plutôt devrait...
Citation Envoyé par gene69  Voir le message
N'oublions pas que le goret, contrairement à la croyance est un animal plutôt propre sur lui.

C'est vrai que le goret est un animal propre, c'est l'humain quis'amuse à le faire vivre dans la fange. Par contre, jamais vu un cochon pondre un programme propre moi...
Avatar de Matthieu Vergne Matthieu Vergne
http://www.developpez.com
Membre émérite
le 30/08/2012 22:20
Si j'ai bien compris l'article, on parle d'utiliser des classes uniquement, pas de programmer en objet. De ce que j'en ai compris, ce qui est abusif est d'utiliser le principe de classes pour centraliser ses fonctions (qu'on appelle donc méthodes pour la peine) en lieu et place des "modules". La critique ne se situe pas sur l'utilisation de la POO. Je me trompe ?

Si j'ai raison, alors je comprends tout à fait l'auteur dans le sens où on mixe les concepts venant d'horizons différents, ce qui n'arrange rien à la compréhension du code. Soit on fait de l'objet (haut niveau) soit on fait du procédural (bas niveau). Mais on ne mixe pas des concepts pour obtenir une simple facilité technique (surtout quand on a la possibilité de faire tout aussi propre avec les concepts déjà présent), c'est du codage d'opportuniste.

Pour ma part je fais de l'objet, chaque classe a un sens concret (qui se traduira par des instances faciles à comprendre et à manipuler) et non abstrait (pour faire office de paquets de fonctions).
Avatar de ascito ascito
http://www.developpez.com
Membre émérite
le 30/08/2012 23:33
Si j'ai bien compris l'article, on parle d'utiliser des classes uniquement, pas de programmer en objet... La critique ne se situe pas sur l'utilisation de la POO. Je me trompe ?

Ca fait du bien de lire quelqu'un qui a vraiment lu l'article
Avatar de Matthieu Vergne Matthieu Vergne
http://www.developpez.com
Membre émérite
le 30/08/2012 23:47
J'ai juste lu l'article Developpez.com, pas les commentaires de l'allemand, donc je me base peut-être sur une omission de l'article. Mais en tout cas c'est ce que j'ai compris.
Avatar de Code62 Code62
http://www.developpez.com
Membre chevronné
le 31/08/2012 11:05
Citation Envoyé par lilington  Voir le message
ca aussi c'est une affirmation gratuite, car ecrire un kernel ou faire des pilotes seraient des projets simple?

à moins que tu n'écrives un kernel ou des pilotes en php, tu continues à être hors sujet...

Citation Envoyé par arkhamon  Voir le message
Et ta méthode d'objet, tu l'écris en quoi au juste ? Pas en procédural ?

c'est précisément ce que Stailer impliquait: en faisant de l'objet, tu fais du procédural, inévitablement; comprendre l'objet = comprendre le procédural, inévitablement... l'inverse n'est pas vrai.

les débats, c'est cool... mais là, ça ressemble méchamment à du troll gratuit...
Offres d'emploi IT
Ingénieur Logiciel R&D
CDI
Talentik - Québec - Montréal (07110)
Parue le 30/06/2014
Manager International Program
CDI
Alten - Ile de France - Boulogne-Billancourt (92100)
Parue le 30/06/2014
Concepteur ou ingénieur confirmé .net h/f
CDI
BULL FR - Aquitaine - Bordeaux (33000)
Parue le 01/07/2014

Voir plus d'offres Voir la carte des offres IT
 
 
 
 
Partenaires

PlanetHoster
Ikoula