web-dev-qa-db-ja.com

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

ほとんどの工場のようなメソッドはcreateで始まると思います。しかし、なぜ「 create 」と呼ばれるのですか?なぜ「 make 」、「 produce 」、「 build 」、「 generate 」などではないのですか?味の問題だけですか?コンベンション?または、「作成」に特別な意味がありますか?

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

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

123
deamon

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

  • 「作成」は、他のほとんどの単語よりも機能に適しています。私が頭の中で一番思いつくのは、「構築」です。過去には、「Alloc」(allocate)が同様の状況で使用されていた可能性があります。これは、Cなどの言語のオブジェクトよりもデータのブロックを重視しているためです。

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

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

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

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

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

101
Jason Williams

Joshua Bloch 「Effective Java」 次の命名規則を推奨

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

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

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

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

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

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

86
Jofsey

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

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

  2. グアバは、工場の命名のアイデアの優れたリポジトリです。 Nice DSLスタイルを普及させています。例:

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

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

Builderパターンとの適合性が高いため「ビルド」を避け、プロデューサー/コンシューマーを連想させるため「プロデュース」を避けます。

パターンの「工場」名の比phorを本当に続けるために、「製造」に誘惑されるでしょうが、それは長すぎる言葉です。

9
Don Roby

「to create an object」に由来すると思います。しかし、英語では、「作成する」という言葉は、「自然に進化しないか、通常のプロセスでは作られないユニークなものとして生まれる」という概念に関連付けられており、「自分の考えから進化するか、だから、「作成」はnot使用する適切な言葉であるように思われます。一方、「作る」とは、「素材の形を変えたり、変更したり、パーツを組み合わせたりして、存在させること」を意味します。たとえば、create a dress、you makeドレス(オブジェクト)。だから、私の意見では、「作る」という意味で「作る」。存在または発生する原因; 「もたらす」は、ファクトリーメソッドのはるかに優れたWordです。

3

一部は慣習、一部はセマンティクス。

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

2
Amadan

新品が好きです。私に

var foo = newFoo();

より良く読む

var foo = createFoo();

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

1
rjax

私はそれを呼ぶだろうUriFactory.Create()

どこで、

UriFactoryは、Uriインスタンスを作成するメソッドを提供するクラスタイプの名前です。

Create()メソッドは、仕様のバリエーションと同じくらいオーバーロードされます。

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

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

私はすべての動詞を見てきましたが、いくつかのライブラリなどで使用されていることを指摘したいと思いますので、普遍的な慣習であるとは呼びません。

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

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

0
Vinko Vrsalovic

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

単純な古いObjective CのinitWithも良いものです!

0
willsquire