Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source



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

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
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 !

signaler à un administrateur
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.

signaler à un administrateur
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

signaler à un administrateur
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...

signaler à un administrateur
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 :)

signaler à un administrateur
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) )

signaler à un administrateur
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 ^^

signaler à un administrateur
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.

signaler à un administrateur
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

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,733 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.