begin process at 2010 03 20 02:09:53
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > FILTRER, METTRE EN CACHE OU MAPER, OU TRIER UN ITERATEUR

FILTRER, METTRE EN CACHE OU MAPER, OU TRIER UN ITERATEUR


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :SPL, iterateurs, iterateur, paresseux, POO Niveau :Expert Date de création :05/06/2008 Vu / téléchargé :3 587 / 102

Auteur : coucou747

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
le titre est incorrect, mais si j'avais voulu mettre dans le titre tout ce que fait cette source, j'aurais probablement fait un titre beaucoup trop long...

cette source contient quelques Exceptions personalisees, quelques interfaces, deux fonctions et une trentaine de classes (peut-etre plus)

des classes pour "agreer" un tableau en iterator.

une Stack

un arbre binaire

une classe (Comparator) pour gerer des criteres de comparaisons d'objets comparables (c'est pas tres clair...)
exemple : vous avez des fichiers, vous voulez les trier, mais pour les trier, vous devez pouvoir comparer deux a deux ces fichiers.
Votre critere de tri n'est pas un simple critere, vous voulez trier par type : dossier, fichier, etc... puis par nom.
C'est la que ma classe intervient : soit vous faites deux tris successifs, ce qui rend votre tri lent... soit vous faites un tri, mais avec des criteres de tris composes. c'est a ca que sert cette classe.

Ensuite, on a la classe qui trie vraiment, elle effectue un tri par insertion dans un arbre de recherche. c'est un tri en n * log(n) sur une liste non triee, mais en n*n sur une liste triee.

j'ai quelques classes qui gerent les fichiers et dossiers unix, (fichier permissions, fichiers, dossiers, dossiers recursifs)

j'ai une classe de filtre : elle prend un iterateur, et ne renvoie que les valeurs de cet iterateur qui satisfont une propriete. (ici aussi, on peut composer ces proprietes, grace a un FiltreParam)

un iterateur qui liste recursivement l'iterateur qu'on lui passe en parametre (pour des dossiers par exemple)

un OrderedIt qui redefinit les clefs de l'iterateur.

un dynamicIt qui memorise dans un cache (array) les valeurs de l'iterateur qu'il liste, ce qui fait que le second acces a l'iterateur se trouve (parfois) etre plus rapide

une classe Seg qui represente un segment de IR (en math) [a, b]

une classe PaginateIt qui decoupe un morceau d'iterateur (par exemple, on peut prendre des valeurs de 5 a 15)

une classe ReverseIterator qui lit un iterateur a l'envers

et une classe MapIterator qui applique une fonction aux elements d'un iterateur

j'ai fait un truc que les haskelliens aiment bien : le mode paresseux. c'est a dire que si vous n'appellez pas current, alors pour certains iterateurs, les calculs ne sont pas faits (map, filter, dynamic, etc...)

Source

  • try{
  • /*$i = new TestIt();
  • foreach ($i as $indice => $val){
  • echo $indice.' '.$val.'
  • ';
  • }*/
  • /*
  • $d=new DossierRec(new Factory(), './');
  • $d=new Filterit($d, new FiltreParam(UnixFile::IsHidden, FiltreParam::Non));
  • $d=new Recurit($d);
  • $d=new SortItterator($d, new Comparator(UnixFile::Type | UnixFile::Asc, new Comparator(UnixFile::Name)));
  • $d=new OrderedIt($d);
  • $d=new dynamicIt($d);
  • echo '<ul>';
  • foreach ($d as $i=>$f)
  • echo '<li>'.$i.' ) '.$f.'</li>';
  • echo '</ul>';
  • */
  • $s=new Syracuse(45);
  • $s=new Filterit($s, Integer::IsPaire);
  • $s=new PaginateIt($s, new Seg(3, 13));
  • $s=new PaginateIt($s, new Seg(1, 10));
  • $s=new MapIterator($s, 'neg', MapIterator::Appl | MapIterator::Meth);
  • //$s=new ReverseIterator($s);
  • echo '<ul>';
  • foreach ($s as $k=>$c){
  • echo '<li>'.$k.' ==> '.$c.'</li>';
  • }
  • echo '</ul>'. count($s);
  • /*
  • $s=new Stack();
  • $s->push(1);
  • $s->push(2);
  • $s->push(3);
  • echo '<ul>';
  • foreach ($s as $k=>$c){
  • echo '<li>'.$k.' ==> '.$c.'</li>';
  • }
  • echo '</ul>';
  • */
  • }catch (MException $e){
  • echo $e;
  • }
  • ?>
