Objet fichier : Reflexion sur la création d'une class

ViPHP
ViPHP | 4674 Messages

01 août 2008, 01:07

Hey :),

Tu devrais vraiment te pencher sur la gestion de fichier (file system) sous Unix. C'est une petite merveille de simplicité (inventé presque 10/15ans avant le DOS soit dit en passant …).

Je t'explique rapidement en faisant la parallèle avec l'objet.
Tout est fichier : dossier, lien symbolique, lien dur, fichier, volume, périphérique, etc. Donc, on aurait un objet fichier. Chaque fichier a un identifiant, c'est ce qu'on appelle un inode (identifiant de nœud). Chaque inode est unique, normal. À chaque inode est associé une donnée (souvent une suite de bit, mais pour notre objet, on va utiliser des attributs par exemple, pour simplifier). Cette donnée comprendre plusieurs choses : le type du fichier (dossier, lien, volume, fichier, etc.), ses droits, son propriétaire, son poids, etc. Un disque dur, c'est alors un tableau associative inodedonnées ; tu vois facilement le parallèle avec l'objet : un disque dur est un objet HardDisk qui contient une collection d'objet File, tout bêtement.
Oui mais l'arborescence alors ? On a dit que chaque fichier avait un type particulier. Dans le cas d'un fichier normal (fichier texte par exemple), on aura le type du fichier à null. Dans ce cas, son contenu sera traité comme du texte. Maintenant, dans le cas d'un dossier : son type sera d, et donc, son contenu ne sera pas interpréter comme du texte, mais autrement. Son contenu c'est tout simplement une liste d'inode qui représente le contenu du dossier. Tu vois donc comment créer une arborescence ? Tu as ton élément racine d'inode fixe, imposé, invariable, et connu (une constante par exemple) qui est un dossier, et qui contient tous les éléments de départ. Après, il est facile de faire une arborescence.

En objet c'est pareil donc. Chaque objet a un « profil ». Le profil peut être décrit via les attributs de l'objet, à toi de débrouiller comme tu veux.
Une chose intéressante toutefois : le type géré par héritage. Si on ne gère pas le type par héritage (i.e. on a une seule classe pour tous les fichiers), il sera géré via un attribut, et une méthode isFile, isDirectory, isLink, etc. Mais si on le gère avec l'héritage, c'est à dire que la classe Directory étend File, alors c'est plus intéressant. Imagine ta classe HardDisk qui contient une collection de fichier, elle peut contenir des objets typés comme File ou typés comme Directory. Le test est immédiat : instanceof. C'est plus rapide, plus souple, et plus léger. Si tu as un seul objet File pour tous les fichiers, il va faire 2000 lignes, et bonjour pour le modifier (exemple tout bête : ajouter un type) … Alors que si ton objet File permet de gérer les propriétés communes à tous les fichiers (inode, poids, nom, etc.), et que tu as un objet Directory qui étend File, avec la surchage, la redéfinition, et des choses du genre, tu peux vraiment te faciliter la vie, et utiliser des objets appropriés. Comme tu l'as dit toi-même, la programmation orientée objet va du plus abstrait au plus concret. C'est ce qu'on fait ici.

Après, quant à l'utilité de faire un tel système pour PHP, euh … bonne chance, mais je n'en vois pas. C'est un excellent exercice pour comprendre la POO. On utilise des mécanismes très intéressants, et on peut pousser assez loin le raisonnement, pour ça bravo. Mais une implémentation concrète, en environnement de production, c'est assez inutile ;-).

@Nagol : Sékil n'a jamais dit que programmer en procédural était crade … La POO a des avantages et des inconvénients, mais tout est question de contexte, d'environnement et de langage. On ne fait pas de l'objet en LISP, on fait du lambda-calcul. On ne fait pas du procédural en Java, on fait de l'objet. En PHP, c'est très compliqué. Le langage permet de faire du fonctionnel, du procédural, et de l'objet. Les applications répondent à une demande précise et très varié. À nous d'utiliser le style adéquate qui répond le plus aux exigences de l'application.
Il n'y a pas de guerre entre procédural et objet, c'est du vent, inventé sur IRC pour alimenter la longue liste des trolls. Tout ça parce que Java et C n'arrivent pas à cohabiter (et si je dis que le noyau de Java est écrit en C, on va me sauter dessus :roll: ?). Ce sont des styles très différents et qui n'ont presque rien en commun. Il y a des applications très complexes qui seraient quasiment humainement impossible à réaliser en procédural, et d'autres applications qui sont un réel casse-tête à réaliser en objet alors qu'elles seraient extrêmement simples en procédural. Ce sont deux mondes très différents qui ne méritent même pas la comparaison.

