Ce qui est un bon nom pour une méthode qui obtient ou crée un objet?
Dire que vous avez un cache, et une méthode qui permettra de faire quelque chose comme ce qui suit:
if (wanted Foo is not in cache)
cache.Add(new Foo())
Return Foo from cache
Que feriez-vous appel à cette méthode? GetFoo()
, GetOrCreateFoo()
ou quelque chose d'autre (et mieux)? Ou cela doit-il vraiment être divisé en deux méthodes?
Vous devez vous connecter pour publier un commentaire.
Dans la plupart des cas, un simple GetFoo suffit que l'appelant n'a pas besoin de savoir que vous êtes la création et la mise en cache il. C'est ce que l'encapsulation est tout au sujet.
Cependant, dans certains cas, la création est une opération coûteuse, il est donc utile de savoir que vous pouvez être en train de créer quelque chose sur la demande et, dans certains cas, il sera lente. Dans ce cas, une convention de dénomination rend plus clair de l'appelant. Dans ce cas, un GetOrCreate() ou Get(Options.CreateIfMissing) est un bon indicateur de l'appelant.
(Le comportement doit être indiqué dans la documentation, mais il est bon d'utiliser un nom de méthode qui rappelle aux gens au sujet des effets secondaires pendant la lecture du code, sans avoir à afficher et de lire la documentation pour chaque méthode qui est appelée)
Le genre de cas, je trouve cela passe le plus souvent est (par exemple) lors de la recherche d'un nœud de l'arborescence (par exemple dans un document Xml), vous pourriez avoir "CreateNode" (pour créer un nœud sans ajouter à l'arbre) et "AddNode" (pour ajouter un nœud de l'arbre). Dans ce cas, "d'Ajouter un nœud si elle n'existe pas déjà" doit avoir un autre nom descriptif, donc je vais utiliser quelque chose comme "EnsureNodeExists" afin de les différencier et de faire le but clair.
get
avec une sorte de clé unique. Dans ce cas, vous êtes probablement pas à la recherche d'une clé spécifique, mais pour différentes valeurs de colonnes, de sorte qu'ungetFooByWhatever
pourrait être adapté (évidemment pas en fait à l'aide dewhatever
).CreateIfMissing
libellé. Nice!Je sais je suis très en retard sur la question, mais ce que je peux proposer
GrabFoo()
de la convention pour obtenir-ou-créer-si-il vous manque afin de la différencier deGetFoo()
?À la recherche à la synonymes de
Get
, je vois plusieurs convenables des verbes, certains sont déjà couramment utilisé comme méthode de verbes. Par exemple,Fetch
déjà connote aller chercher quelque chose à partir d'un système externe. (par exemple, base de données ou d'un réseau)Grab semble être rarement utilisé, et peut-être porteurs d'une (quoique faible) sémantique de la
I want you to get-or-create it, no matter what.
Comment sur
Getsert
? deget
ouinsert
, depuisupdate
ouinsert
estUpsert
Si je n'ai pas vu de populaire cadres de l'utilisation de ce terme, mais ceci est conforme à l'idée que @Jason Williams a souligné, que:
Getsert
me fait penser àget
+assert
, qui a un sens différent.Ma préférence est GetFoo(), que l'action du point de vue de l'appelant et le cache est plus d'un détail d'implémentation.
Je l'appellerais
GetFoo
, au motif que la appelant ne se soucie pas de savoir s'il va être donné un nouveau ou déjà créésFoo
- il veut justeGet
unFoo
.D'un cache, je voudrais simplement appeler GetFoo(). Un cache est conçu pour agir comme une façade derrière une source de données afin que les utilisateurs puissent facilement accéder à des éléments sans se soucier de la façon dont ils sont ou ne sont pas en cours de chargement.
Je l'appellerais GetFoo, mais le document que si l'objet demandé n'est pas dans le cache, le cache pour le charger (et tout le potentiel de performance des répercussions que pourrait avoir).
Une autre option qui a de sens que si vous êtes référentielle transparent ou l'objet est un singleton.
Parfois un
getOrCreate()
appel est vraiment paresseux de l'initialisation. Ainsi, vous voulez créer un objet et si elle a déjà été créé à renvoyer une référence. Dans ce cas, je voudrais appeler la méthodelazyGet
qui est aussi utilisé dans d'autres bibliothèques, comme javaslang paresseux.Cela a un avantage sur le site d'appel. Si votre appel est coûteux dans un contexte de création de votre destinataire sait que désireux d'initialisation peuvent être utilisées pour déplacer le coût de l'appel pour un non section critique de votre programme.
P. S.: Il est aussi utilisé pour memoization, qui est une technique d'optimisation où vous retournez les Objets mis en cache de données immuables-structures.
Les mots
obtain
etacquire
semblent être bien équipé. Surtoutobtain
:On pourrait dire que dans votre cas, l'appelant de la méthode obtient le foo.
J'irais pour seulement
GetFoo()
tout comme la plupart des gens ont mentionné ici.Raison est - La méthode est responsable du retour de l'instance de l'objet. C'est sa principale responsabilité. Si l'objet n'est pas créé, puis de créer l'objet mis en cache, puis le retourner. les appelants externes, n'a pas besoin de s'embêter quelle méthode interne ne retourner l'objet, les appelants appellent simplement GetFoo() chaque fois que nécessaire. Méthode GetFoo() encapsule et masque la complexité de la création et de la mise en cache de l'objet. donc
GetFoo()
Je sais que le sujet a 6 ans. Mais... je pense que le meilleur nom est
ou
comme dans la classe singleton.
- Je utiliser
Take
au lieu deGet
. Pourquoi:take
aussi sonne un peu commemake
take
a le même sens queget
dans le contexte donnétake
sons plus puissante que lesget
, donc si je ne peux pasget
, je vais justetake
ilEngendrent
Quelques définitions qui semblent correspondre:
Le mot se décompose en deux idées dans votre question.
Être = crée
Obtenir = obtient
Plus de sa très courte.
Une autre alternative est Résoudre.
J'emprunte ce mot à partir de Autofac, qui utilise Régler les modalités de vous obtenir une instance d'un objet, ou le créer si nécessaire.
Je dirais que c'est "getFoo()" et les ajouter à vos commentaires ce que la fonction ne s'Foo n'est pas nulle.
Cela dépend de quel type d'objet qui ont du sens pour l'utilisateur.
Si la création n'est pas important pour l'utilisateur, il est GetFoo; sinon, appeler createOrGetFoo.
Si la différenciation des concepts est nécessaire, vous pourriez avoir des méthodes comme GetFoo, CreateFoo et createOrGetFoo.
Je préfère le nom que GetFoo en fonction de votre information.
En supposant que cette méthode est sur un cacheManager puis fetch(voulu) [ou get(voulu) en fonction de votre pref] est assez - avec l'API doc indique que l'élément est créé si il n'existe pas.
Voulais qui doit être tapé en conséquence, il n'ya donc pas besoin de Foo dans le nom de la méthode.
Si cette conception est tout à fait logique dans votre application, puis je pense que
GetOrCreateFoo
est un nom approprié.Une autre approche, qui expose clairement son but serait
Bien sûr, si nous sommes réellement en train de parler cache la mise en œuvre de côté pourrait ne pas se préoccuper de savoir si ou non l'élément a été créé. Le ci-dessus s'applique dans les cas où l'appelant a fait réellement besoin de savoir à propos de la possible création d'
Foo
et de ses implications (comme lors de la récupération du système de fichiers ou une base de données, peut-être?)GetOrCreateFoo
: Je ne suis pas d'accord ici. La méthode devient l'objet de foo, si elle n'est pas créée, il va créer l'objet, le mettre en cache et retourne l'objet. la création et la mise en cache est trop interne à l'avant-plan de la méthode doivent donc pas êtreGetOrCreateFoo
.FileMode.OpenOrCreate
dansSystem.IO.File.Open
)