2010-08-12 4 views
1

J'importe des produits et j'ai donc une classe d'importation de produits. Il a environ 4000 lignes donc je veux le casser. J'ai commencé à le casser mais j'ai de la difficulté à décider ce qui devrait être une classe et ce qui ne devrait pas l'être. Je pense que toutes mes méthodes utilisent trois des mêmes variables d'instance, donc si je séparais les méthodes, je passerais dans ces variables d'instance à chaque classe séparée dans son constructeur. L'une des façons dont j'ai commencé à briser cette situation était d'examiner des groupes de méthodes qui traitaient du même type de données sur les produits. Par exemple, certaines méthodes fonctionnaient avec des descriptions de produits et certaines fonctionnaient avec des catégories de produits. J'ai donc commencé à les séparer en classes distinctes, mais quelqu'un m'a dit que si ces différentes classes utilisaient les mêmes trois instances, elles devraient probablement être combinées en une seule classe. . Alors, comment je fais ça? Je ne comprends pas vraiment la conception de classe et je ne faisais que les séparer parce qu'il était difficile de trouver du code dans la grande classe.Refactorisation d'une grande classe

Si la question est perdue, quels conseils donneriez-vous à une nouvelle classe? Est ce que j'ai proposé ci-dessus une bonne solution et devrais-je ré-factoriser une classe où toutes les méthodes utilisent les mêmes trois variables d'instance. Cette application est une application asp.net qui prend les données produit de la base de données d'un système A et, en fonction d'une pléthore de paramètres et de configuration, l'utilisateur peut choisir, enregistre les données du produit dans la base de données du système B. Par exemple ....

public class ProductImporter 
{ 
    ProductA productA; 
    ProductB productB; 
    ImportSettings settings; 

    public void GetProductADescription() 
    { 
     //look at the settings and add productB description to productA 
     productA.Desc = productB.Desc; 
     //.... 
    } 

    //.... tons of methods that all deal with product moving one product to the other 

    public void AddProduct() 
    { 
      //go through all the settings 
      productA.Save(); 
     } 

} 
+0

Je ne vois pas le point de question; vous pouvez faire une certaine conception d'opp et réécrire votre code ou, faire la conception d'opp avec un code de séparation. – Svisstack

+0

Peut-être que ces trois variables d'instance devraient être une classe qui leur est propre (quelque chose comme current_state) qui est transmise et manipulée par les autres classes? Difficile à dire quand vous ne décrivez pas leur but, mais la possibilité ne semble pas trop farfelue quand même. –

Répondre

0

Vous pouvez

  • Do nouveau design de la PPO et de réécrire votre code de l'ancienne classe à nouveau.
  • Exécutez la conception OPP pendant le découpage d'objet.

Et si

  • Vous avez une fonction à obtenir seulement des arguments de la pile et à ne pas utiliser membres de la classe; vous pouvez simplement copier, coller cette fonction de l'ancienne classe à la nouvelle, et la refactoriser dans un nouvel environnement.
0

Votre objectif de refactoriser les classes est un bon. Les classes plus petites sont généralement meilleures que les classes plus grandes. Cependant, un mauvais refactor pourrait vous mettre dans un endroit pire que là où vous avez commencé.

Je vous suggère de passer du temps à lire sur les bons modèles de conception Java. Vous pouvez apprendre beaucoup de Head First Design Patterns (http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124) entre autres ...

+0

Puisqu'il ne spécifie pas de langage, les "modèles de conception Java" peuvent ne pas s'appliquer. Bien que les modèles soient quelque peu indépendants du langage, un modèle courant dans une langue peut être rare ou même totalement inapplicable à un autre. –

3

Peut-être que vous devriez encapsuler ces trois variables d'instance dans une autre classe. Code seulement traite de ces variables peuvent aller dans la nouvelle classe; code qui utilise également autres variables peuvent rester dans la classe existante. Vous devez ensuite remplacer les trois variables d'instance existantes par une variable du nouveau type.

Cela suppose que les trois variables ont vraiment du sens à encapsuler ensemble. Votre description suggère c'est le cas (car ils sont souvent utilisés ensemble), mais il est très difficile à dire sans plus d'informations. Sans connaître les détails de ce que cette classe est censée faire, ce que les trois variables d'instance représentent, ou quel autre état est dans la classe existante, nous ne faisons que deviner.Une chose à considérer: ces trois variables seraient-elles logiquement groupées ensemble autre que dans votre classe existante?

+0

J'ai ajouté plus d'informations sur l'application – user204588