L'idée que la plupart des gens ont sur le procédural, c'est un peu de PHP 3 ou PHP 4. C'est du procédural de little-player. Prolog est du procédural (mélangé à du lambda-calcul, et tout le toutime). Je vous mets au défis de faire de l'intelligence artificielle en objet. Le langage ne s'y prête pas une seconde.

Dire que l'objet ralentit les applications est une aberration. Une application correctement conçue en objet n'est pas tellement plus lente que si elle avait été conçue en procédural. Néanmoins, la maintenance va être nettement plus aisé en objet. C'est comme ça, c'est tout. Si l'objet a été inventé et est de plus en plus répandu, c'est qu'il y a une raison. Le procédural était partout alors qu'il ne devait pas être partout. À chaque besoin son style de programmation, et les styles naissent en fonction des besoins et de l'expérience.

On voit ce genre de réaction comme si le procédural allait mourir à cause de l'objet. Point de crainte amis, le procédural a encore une belle vie devant lui (et ça rime).

Je pourrai encore expliquer mon point de vue, mais ce serait autour d'une petite table, et un peu plus tôt. Moi, je vais me coucher ;-).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 3300 Messages

01 août 2008, 07:49

Dire que l'objet ralentit les applications est une aberration
eh bien fais un test très simple: benchmark un code composé d'un certain nombre de fonctions et son équivalent objet, tu verras c'est assez clair, je trouve que c'est une aberration de dire que l'objet ne ralentis pas les applications... ca fait plus de maloc à fonctionalité équivalente c'est pourtant une équation simple.

La question est plutot est ce que c'est intéressant pour le projet, et est ce que ca me fera gagner en maintenabilité, mais il faut rester conscient que niveau perf on ne peut pas faire mieux que du procédural pur.

Tsss HyWan pour une fois tu es à côté de la plaque :)
Fait du php depuis que ca existe ou presque :)

ViPHP
ViPHP | 5924 Messages

01 août 2008, 09:10

Dire que l'objet ralentit les applications est une aberration
eh bien fais un test très simple: benchmark un code composé d'un certain nombre de fonctions et son équivalent objet, tu verras c'est assez clair, je trouve que c'est une aberration de dire que l'objet ne ralentis pas les applications... ca fait plus de maloc à fonctionalité équivalente c'est pourtant une équation simple.

La question est plutot est ce que c'est intéressant pour le projet, et est ce que ca me fera gagner en maintenabilité, mais il faut rester conscient que niveau perf on ne peut pas faire mieux que du procédural pur.

Tsss HyWan pour une fois tu es à côté de la plaque :)
Sur le point des performances, je suis d'accord avec toi Nagol. Mais sur le plan de la maintenabilité, je ne dis pas que l'on fera nécessairement du code crade avec du procédural (on peut faire de la POO avec un langage procédural après tout), je dis seulement qu'il est beaucoup plus aisé de faire un code propre avec un langage objet, parce qu'il va permettre une structuration naturelle du code, qu'il va gérer de nombreuses contraintes de typage, de protection des données, de traitement automatique à l'accès des données, etc. L'objet permet de lier très facilement les données avec les processus de traitement, la structuration du code en entités regroupant des données associées est donc très simple, et demande moins de code, c'est en cela que l'objet fera faire plus d'opérations au processeur, mais en épargnera beaucoup au développeur, tout en imposant des contraintes au niveau du langage.
Je te défis de gérer en procédural de redéfinir une fonction aussi facilement qu'avec un héritage, de gérer la modularité aussi clairement qu'avec des interfaces, de protéger tes données de manière aussi fiable que par la visibilité.
Le code procédural n'est pas crade, mais il n'est pas aussi évolutif que du code objet, voilà tout…

