2013-08-05 4 views
2

Disons que nous avons une classe avec seulement 1 fonction, par exemple: calculer DFS. Laquelle des approches suivantes est préférée et pourquoi?Meilleures pratiques constructeurs

Approach 1: 

public class DFS { 

    public DFS(Graph g) { 
     dfs(g); // <--- computation invoked from constructor. 
    } 

    private void DFS(Graph g) { 
     // do dfs traversal 
    } 
} 

Client: 
DFS dfs = new DFS(graph); 


Approach 2: 
public class DFS { 
    Graph g; 
    public DFS(Graph g) { 
     this.g = g 
    } 

    private void doDFS() { 
     // do dfs traversal 
    } 
} 

Client: 
DFS dfs = new DFS(graph); 
dfs.doDFS(); 
+1

Comment un résultat va-t-il être transmis à l'appelant? Est-ce que la traversée a des effets secondaires? – Thilo

Répondre

3

Ce dernier. La convention est que le constructeur crée un objet vide qui est prêt à travailler, pas un objet qui commence immédiatement à fonctionner.

Bien que les deux fonctionneront, le premier n'est pas clair.

7

Constructors sont destinés à initialiser les champs de données dans l'objet. Compte tenu des choix, la deuxième approche semble plus correcte.

Bien que ce qui pourrait être mieux est d'inclure la méthode doDFS dans votre objet graphique. C'est généralement une mauvaise pratique de créer une classe entière pour une seule fonction simple. La méthode doDFS est spécifique aux graphes avec lesquels elle travaille, donc l'inclure dans la classe de graphes que vous avez est naturel.

+0

Je choisis aussi le second comme si vous utilisiez IOC et l'injection de dépendances plus tard, le pattern sera comme le second. –