Pour avis correction

Eléphant du PHP | 177 Messages

13 févr. 2012, 22:57

Bonjour à tous,
Je viens vous solliciter pour vous demander des conseils tant sur la form que sur le fond, sur un petit bout de code ou je tente de me mettre à l'objet.
class file {
 	public $nom;
 	public $extention;
 	public $chemin;
 	public $dossier;
 	public $fichier;
 	
 	
 	

 	function ListeDossier ($chemin){
 		$this->Chemin = $chemin;
 		$this->Dossier = opendir($this->Chemin);

 		while ($this->FichierNom = readdir($this->Dossier)) {

 			if(is_file($this->Chemin.$this->FichierNom) ){

 				$dp=strrpos($this->FichierNom,'.');
 				$extention = substr ($this->FichierNom , $dp);
 				$this->FichierNom = substr ($this->FichierNom , 0 , $dp);
 				$this->Fichier['IncPage'][$this->FichierNom]=$this->FichierNom;
 				$this->PageValide[$this->FichierNom]=
 					array ('extension'=>$extention , 'chemin'=> $this->Chemin.$this->FichierNom.$extention , 'nom'=>$this->FichierNom);	
			}
		}
		closedir($this->Dossier);
		arsort($this->PageValide);
 	}
 	function PageValide ($fichier){
 		$this->PageValide[$fichier]=$fichier;
 	}

	function Read ($chemin){
		return $this->chemin=readdir($chemin);		
	}
	
	function Open ($dossier){
		return $this->dossier=opendir($dossier);		
	}
	
	function TestNomDossier ($nom){
		$this->nom=$nom;
		if ($this->nom!='.' and $this->nom!='..'){
			return true;
		}else{
			return false;
		}
	}
	
 	function Listeplugins ($cheminplugins){
 		$this->Chemin = $cheminplugins;

       if ($this->DossierPlugin = opendir($this->Chemin)){
         while ($this->NomPlugin=readdir($this->DossierPlugin)){
         if( $this->NomPlugin!='.' and $this->NomPlugin!='..') {
            
            
            if (file_exists($this->Chemin.$this->NomPlugin.'/index.php')){
            	$this->Plugin[]=$this->NomPlugin;            	          	
            }
            
            if ($this->TestNomDossier($this->NomPlugin)) {
            	$this->Fichier['plugin'][$this->nom]=$this->nom;
            	$this->PageValide[$this->NomPlugin]=$this->Chemin.$this->NomPlugin;
            	}
      }
         }
       }else{
             echo'Pas de plugin trouvé';
       }
       closedir($this->DossierPlugin);
	asort($this->Plugin);

  }

 }



tout les conseils seront les bienvenus, je voudrais essayer de bien comprendre les objets et de coder proprement.
Merci

Eléphant du PHP | 209 Messages

14 févr. 2012, 10:55

Salut,

Alors pas mal de choses pour le coup :p

Tout d'abord, niveau syntaxe... Je te conseille par ailleurs de jeter un oeil au standard de développement de Zend Framework : http://framework.zend.com/manual/fr/cod ... style.html

Tout d'abord le nom des classes prend une majuscule. Une méthode ou une variable protected ou private est préfixé de _ (règle de nommage de ZF).

Que ce soit pour les méthodes ou les variables, il faut utiliser la notation CamelCase : http://fr.wikipedia.org/wiki/CamelCase

Les commentaires ont vraiment une utilité et te permettent de générer ta documentation si besoin :P
N'oublie pas non plus de bien indenter et d'aérer ton code afin qu'il soit plus lisible. Si tu utilises Eclipse PDT comme éditeur, tu peux formater ton code avec le raccourci Ctrl + Shift + F.

Ces règles et remarques ne sont pas une obligation mais il est vraiment important d'adopter une convention de nommage au sein de ton code afin d'homogénéiser l'ensemble.


En terme de code objet,

Pour tes variables d'instance et méthodes, il faut que tu te documentes sur la visibilité en programmation objet : http://php.net/manual/fr/language.oop5.visibility.php
Généralement, les propriétés sont protected donc accessibles uniquement au sein de la classe et des classes filles. Pour y accéder de l'extérieur, il faut utiliser des getters/setters. Cela ne change ici pas ton code pour le coup.

Tes méthodes accessibles de l'extérieur doivent être publiques, les autres protected. Si tu n'as pas d'héritage, tu peux utiliser private que ce soit pour les variables d'instances ou les méthodes.

$this->Chemin = $chemin; est différent de $this->chemin = $chemin. D'où l'importance de faire attention à sa notation ;)

Autre chose, c'est la réutilisation de ce que tu as créé. Dans ListeDossier, tu fais opendir($this->Chemin). Pourquoi n'appelles-tu pas ta méthode Open que tu as créé. Le but d'une méthode est d'être appelée et d'intégrer tout le code nécessaire à son fonctionnement (ici ouvrir un dossier). Si plus tard, pour une raison x ou y, tu veux vérifier les droits de l'utilisateur pour ouvrir le dossier, tu n'auras qu'à mettre ton code dans la méthode. Mais, partout où tu n'as pas utilisé cette méthode tu devras modifier ton code pour ajouter un test et ce sera nettement plus chiant ^^

