J'ai une fonction qui transforme un vecteur donné, mais peut aussi créer un tel vecteur d'elle-même si elle n'est pas donnée.
Je vois deux choix de conception pour un tel cas, si un paramètre de la fonction est facultative:
Faire un pointeur et d'en faire NULL
par défaut:
void foo(int i, std::vector<int>* optional = NULL) {
if(optional == NULL){
optional = new std::vector<int>();
// fill vector with data
}
// process vector
}
Ou ont deux fonctions avec une surcharge du nom, et qui laisse de côté l'argument:
void foo(int i) {
std::vector<int> vec;
// fill vec with data
foo(i, vec);
}
void foo(int i, const std::vector<int>& optional) {
// process vector
}
Sont là les raisons de préférer une solution plutôt que l'autre?
J'ai légèrement préfère la deuxième, parce que je peux faire le vecteur d'un const
de référence, puisqu'il est, lorsqu'il est fourni, seulement lu, écrit, non. Aussi, l'interface semble plus propre (n'est-ce pas NULL
juste un hack?). Et la différence de performance résultant de l'indirect appel de fonction est probablement optimisé loin.
Pourtant, je vois souvent la première solution dans le code. Existe-il des raisons impérieuses de le préférer, en dehors de programmeur de la paresse?