web-dev-qa-db-fra.com

Comment nommer des méthodes de type usine?

Je suppose que la plupart des méthodes de type usine commencent par create. Mais pourquoi sont-ils appelés " créer "? Pourquoi pas " faire ", " produire ", " construire ", " générer " ou autre chose? Est-ce seulement une question de goût? Une convention? Ou y a-t-il une signification particulière dans "créer"?

createURI(...) 
makeURI(...)
produceURI(...)
buildURI(...)
generateURI(...)

Laquelle choisiriez-vous en général et pourquoi?

123
deamon

Quelques pensées aléatoires:

  • "Créer" correspond mieux à la fonctionnalité que la plupart des autres mots. Le deuxième meilleur mot auquel je puisse penser du haut de ma tête est "Construire". Dans le passé, "Alloc" (allouer) aurait pu être utilisé dans des situations similaires, reflétant l'accent mis sur les blocs de données plutôt que sur les objets dans des langages comme C.

  • "Créer" est un mot court et simple qui a une signification intuitive claire. Dans la plupart des cas, les gens le choisissent probablement comme le premier mot le plus évident qui leur vient à l'esprit lorsqu'ils souhaitent créer quelque chose. C'est une convention de dénomination commune, et la "création d'objet" est une façon courante de décrire le processus de ... création d'objets.

  • 'Construct' est proche, mais il est généralement utilisé pour décrire une étape spécifique du processus de création d'un objet (allouer/nouveau, construire, initialiser ...)

  • "Build" et "Make" sont des termes communs pour les processus liés à la compilation de code, donc ont des connotations différentes pour les programmeurs, impliquant un processus qui comprend de nombreuses étapes et peut-être beaucoup d'activité sur le disque. Cependant, l'idée d'une usine "construisant" quelque chose est une idée sensée - en particulier dans les cas où une structure de données complexe est construite, ou de nombreuses informations distinctes sont combinées d'une certaine manière.

  • "Générer" implique pour moi un calcul qui est utilisé pour produire une valeur à partir d'une entrée, comme générer un code de hachage ou un nombre aléatoire.

  • "Produire", "Générer", "Construire" sont plus longs à taper/lire que "Créer". Historiquement, les programmeurs ont privilégié les noms courts pour réduire la saisie/lecture.

101
Jason Williams

Joshua Bloch dans "Java efficace" suggère les conventions de dénomination suivantes

valueOf - Retourne une instance qui a, en gros, la même valeur que ses paramètres. Ces usines statiques sont en fait des méthodes de conversion de type.

of - Une alternative concise à valueOf, popularisée par EnumSet (Item 32).

getInstance - Retourne une instance qui est décrite par les paramètres mais ne peut pas être considérée comme ayant la même valeur. Dans le cas d'un singleton, getInstance ne prend aucun paramètre et renvoie la seule instance.

newInstance - Comme getInstance, sauf que newInstance garantit que chaque instance retournée est distincte de toutes les autres.

getType - Comme getInstance, mais utilisé lorsque la méthode d'usine est dans une classe différente. Type indique le type d'objet renvoyé par la méthode d'usine.

newType - Comme newInstance, mais utilisé lorsque la méthode d'usine est dans une classe différente. Type indique le type d'objet renvoyé par la méthode d'usine.

86
Jofsey

Je voulais ajouter quelques points que je ne vois pas dans les autres réponses.

  1. Bien que traditionnellement "Factory" signifie "crée des objets", j'aime à y penser plus largement comme "me renvoie un objet qui se comporte comme je l'attends". Je ne devrais pas toujours avoir à savoir si c'est un tout nouvel objet, en fait, je m'en fiche. Donc, dans les cas appropriés, vous pourriez éviter un nom `` Créer ... '', même si c'est ainsi que vous l'implémentez en ce moment.

  2. La goyave est un bon référentiel d'idées de dénomination d'usine. Il popularise un style Nice DSL. exemples:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    
