30
不変コレクションの非変更「追加」メソッドに最適な名前は何ですか?
気まずいタイトルで申し訳ありません-簡潔なタイトルを思い付くことができれば、質問する必要はありません。 不変のリストタイプがあるとします。Foo(x)最後に追加の要素として指定された引数を持つ新しい不変のリストを返す操作があります。したがって、値が「Hello」、「immutable」、「world」の文字列のリストを作成するには、次のように記述します。 var empty = new ImmutableList<string>(); var list1 = empty.Foo("Hello"); var list2 = list1.Foo("immutable"); var list3 = list2.Foo("word"); (これはC#コードであり、言語が重要だと思う場合は、C#の提案に最も興味があります。これは基本的に言語の問題ではありませんが、言語のイディオムは重要かもしれません。) 重要なことは、既存のリストはによって変更されないFooため、empty.Count0を返すことです。 最終結果に到達する別の(より慣用的な)方法は次のとおりです。 var list = new ImmutableList<string>().Foo("Hello") .Foo("immutable") .Foo("word"); 私の質問は、Fooの最高の名前は何ですか? 編集3:後で明らかにするように、型の名前は実際にImmutableList<T>はとは限らないため、位置が明確になります。代わりに、それがTestSuite不変であることを想像してください。それが含まれているフレームワーク全体が不変だからです... (編集終了3) これまでに思いついたオプション: Add:.NETで一般的ですが、元のリストの変更を意味します Cons:これは関数型言語では通常の名前だと思いますが、そのような言語の経験がない人には無意味です Plus:これまでのところ私のお気に入り、それは私に突然変異を意味するものではありません。どうやらこれはHaskellでも使用されているようですが、期待が少し異なります(Haskellプログラマーは、単一の値を他のリストに追加するのではなく、2つのリストを一緒に追加することを期待するかもしれません)。 With:他の不変の慣例と一致していますが、IMOとまったく同じ「追加機能」はありません。 And:あまり説明的ではない +の演算子のオーバーロード:本当にこれが好きではありません。一般に、演算子は下位レベルのタイプにのみ適用する必要があると思います。でも、私は説得されても大丈夫です! 私が選択に使用している基準は次のとおりです。 メソッド呼び出しの結果の正しい印象を与える(つまり、追加の要素を含む元のリストである) 既存のリストを変更しないことを可能な限り明確にする 上記の2番目の例のように連結すると妥当な音 はっきりしない場合は、詳細を尋ねてください... EDIT 1:ここに好むのための私の推論ですPlusしAdd。次の2行のコードを検討してください。 list.Add(foo); list.Plus(foo); 私の見解では(これは個人的なことですが)後者は明らかにバグがあります-「x + …