Voila pour finir, je ne sais pas trop à quoi sert ta classe mais j'ai l'impression que son nom n'est pas complétement en rapport avec ce qu'elle fait. Il est important de définir un nom de classe en adéquation avec son utilité et de créer un objet qui répond à une attente et non à un ensemble de choses sans réel rapport. Un objet File (pour moi) va représenter un fichier et un fichier ne peut pas avoir de méthode ListeDossier par exemple. ListeDossier s’appellerait plutôt liste dans la classe Dossier ;)

Hésite pas si tu as des questions en tout cas et précise moi ce que tu veux faire, ce sera plus facile pour expliquer ;)

++

Eléphant du PHP | 177 Messages

17 févr. 2012, 00:04

Bonsoir Shenryu,

Une réponse trés riche en information, et perspicace.
Alors à quoi sert ma class, avec un nom peu descriptif car je l'ai fait évoluer au fur et à mesure que je la créais. L'objectif que je me suis donné c'est de me faire une sorte de petit CMS qui géré à la fois des fichier plats, des plugins et qui simule l'URLREWRITING.
Donc cette class me permet de lister un répertoire ou ce trouve des fichiers a inclure et un autre répertoire ou ce trouve des dossiers de plugin.
Et qui remplit avec cela un tableau

Code : Tout sélectionner

$PageValide
, qui me permet de gérer des liens HTML sur des fichier PHP ou HTML.

Pour la methode Open je l'ai vu ^^, mais par encore mit en place complètement.
Je vais réécrire cette class et en faire deux dans un premier temps :

Une class Listage avec deux methode public ( page et dossier) et des methodes privé comme Open Read
Une class PageValide avec des methodes public AddPageValide et des méthodes qui genere les liens et des methodes privées comme TestNom ...

Puis revoir mon indentation et mettre des commentaires, donc dans un premier temps je veux écrire correctement ma mes class et comprendre la logique des objets.
Eclipse est assez impressionnant.

Bonne soirée et je reprend mon code PS je me demande si le fichier qui gere l'affichage ne serait pas utile? car il te permettrais peut être de me diriger dans la conception des class .
@+

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

17 févr. 2012, 23:11

salut,

les conventions de codage c'est celle qui TE vont, le reste c'est pour du code en équipe, et n'a rien d'obligatoire.
les conventions à la "java style" ça va 2s ^^

Pour le reste je te conseil de regarder du coté de la modélisation d'application avant de te lancer. avoir un code clair c'est une chose, du code efficace passe par la modélisation avec au minimum le diagramme de classe ;)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 209 Messages

18 févr. 2012, 14:45

Pour ta classe Listage, tu peux mettre ta classe et tes méthodes en static. Tout dépend de ce que tu veux faire dans le détail, mais à priori, tu n'as pas besoin d'instancier d'objets pour ce genre de choses. Il s'agit plus de méthodes utilitaires (de fonctions).

Pour ta classe PageValide, plutôt que de préfixer de test, tu peux utiliser isValid ;)


Tu peux te faire une classe Plugin_Manager qui va gérer l'appel de tes plugins et la navigation dans tes répertoires.
Ton URL Rewriting peut également fonctionner comme tes plugins mais ça va devenir un peu plus complexe à mettre en place.

N'hésite pas à poster du code effectivement. Ce sera plus simple pour t'aider (bon ne poste pas tout ton projet non plus :p)
les conventions de codage c'est celle qui TE vont, le reste c'est pour du code en équipe, et n'a rien d'obligatoire.
les conventions à la "java style" ça va 2s ^^
Ces règles et remarques ne sont pas une obligation mais il est vraiment important d'adopter une convention de nommage au sein de ton code afin d'homogénéiser l'ensemble.
;)
Chacun sa vision des choses...
Quand on développe, que ce soit en objet ou en procédural, il est indispensable d'adopter de bonnes pratiques et ce, qu'on travaille seul ou en équipe. C'est même plus important en PHP que dans d'autres langages à cause de son côté permissif. Et pour commencer, rien de tel que d'utiliser des standards déjà utilisés dans d'autres développements et je pense que ceux de ZF (ou de Sf -mais ce sera en anglais-) sont une très bonne base. Rien n'empêche par la suite (j'insiste sur le par la suite) d'adopter un style en fonction de ses préférences ou d'aller vers d'autres conventions.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

18 févr. 2012, 21:49

Wé enfin de la méthode je veux bien mais de la a vendre la chose comme ultime c'est comme le formateur qui a introduit ce genre de chose avec en sous entendu sinon ça marche pas.

Perso j'ai jais commencé une méthode par une majuscule et je m'en sort très bien ;)

Donc bref tant que l'on s'y retrouve ça va ;)

Pour le reste je reste convaincu que la modélisation est la première chose à faire plutôt que de ce dire qu'une méthode serais mieux statique ou qu'il faut faire un singleton.
Pour la classe utilitaire j'orienterais vers php5.4 et les traits ;)

@+
Il en faut peu pour être heureux ......