ViPHP
ViPHP | 4674 Messages

01 août 2008, 09:26

Exactement. Sékil m'a — je pense — compris.
Quand je dis que l'objet ne ralentit pas les applications, je prends en compte l'ensemble du développement. C'est à dire que pour ce que l'objet propose, l'interprétation n'est pas si lente. Maintenant, dans le détail, évidemment que c'est plus long … Chaque couche ajoutée pour coller de plus en plus à la réalité se base sur une précédente et donc ajoute du calcul, et du temps, c'est évident. Toutefois, ce temps devient négligeable face à ce que l'objet propose en maintenance, réutilisabilité, et tous ses biens-fait/souplesse que l'on lui connaît.
Mais de toute façon, pour les langages compilés, la différence est quasiment nulle (voire nulle) entre procédural et objet.

Et franchement, un objet n'est pas si lourd que ça en mémoire comparé à toutes les opportunités qu'il propose. Un objet c'est des méthodes qui appartiennent à la classe qui ne sont stockées qu'une seule fois en mémoire (comme des fonctions) et des attributs qui appartiennent à l'objet, qui eux appartiennent à chaque instance. Entre avoir des données partagées (objet) ou des données dupliquées (procédural), ce n'est pas toujours plus lourd.
Encore une fois, tout dépend du contexte et du problème …

(Et je ne suis pas à côté de la plaque).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

01 août 2008, 09:45

Chaque couche ajoutée pour coller de plus en plus à la réalité se base sur une précédente et donc ajoute du calcul, et du temps, c'est évident. Toutefois, ce temps devient négligeable face à ce que l'objet propose en maintenance, réutilisabilité, et tous ses biens-fait/souplesse que l'on lui connaît.
Mais de toute façon, pour les langages compilés, la différence est quasiment nulle (voire nulle) entre procédural et objet.
Non, là je ne suis pas d'accord, que ce soit en php ou en compilé, ce sera plus long, parce que le procédural te permet de faire du code optimisé (qui sera à l'antipode d'un code structuré), et l'objet implique des processus qui ne sont pas présents en procédural. Après oui, la différence sera plus faible en procédural parce que les objets sont optimisés par le compilateur, mais rien que dans le principe de codage, un code orienté objet implique qu'il est structuré plutôt qu'optimisé, alors qu'un code procédural, à moins d'efforts particuliers, ce sera le contraire. C'est pour cette raison que l'objet est plus adapté pour structurer son programme que le procédural...

ViPHP
ViPHP | 4674 Messages

01 août 2008, 11:11

Hmmm ok.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 443 Messages

02 août 2008, 00:35

Avant d'en écrire des pages, il serait peut-être intéressant de qualifier objectivement la différence de performance. Parce qu'à vue de nez ça va pas jouer à 1% et pour une page qui sera générée en quelques pouième de seconde, comme l'aurait dit un de mes anciens profs, c'est de l'onanisme intellectuel...


Tracker.

ViPHP
ViPHP | 4039 Messages

02 août 2008, 01:37

comme l'aurait dit un de mes anciens profs, c'est de l'onanisme intellectuel...
8-)

Tout comme je l'aurais dit, mais en d'autres termes..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 443 Messages

02 août 2008, 08:00

