メソッドのようなファクトリーに名前を付けるには?


146

ほとんどのファクトリーライクなメソッドはで始まると思いますcreate。しかし、なぜ「作成」と呼ばれるのですか?「make」、「produce」、「build」、「generate」、または他の何かをしてみませんか?それは好みの問題だけですか?慣習?それとも「作成」には特別な意味があるのでしょうか?

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

一般的にどちらを選択しますか?その理由は?


4
私はかつて、ファクトリー・メソッドを「get()」と名付けるプロジェクトに取り組みました。最初は非常に混乱します。
Muxecoid 2012

4
そして最後のオプション、接頭辞はどうですか?私たちはほとんど常に静的なコンテキストからのファクトリを使用しているので、それは明確ではないでしょうか?議論を促すために尋ねるだけです-私の個人的な好みはcreateXyz()です。
vikingsteve 2013年

@vikingsteve私が構築したシステムではcreate、APIの一貫性を保つため、また、文字cを入力するだけですべての文字がIDEのオートコンプリートに表示されるため、慣習として接頭辞を使用しました。何が利用できるかを学ぼうとしている人のために。私が持っていた可能性がありMatrix4f.identity()Matrix4f.transpose()などが、彼らは通りを見つけるために速くなるだろうMatrix4f.createIdentity()Matrix4f.createTranspose(...)など、
code_dredd

回答:


117

いくつかのランダムな考え:

  • 「作成」は、他のほとんどの単語よりも機能に適しています。次に頭に浮かぶ言葉は「構築」です。以前は、Cのような言語のオブジェクトよりもデータブロックに重点が置かれていることを反映して、 'Alloc'(割り当て)が同様の状況で使用された可能性があります。

  • 「作成」は、明確で直感的な意味を持つ短くて単純な単語です。ほとんどの場合、人々はおそらくそれを、何かを作成したいときに頭に浮かぶ最初の最も明白な単語として選択するだけです。これは一般的な命名規則であり、「オブジェクトの作成」は、オブジェクトの作成プロセスを説明する一般的な方法です。

  • 「構築」は近いですが、通常はオブジェクトの作成プロセスの特定の段階(割り当て/新規、構築、初期化...)を説明するために使用されます

  • 「ビルド」と「作成」は、コードのコンパイルに関連するプロセスの一般的な用語であるため、プログラマーには異なる意味合いがあり、多くのステップとおそらく多くのディスクアクティビティを含むプロセスを意味します。ただし、何かを「構築する」ファクトリのアイデアは賢明なアイデアです。特に、複雑なデータ構造が構築される場合や、多くの個別の情報が何らかの方法で結合される場合は特にそうです。

  • 「生成」とは、ハッシュコードや乱数の生成など、入力から値を生成するために使用される計算を意味します。

  • 「作成」、「生成」、「作成」は「作成」よりも入力/読み取りに時間がかかります。歴史的に、プログラマーは入力/読み取りを減らすために短い名前を好んでいました。


5
「作成」に
賛成

103

「Effective Java」のJoshua Bloch は、次の命名規則を示唆しています。

valueOf —大まかに言えば、パラメータと同じ値を持つインスタンスを返します。このような静的ファクトリーは、実質的に型変換メソッドです。

of — (Item 32)valueOfによって普及したの簡潔な代替物EnumSet

getInstance —パラメータによって記述されているが、同じ値を持つとは言えないインスタンスを返します。シングルトンの場合は、 getInstanceパラメータをとらず、唯一のインスタンスを返します。

newInstance —に似ていますが、返される各インスタンスが他のすべてのインスタンスと異なるgetInstanceことをnewInstance保証します。

get Type —に似てgetInstanceいますが、ファクトリメソッドが別のクラスにある場合に使用されます。Typeは、ファクトリメソッドによって返されるオブジェクトのタイプを示します。

new Type —に似てnewInstanceいますが、ファクトリメソッドが別のクラスにある場合に使用されます。Typeは、ファクトリメソッドによって返されるオブジェクトのタイプを示します。


どのように評価しfromますか?例えば、仮定を取るId.of("abc")Id.from("xyz")...またはでしょうfrom起こっ以上のロジックを示唆して(他のデータと/からの入力すなわち、解析、検索/相関、...)?"of vs from"を検索するのは本当に難しい:D
knittl

22

他の回答にはないポイントをいくつか追加したかった。

  1. 従来、「ファクトリー」は「オブジェクトを作成する」ことを意味していましたが、「期待どおりに動作するオブジェクトを返す」とより広く考えたいと思います。まったく新しいオブジェクトかどうかを常に知る必要はありませんが、実際には気にしないかもしれません。したがって、適切なケースでは、たとえそれが現在それを実装している方法であっても、「作成...」の名前を避けることができます。

  2. グアバは、工場のネーミングアイデアの良いリポジトリです。素敵なDSLスタイルを広めています。例:

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

