2010-11-23 25 views
0

Je vous écris actuellement un analyseur de fichier texte pour plusieurs formats. Pendant que le fichier texte est analysé, il existe différents types d'opérations à effectuer. J'essaie de faire quelque chose de propre en utilisant OOP. Voici où je suis coincé:Parser pour plusieurs formats et plusieurs opérations (motif de conception disponible?)

abstract class Parser 
{ 
    abstract protected function DoSomeStuff($data); 

    public function Parse($src) 
    { 
     if ($this->GetFormat($src) == 1) 
     {      
      $data =$this->GetSomeDataFromFormat1($src); 
      DoSomeStuff($data); 
     } 
     if ($this->GetFormat($src) == 2) 
     { 
      $data = $this->GetSomeDataFromFormat2($src); 
      DoSomeStuff($data); 
     } 
    } 
} 

class DoSomething extends Parser 
{ 
    protected function DoSomeStuff($data) 
    { 
     // Doing some stuff with data 
    } 
} 

class DoSomethingElse extends Parser 
{ 
    protected function DoSomeStuff($data) 
    { 
     // Doing some other stuff with data 
    } 
} 

$ds = new DoSomething(); 
$ds->Parse(...); 

$dse = new DoSomethingElse(); 
$dse->Parse(...); 

Comme vous pouvez le voir tout le code pour tous les formats de fichiers est en classe Parser. Que puis-je faire pour rendre ce produit plus propre?

Merci Antoine

Répondre

0

Il est généralement une bonne idée de suivre un 1-classe par fichier règle.

Autre que cela, il n'y a pas beaucoup plus que vous pouvez faire pour le nettoyer.

La seule autre chose que de décider comment vous voulez charger chaque fichier de classe, qui peut être fait de plusieurs façons. Je suggère de faire une classe d'usine avec un registre.

+0

convenu re: le 1-classe par fichier règle. –

+0

Voir Matt Ball réponse: Stratégie Pattern base peut rendre mon code plus propre et plus de POO. L'application de ce modèle fait une classe par format et une classe par "opération". Une classe globale fait la "colle" entre les formats et les opérations (je veux ça avec ça). – Antoine

0

retourne getFormat et int ce n'est pas facile pour un utilisateur de comprendre ce que int est ce que ce serait mieux si vous êtes revenu quelque chose comme « CSV » ou « XML »

une autre est

if ($this->GetFormat($src) == 1) 
{ 
} 
if ($this->GetFormat($src) == 2) 
{ 
} 

//This should be a switch 
$src = $this->getFormat($src); 

switch($src){ 
    case 1: 

    break; 
    case 2: 

    break; 
} 

Cela empêche alors le code de chargement d'une méthode deux fois quand il peut le faire une fois, et un interrupteur est moins de mémoire que si un

et le dernier que je peux repérer est

GetSomeDataFromFormat1 et GetSomeDataFromFormat2

Cela pourrait être le code que vous nous avez donné, mais une classe abstraite ne doit jamais appeler d'autres méthodes abstraites ou des méthodes qui sont fournis dans cette classe, ils doivent demander à l'utilisateur de savoir qu'ils doivent ajouter 2 autre méthode que j'aime ce code, il est facile de lire ce qui est la chose principale dans le codage

+0

Merci pour votre commentaire ... Mais ce que vous avez commenté est pas mon problème :-) En fait, je voudrais éviter totalement la partie avec: if (GetFormat() == xx) {} et je voudrais éviter il en utilisant un objet – Antoine

+0

bien c'est le seul code qui pourrait être commenté: p, qu'est-ce que vous voulez que nous passions en revue? – Barkermn01

+0

Désolé vous avez raison, j'ai oublié de dire que j'ai eu un problème avec le design, pas le code lui-même (rapidement écrit comme pseudo-code). – Antoine