20
Iain

"Créer" et "créer" sont courts, raisonnablement évocateurs et ne sont pas liés à d'autres modèles de nommage auxquels je peux penser. J'ai également vu les deux assez fréquemment et je soupçonne qu'il pourrait s'agir de "normes de facto". J'en choisirais un et l'utiliserais au moins de manière cohérente dans un projet. (En regardant mon propre projet en cours, je semble utiliser "make". J'espère que je suis cohérent ...)

Évitez "construire" car il correspond mieux au modèle Builder et évitez "produire" car il évoque le producteur/consommateur.

Pour vraiment continuer la métaphore du nom "Factory" du motif, je serais tenté par "fabriquer", mais c'est trop long un mot.

9
Don Roby

Je pense que cela vient de "to create an object". Cependant, en anglais, le mot "create" est associé à la notion "de faire naître, comme quelque chose d'unique qui n'évoluerait pas naturellement ou qui n'est pas fait par des processus ordinaires", et "d'évoluer à partir de sa propre pensée ou l'imagination, comme une œuvre d'art ou une invention. "Il semble donc que" créer "est pas le mot approprié à utiliser. "Faire", d'autre part, signifie "faire exister en façonnant ou en changeant de matière, en combinant des pièces, etc." Par exemple, vous ne créez une robe, vous faire une robe (objet). Donc, à mon avis, "faire" en signifiant "produire; faire exister ou arriver; provoquer "est un bien meilleur mot pour les méthodes d'usine.

3
Frederik Krautwald

En partie convention, en partie sémantique.

Les méthodes d'usine (signalées par le traditionnel create) devraient invoquer les constructeurs appropriés. Si je voyais buildURI, je supposerais que cela impliquait un calcul ou un assemblage à partir de pièces (et je ne pense pas qu'il y ait eu une usine impliquée). La première chose à laquelle j'ai pensé quand j'ai vu generateURI est de créer quelque chose de aléatoire, comme un nouveau lien de téléchargement personnalisé. Ce ne sont pas tous les mêmes, des mots différents évoquent des sens différents; mais la plupart d'entre eux ne sont pas conventionnels.

2
Amadan

J'aime nouveau. Pour moi

var foo = newFoo();

lit mieux que

var foo = createFoo();

Traduit en anglais, nous avons foo est un nouveau foo ou foo est créer foo. Bien que je ne sois pas un expert en grammaire, je suis presque sûr que ce dernier est grammaticalement incorrect.

1
rjax

Je l'appellerais UriFactory.Create()

Où,

UriFactory est le nom du type de classe qui fournit les méthodes qui créent les instances de Uri.

et la méthode Create() est surchargée pour autant de variations que vous avez dans vos spécifications.

public static class UriFactory
{
    //Default Creator
    public static UriType Create() 
    {
    }

    //An overload for Create()
    public static UriType Create(someArgs) 
    {
    }
}
1

Je voudrais souligner que j'ai vu tous les verbes mais que je les utilise dans une bibliothèque ou une autre, donc je n'appellerais pas create une convention universelle.

Maintenant, créer me semble mieux, évoque le sens précis de l'action.

Alors oui, c'est une question de goût (littéraire).

0
Vinko Vrsalovic

Personnellement, j'aime instantiate et instantiateWith, mais c'est simplement à cause de mes expériences Unity et Objective C. Les conventions de dénomination à l'intérieur du moteur Unity semblent tourner autour du mot instantiate pour créer une instance via une méthode d'usine, et l'objectif C semble aimer with pour indiquer le ou les paramètres. Cela ne fonctionne vraiment bien que si la méthode est dans la classe qui va être instanciée (et dans les langages qui permettent la surcharge des constructeurs, ce n'est pas vraiment une "chose").

Tout simplement le vieux initWith de l'Objectif C est aussi un bon coup!

0
willsquire