2009-08-06 5 views
4

De temps en temps j'écris une fonction qui crée juste quelque chose si elle n'est pas encore là et ne fait rien autrement.
Des noms comme CreateFooIfNecessary() ou EnsureThereIsAFoo() fonctionnent mais ils se sentent un peu maladroits.Nom de fonction pour créer quelque chose s'il n'est pas encore là

On pourrait aussi dire GetFoo() mais ce nom n'implique pas vraiment que foo peut être créé en premier et cela ne fonctionne que si la fonction retourne un handle/pointeur/référence à foo.

Est-ce que ceux d'entre vous qui connaissent mieux la langue anglaise peuvent trouver un meilleur moyen de nommer ces fonctions?

+4

I ♥ KungFoo() semble agréable. – gramm

+0

@gramm hahaha Je pourrais imaginer la position ... – pageman

Répondre

18

Que diriez-vous GetOrCreate()

+0

GetOrCreateFoo() – mihail

3

Ceci est généralement connu comme création paresseuse. Que diriez-vous de LazyGetFoo()?

13

MISE À JOUR

Je sais mieux ces jours-ci, et pourrait donc appliquer la requête de commande de séparation (CQS). CQS dit qu'une méthode devrait soit état de mutation, ou retourner un résultat, jamais les deux.

En conséquence, ma norme actuelle est:

Foo GetFoo(id); // Throws if Foo cannot be found for id 
Foo FindFoo(id); // Returns null if the Foo cannot be found. 
void CreateFoo(id[, args]); // Creates a Foo with supplied args. 

VIEUX POST - IGNORE

Souvent, j'utilise cette norme:

GetFoo(); // Always returns a Foo, so creates if there isn't one already. 
FindFoo(); // Returns null if the Foo cannot be found. 

Particulièrement utile dans l'accès aux données, lorsque vous chargez un employé ou quelque chose en fonction d'une clé, et cela peut exister ou non.

Pour être précis - il s'agit d'une norme de codage documentée. Tout le monde qui travaille sur le code connaît cette norme et l'implémente de la même manière. Voilà comment nous pouvons nous en sortir avec ces gentils noms courts qui sont assez génériques.

+0

Bien que votre réponse a la meilleure note, je vais pour GetOrCreate. Comme vous l'avez dit, cela doit être une norme de codage; sinon, cela pourrait ne pas être évident. – foraidt

+0

Le but d'une norme de codage est qu'elle ne doit pas être évidente. Le préfixage d'une variable avec des traits de soulignement n'est pas évident qu'il s'agit d'une variable de membre privée **, sauf si vous saviez déjà qu'il s'agissait d'une norme **. L'idée ici est que vous obtenez le meilleur des deux mondes - de beaux noms courts, mais une norme documentée qui indique aux gens ce qu'ils veulent dire. –

+0

Sans doute, GetOrCreate est un peu une fuite d'abstraction. Vous allez être dans l'une des situations suivantes: –

1

Je les appelle RequireFoo().

+1

Je l'utiliserais si la méthode * ne renvoyait pas la valeur. –

-5

Sérieusement:

issetFoo(); 

Prendre le Piss:

AreWeThereYetFoo(); helloFoo(); booFoo(); 
+0

merci pour le bon rire .. – nawfal

0

Dans mon Foo classe j'aurais GetExistingOrNew (id Guid) Ce serait retourne un Foo existant s'il existe ou retourne un nouveau Foo.

3

donc vous voulez être un créateur, non? puis ...

LetThereBeFoo(); 

hehehe

pour vérifier si elle existe

IsThereFoo(); 
2

Je pense juste avoir CreateFoo() est très bien. La documentation devrait indiquer ce que la fonction fait dans différents scénarios. Regardez quelques-unes des API d'E/S de fichiers, par exemple le CreateFile (...) de l'API Win32. Basé sur un paramètre, il va créer un nouveau fichier ou en ouvrir un existant s'il existe. Le vôtre ne doit pas être basé sur un paramètre, mais son comportement peut être différent en fonction de l'état du programme. Donc, fondamentalement, je pense que le vôtre pourrait être dans le même sens.

3

Pourquoi ne pas:

private FooType m_foo; 

public FooType Foo 
{ 
    get 
    { 
     if (this.m_foo == null) 
     { 
     this.m_foo = new Foo(); 
     } 
     return this.m_foo; 
    } 
    set 
    { 
     this.m_foo = value; 
    } 
} 
1

S'il est clair que seul un objet Foo existera, je venais de l'appeler CreateFoo(), car vous attendez plusieurs appels pour créer uniquement l'objet une fois. Si vous renvoyez la valeur, je l'appellerais simplement GetFoo(), car le chargement paresseux est (probablement) un détail d'implémentation, et en tant que tel, ne devrait pas être évident dans l'interface.

Si plusieurs objets Foo peuvent être créés et qu'ils ne sont pas retournés, alors je ne suis pas sûr. Cela ressemble à une situation assez étrange pour commencer.

0

J'aime ForceFoo. Dans votre situation, ce serait EnforceExistanceOfFoo ou ForceGetFoo.

0

J'ai récemment commencé à utiliser defineFoo() comme je suis tombé malade de getOrCreateFoo()

Questions connexes