je crois qu'il faut arrêter d'avoir le réflexe code procédural = code crade, c'est aussi vrai que de dire code php = code crade. Pour avoir codé des intranet en procédural et en objet je peut te dire qu'il n'y a guère de différence tant que le développeur fait gaffe. Faire de l'objet pour faire de l'objet est un mauvais choix technologique il faut avoir des raisons et mixer le procédural et l'objet au besoin.
C'est relou ces débâts, un code procédural pas crade est quasi objet (cf les api php):
Une variable (ou structure voir une ressource pour protéger l'accès), strictement définie, passée en paramètre d'un bouquet de fonctions nommées intelligemment (genre mysql_***, curl_***, session_***, etc...), regroupées par script...

Quelle différence avec l'Objet ? simplement l'héritage. Donc tu aboutis quand même à un code lourdo rempli de switch case pour arriver implémenter ton besoin.

Ensuite tout projet logiquement analysé fait apparaitre des entités (matérialisées par des tables en bdd). Ne pas faire d'objet veux dire ne pas mettre en place de d'or/mapping et c'est purement une perte de temps, idem pour tous les aspects fondamentaux d'une archie n-tiers.

@supercanard:
Ton héritage FichierTexte extends Fichier, n'est pas valide tu ne peux pas faire autant de classe que de type mimes. Imagine les choses un peu différemment:

FilesystemObject = Objet générique contenant nom, date modif etc...
Folder extends FilesystemObject = qui est un conteneur de FilesystemObjet
File extends FilesystemObject = qui est un conteneur de Stream (flux)
Stream = qui permet de lire ou d'ajouter un contenu...

Sur NTFS par exemple un fichier peut contenir plusieurs flux.


Tracker.

Administrateur PHPfrance
Administrateur PHPfrance | 449 Messages

02 août 2008, 13:46

La question était pourtant simple il me semble...

Et encore une fois ca dérive vers un débat objet vs procédural. Si vous souhaitez voir tout vos HS modéré par mes soins continuez comme ça je sens que je vais bien m'amuser sinon faite le necessaire pour répondre à la question posée et ouvrez un sujet parrallèle pour débattre. Je l'ai déja dis une fois, c'est donc la deuxième et il n'y aura pas de troisième.

j'espères être bien clair !!!
Cordialement
Saeveas

http://saeveas.labrute.fr

ViPHP
ViPHP | 3300 Messages

05 août 2008, 07:31

Et franchement, un objet n'est pas si lourd que ça en mémoire comparé à toutes les opportunités qu'il propose.
(Et je ne suis pas à côté de la plaque).
euh... ;)

bon bref les débats interminables, je ferais quand même remarquer aux modérateurs que le sujet est par essence un appel au débat et qu'il n'y a aucun mal ou hs la dedans, en fait ce topic devrait être sticky afin de présenter l'argumentation pour et contre, et les quelques conseils relatifs à la création d'un objet basique.
Fait du php depuis que ca existe ou presque :)

Administrateur PHPfrance
Administrateur PHPfrance | 449 Messages

05 août 2008, 14:58

faite le necessaire pour répondre à la question posée et ouvrez un sujet parrallèle pour débattre
La solution est là. Rien n'empeche de lancer un debat en parallèle tout en y faisant un lien vers le sujet à l'origine du débat. Maintenant tout peut être sujet à débat, en cherchant la petite bête, la je vous incite vivement à rester dans les clous et à vous défouler sur un post à part !!
Cordialement
Saeveas

http://saeveas.labrute.fr

Eléphant du PHP | 443 Messages

05 août 2008, 15:39

Le sujet est parti en cacahouète au deuxième post, c'est pas maintenant qui faut s'insurger des dérives sur un sujet qui de toutes façons dérivera.
Ce que tu essaies de modérer est mort depuis 5 jours, et tu le fais avec un ton qui appelle les baffes donc...

Tracker

ViPHP
ViPHP | 3300 Messages

05 août 2008, 15:47

Le sujet est parti en cacahouète au deuxième post, c'est pas maintenant qui faut s'insurger des dérives sur un sujet qui de toutes façons dérivera.
Ce que tu essaies de modérer est mort depuis 5 jours, en plus avec un ton qui appelle les baffes donc...

Tracker
restons cordiaux... j'ai exprimé un avis contraire au sien mais en restant tout à fait cordial, la moindre des choses c'est qu'il en soit de même pour ceux qui seraient d'accord avec moi.
Fait du php depuis que ca existe ou presque :)

Eléphant du PHP | 443 Messages

05 août 2008, 15:53

La demande de base est d'avoir un avis sur une classe, pas de savoir si une classe est utile ce qui par définition n'a pas de sens. Je suis d'accord pour une modération de ce type de sujet car c'est pas possible qu'il n'y ait pas au moins un gars qui vienne dire "mais pourquoi une classe, les performances, blabla, etc... ???", mais ça doit-être fait à la base, pas 20 ans après alors que le sujet est déjà pourri.


Tracker.