try{
  /*$i = new TestIt();
  foreach ($i as $indice => $val){
    echo $indice.' '.$val.'
';
  }*/


  /*
  $d=new DossierRec(new Factory(), './');
  $d=new Filterit($d, new FiltreParam(UnixFile::IsHidden, FiltreParam::Non));
  $d=new Recurit($d);
  $d=new SortItterator($d, new Comparator(UnixFile::Type | UnixFile::Asc, new Comparator(UnixFile::Name)));
  $d=new OrderedIt($d);
  $d=new dynamicIt($d);

  echo '<ul>';
  foreach ($d as $i=>$f)
    echo '<li>'.$i.' ) '.$f.'</li>';
  echo '</ul>';
  */

  $s=new Syracuse(45);
  $s=new Filterit($s, Integer::IsPaire);
  $s=new PaginateIt($s, new Seg(3, 13));
  $s=new PaginateIt($s, new Seg(1, 10));
  $s=new MapIterator($s, 'neg', MapIterator::Appl | MapIterator::Meth);
  //$s=new ReverseIterator($s);
  echo '<ul>';
  foreach ($s as $k=>$c){
    echo '<li>'.$k.'  ==> '.$c.'</li>';
  }
  echo '</ul>'. count($s);
  /*
  $s=new Stack();
  $s->push(1);
  $s->push(2);
  $s->push(3);
  echo '<ul>';
  foreach ($s as $k=>$c){
    echo '<li>'.$k.'  ==> '.$c.'</li>';
  }
  echo '</ul>';
  */
}catch (MException $e){
  echo $e;
}
?>

 Conclusion

je trouvais la SPL trop peu souple pour les dossiers, voila un recode qui corrige tout ca.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec une capture IMAGES GENETIQUES
Source avec Zip Source avec une capture RUBIX CUBE
Source avec Zip INTERPRETEUR BRAINFUCK
Source avec Zip PROXY HTTP : SAUVEZ VOS VIDEOS PREFEREES.
Source avec une capture ECRIRE UN TEXTE EN CERCLE SUR UNE IMAGE

 Sources de la même categorie

Source avec Zip CLASSE TABLE HTML DYNAMIQUE par LDDL
Source avec Zip GÉNÉRATEUR DE COUCHE DAO POUR SITE WEB À PARTIR D'UNE BASE D... par alexfool
Source avec Zip [PHP5.2] CLASSE PDO par hornetbzz
Source avec Zip POO - LOGGING PACKAGE par Waredan
POO - OBJECT CLASS par Waredan

 Sources en rapport avec celle ci

Source avec Zip GESTION DE FICHIERS AVEC LA SPL par alphanono
Source avec Zip [PHP5.3]PACKAGE CONFIG par dorian91
Source avec Zip HASHMAP EN PHP AVEC LA SPL par dorian91
[PHP5.1] STRING ITERATOR par neigedhiver
Source avec Zip [PHP5] SMARTDIR : LES ITÉRATEURS EN PHP - LECTURE INTELLIGEN... par malalam

Commentaires et avis

Commentaire de LocalStone le 05/06/2008 20:26:16

J'aime bien ta source parce que ça me rappelle le Java pour certains aspects ... Et j'aime bien le Java :P !
Par contre, il y a un petit truc qui me dérange ... J'avoue que j'ai pas regardé les 30 classes, mais c'est au niveau de tes conventions de code : parfois c'est en anglais, parfois c'est en français, parfois les noms de classes ne sont pas complet et parfois si (FinIterator ... Pourquoi pas FiniteIterator ou équivalent ...).
Vu l'ampleur de la source, ça mériterait d'être plus stricte et plus rigoureux ... Mais en même temps, je ne suis pas un pro !

Commentaire de coucou747 le 05/06/2008 20:51:22

merci

pour les noms, c'est un de mes defauts, je corrigerais ca quand la debian testing sera passee a php5.3, histoire que je puisse profiter des namespaces.

Commentaire de Morphinof le 06/06/2008 09:46:49

Un sacré package très instructif ! J'aime beaucoup ;)
En survolant vite fait le code je suis tombé la dessus :
public function __call($a, $b){
    $o=$this->target;
    return call_user_func_array( array($o, $a), $b);
}
si on appelle une fonction qui n'existe pas y'a pas d'exception :p

Commentaire de coucou747 le 06/06/2008 09:56:09

non, ca plante :)