1
そうです、Guavaは非常に読みやすいコードを備えた優れたライブラリーです。
デーモン

11

「作成」と「作成」は短く、合理的に刺激的であり、私が考えることができる命名における他のパターンに結び付けられていません。また、私はかなり頻繁に見たし、それらが「事実上の標準」であると疑っている。1つを選択して、少なくともプロジェクト内で一貫して使用します。(自分の現在のプロジェクトを見ると、「make」を使用しているようです。一貫しているといいのですが...)

「ビルド」はビルダーパターンとの相性が良いため避け、プロデューサー/コンシューマーを呼び起こすため「プロデュース」は避けてください。

パターンの「ファクトリー」名のメタファーを本当に続けるために、私は「製造」に誘惑されますが、それは長すぎる言葉です。


3

それは「オブジェクトを作成すること」に由来すると思います。ただし、英語では、「作成」という言葉は、「自然に進化しない、または通常のプロセスでは作成されないユニークなものとして生まれる」という概念、および「自分の思考から進化する、または芸術作品や発明としての想像力。」したがって、「作成」は適切な言葉ではないようです。一方、「つくる」とは、「素材を形づくったり、変えたり、パーツを組み合わせたりすることで実現する」という意味です。たとえば、あなたがいない作成するドレスを、あなたが作るドレス(オブジェクト)。だから、私の意見では、「作る」という意味で「作る」。存在または発生する原因 もたらす」とは、ファクトリーメソッドのはるかに良い言葉です。


3

新品が好きです。私に

var foo = newFoo();

よりよく読む

var foo = createFoo();

英語に翻訳すると、fooは新しいfooであるか、fooはcreate fooです。私は文法の専門家ではありませんが、後者は文法的に正しくないと確信しています。


どちらも機能します。createFoo関数です。fooではないcreateFooあなたが言うように、。fooの結果ですcreateFoo()
Krzysztof Czelusniak

2

一部は規約、一部はセマンティクス。

ファクトリメソッド(従来のによって通知されるcreate)は、適切なコンストラクタを呼び出す必要があります。私が見た場合buildURI、それは何らかの計算、または部品からの組み立てを含んでいると思います(そして、工場が含まれていたとは思わないでしょう)。私が見たときに最初に思ったのgenerateURIは、新しいパーソナライズされたダウンロードリンクのようなものをランダムに作成することです。それらはすべて同じではなく、異なる単語は異なる意味を呼び起こします。しかし、それらのほとんどは慣習化されていません。


1

私はそれを呼びます UriFactory.Create()

どこ、

UriFactoryUriインスタンスを作成するメソッドを提供するクラス型の名前です。

そしてCreate()この方法は、あなたのスペックを持っているのバリエーションの数だけのために過負荷になっています。

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

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

1
私はあなたの命名に同意しますが、Pascalで大文字小文字を区別したメソッド名を使用することについてのあなたの慣習には強く同意しません。
チャタタ

2
@Leviathlonは常にプログラミング言語と内部規約に依存します。Pascal Caseは、C#などの言語ではまったく問題ありません。
momo

@momoまさに、話されている言語はJavaだと思い込んでいたと思います。
Chatatata

0

私はすべての動詞を見たが、いくつかのライブラリーまたはその他で使用されている生成物を指摘したので、私はcreateを普遍的な規則であるとは呼びません。

さて、createは私にとってより良い音になり、アクションの正確な意味を呼び起こします。

ですから、それは(文学的な)好みの問題です。


0

個人的に私のようにinstantiateしてinstantiateWith、それのためだけに私UnityとのObjective Cの経験の。Unityエンジン内の命名規則はinstantiate、ファクトリーメソッドを介してインスタンスを作成するという単語を中心に展開しているようで、Objective C withはパラメーターが何であるかを示しているようです。これが本当に機能するのは、メソッドがインスタンス化されるクラスにある場合のみです(そしてコンストラクターのオーバーロードを許可する言語では、これはそれほど「もの」ではありません)。

単純に古いObjective C initWithもお奨めです。


-3

ファクトリーメソッドはメソッド名を指示しません。すべてのメソッドが同じファミリーからオブジェクトを返すことを条件に、ファクトリーにはいくつでもメソッドを含めることができます。

詳細については、URL http://xeon2k.wordpress.comにアクセスしてください


4
リンクは意味をなさないため、より具体的にする必要があります。
brunsgaard 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.