2009-09-02 7 views

Répondre

2

Votre objectif devrait être de minimiser la duplication de code tout en maximisant la compréhensibilité. Ces deux sont souvent en désaccord. Vous pouvez vous retrouver avec une duplication de code minimale mais avoir 12 paramètres optionnels pour une fonction. Donc, quelques conseils généraux:

  • Envisager l'emballage des fonctionnalités communes dans une troisième fonction, puis les deux fonctions peuvent appeler à la fois que nécessaire;
  • L'utilisation d'un objet ou d'un tableau d'arguments a plus de 3-4 paramètres pour une fonction;
  • La duplication de code doit être minimisée et non complètement éliminée. Parfois, la solution la plus claire implique une certaine quantité de duplication de code;
  • Le but d'une fonction ou d'un objet doit être clair. Si ce qu'il fait change complètement en fonction d'un paramètre, alors vous allez probablement confondre les gens.

Avec votre cas, je pense que vous voudriez finir avec quelque chose comme:

function get_recipes($offset, $limit) { 
    // execute query and get resource 
    $ret = array(); 
    while ($row = mysql_fetch_assoc($rs)) { 
    $ret[] = build_recipe($row); 
    } 
    return $ret; 
} 

function get_recipe($id) { 
    // execute query and get row object 
    return build_recipe($row); 
} 

function build_recipe($row) { 
    // construct a recipe object from the row 
} 
+0

En fait, je l'ai combiné get_recipe et get_recipes. Si l'identifiant est défini et que les autres paramètres sont NULL, il ne renvoie qu'un seul champ, etc. – alimango

+0

Je pense que c'est potentiellement un peu déroutant, mais c'est difficile à dire sans détails. En règle générale, je préfère un schéma comme j'ai fait qui a clairement nommé les fonctions (bien que ces trois pourraient être mieux nommés) qui utilisent la décomposition fonctionnelle pour réduire la duplication. – cletus

+1

Je suis d'accord avec Cletus en séparant le 'get_recipe' de' get_recipes'. Il sera plus facile pour celui qui tiendra votre code de comprendre votre code. – Randell

1

En général, pour plus de clarté, une fonction doit faire une seule tâche. Cependant, "obtenir N lignes" est une tâche unique - même lorsque N == 1; donc je dirais que cette affaire est qualifiée, c'est-à-dire que la fonction n'est PAS vraiment "multi-usage"! -)

Questions connexes