c'est sur le proxyclass, ca... si tu fais $o=new ... ; $o->call_fonction_qui_nexiste_pas, ca plante aussi hein :)

ca te fait un fatal_error, avec ma classe, comme sans ma classe de toute facon...

Commentaire de Morphinof le 06/06/2008 10:04:53 10/10

Je chipotes ;)
if(!function_exists($a)) throw new blablala ^^
En tout cas je me régales je vais certainement utiliser l'arbre binaire :)

Commentaire de coucou747 le 06/06/2008 10:15:29

throw new OMGException();
:) localstone va se regaler avec mes conventions de nomages XD

Morphinof, c'est un truc assez interessant cet arbre de recherche, mais pour les perfs, je ne suis pas sur qu'il soit si bon... car en generale, on traite des listes quasiment triees, et pour une liste triee, il est en N*N... (le Qsort est en N * log(N) )

Commentaire de Morphinof le 06/06/2008 10:21:43

Vi c'est sur, le mieu restant l'arbre binaire équilibré pour arriver à N*log(N), mais bon N*N c'est un complexité acceptable sauf si on traite vraiment beaucoup de données ^^

Commentaire de malalam le 08/06/2008 14:23:08 administrateur CS 10/10

Hello coucou,

même si, pour être franc, je comprends mal pourquoi tu as décidé de réécrire la SPL (à mon avis tu devrais l'expliquer, d'ailleurs), c'est quand même un boulot énorme. Et c'est très bien codé; Bravo :-) 10.

Commentaire de coucou747 le 08/06/2008 17:47:39

c'etait essentiellement pour la factory du listeur de dossiers.
setFileClass (string class_name="SplFileObject")
setInfoClass (string class_name="SplFileInfo")

t'as juste ca, mais tu ne peux pas mettre de factory, or perso, j'ai des classes qui lisent les attributs de mes fichiers (lire les tags d'un mp3, le type d'un fichier source, la playliste d'un m3u, les exif d'une image, les donnees d'un ini, de quoi lire un csv, etc...) et pour la classe de la SPL, on ne peut pas distinguer un .mp3 d'un .ini... (sauf en faisant des filterIterators)

on en avait deja parle sur le forum il y a quelques temps.

pour le reste, ils n'ont pas de classe abstraite Proxy, qui soit parente a map, filter, limit, et recursive.

ils ne font pas la distinction entre les iterateurs finnis et infinis.

Ensuite, perso j'aime bien l'idee que ca soit les elements qui soient filtrables ou non, et pas l'iterateur qui filtre n'importe quoi avec un callback (ou non d'ailleur)
idem pour le tri.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Class POO retourné le nom de l'objet [ par MeTh ] Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci templates avec poo [ par lesnes ] bonjours je reprogramme totalement mon site en poo et je souhaiterai utiliser les templates mais l'on ne peut pas faire appel a une class exterieur a Probleme en POO [ par pablor44 ] Bonjour,alors voil&#224; je vous explique mon probleme, je suis en train d'ecrire une classe en php pour mon site et je me retrouve dans la situation Gestion membres via POO [ par FhX ] Je me posais la question justement. Pour pouvoir faire une interface membre (donc : admin + membre + visiteur), dois-je faire ca en une seule classe ? logiciel POO [ par kowal2205 ] Je me pose la question de la cr&#233;ation de mes classes dans un projet de taille moyenne car je ne trouve pas de logiciel &#224; mon pied qui me per Reflexion sur un schema de POO (gestion d'emploi du temps d'une UFR) [ par Franquito ] Bonjour à tous ! Je dois réaliser un schema pour une application de programation orienté objet. L'application fait la gestion d'emploi du temps d'un Comment ca marche cette petite bete? [ par craso ] bonjour,en surfant, je suis tombé sur le site http://www.phpied.com/image-fun/ .Je souhaite qu'on m'explique comment trnsformer une image comme sur le réécriture d'un script en POO, comment faire? [ par craso ] Bonjour,j'ai développé cette petite application http://pipcorp.free.fr/Il s'agit d'une image clicable, le personnage centrale se positionne a l'endroi [POO] Développer son Framework [ par Foxhive ] Bonjour à tous, Cela fait longtemps que l'idée m'interesse mais j'ai jamais vraiment osé me jeter à l'eau. Mais là que je suis en vacance je me dis qu [POO] Avis à tous ! [ par FhX ] L'update de PHP5.2 est assez conséquent, je vous conseil de la lire :pY'a pas mal de trucs qui vont changer, surtout au niveux des interfaces (et tant


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales