Вибачте за вафельний заголовок - якби я міг придумати стислий заголовок, мені не доведеться ставити питання.
Припустимо, у мене є незмінний тип списку. Він має операцію, Foo(x)
яка повертає новий незмінний список із вказаним аргументом як додатковий елемент в кінці. Отже, для складання списку рядків зі значеннями "Привіт", "незмінний", "світ" ви можете написати:
var empty = new ImmutableList<string>();
var list1 = empty.Foo("Hello");
var list2 = list1.Foo("immutable");
var list3 = list2.Foo("word");
(Це код C #, і мене найбільше цікавить пропозиція C #, якщо ви вважаєте, що мова важлива. Це не принципово мовне питання, але ідіоми мови можуть бути важливими.)
Важливим є те, що існуючі списки не змінені Foo
- так empty.Count
би все одно повернути 0.
Ще одним (більш ідіоматичним) способом досягнення кінцевого результату буде:
var list = new ImmutableList<string>().Foo("Hello")
.Foo("immutable")
.Foo("word");
Моє запитання: яке найкраще ім’я для Фоо?
EDIT 3 : Як я виявив пізніше, назва типу може насправді не бути ImmutableList<T>
, що робить позицію зрозумілою. Уявіть собі, натомість, що це TestSuite
і що це незмінне, оскільки вся структура, до якої вона входить, незмінна ...
(Кінець редагування 3)
Варіанти, які я придумав поки що:
Add
: поширений у .NET, але передбачає мутацію вихідного спискуCons
: Я вважаю, що це нормальна назва у функціональних мовах, але безглуздо для тих, хто не має досвіду таких мовPlus
: мій улюблений поки що, це не означає для мене мутації . Мабуть, це також використовується в Haskell, але з дещо іншими очікуваннями (програміст Haskell може очікувати, що він додасть два списки разом, а не додавати одне значення до іншого списку).With
: відповідає деяким іншим незмінним умовам, але не має такої ж «доповнення» до ІМО.And
: не дуже описовий.- Перевантаження оператора для +: мені це дуже не подобається; Як правило, я думаю, що операторів слід застосовувати лише до типів нижчого рівня. Я готовий переконати, хоча!
Критерії, які я використовую для вибору:
- Створює правильне враження про результат виклику методу (тобто, це вихідний список із додатковим елементом)
- Зробити це максимально зрозумілим, що він не мутує існуючий список
- Звучить розумно, коли це пов'язано разом, як у другому прикладі вище
Будь ласка, запитайте детальніше, якщо я не даю про себе зрозуміти ...
EDIT 1: Ось мої міркування для вважаючи за краще , Plus
щоб Add
. Розглянемо ці два рядки коду:
list.Add(foo);
list.Plus(foo);
На мій погляд (і це є особиста річ) останній явно глючить - це як лист «х + 5;» як твердження самостійно. Перший рядок виглядає, що це нормально, поки ви не згадаєте, що це непорушно. Насправді, те, що оператор plus самостійно не мутує своїх операндів, є ще однією причиною, чому Plus
я мій улюблений. Без невеликої примхливості перевантаження оператора, він все ще надає ті самі конотації, які включають (для мене) не мутацію операндів (або мета методу в цьому випадку).
EDIT 2: Причини не подобається Додати.
Ефективні різні відповіді: "Ідіть з Add. Ось що і DateTime
робить, і String
є Replace
методи тощо, які не роблять незмінність очевидною". Я згоден - тут є пріоритет. Тим НЕ менше, я бачив багато людей називають DateTime.Add
або String.Replace
й очікувати мутації . Є безліч питань групи новин (і, мабуть, ТАК, якщо я викопаю), на які відповідає "Ви ігноруєте значення повернення String.Replace
; рядки незмінні, повертається нова рядок".
Тепер я повинен розкрити тонкощі питання - тип може насправді не бути незмінним списком, а іншим незмінним типом. Зокрема, я працюю над базовою схемою, де ви додаєте тести до набору, і це створює новий набір. Можливо, очевидно, що:
var list = new ImmutableList<string>();
list.Add("foo");
не збирається нічого домогтися, але стає набагато муткішим, коли зміниш його на:
var suite = new TestSuite<string, int>();
suite.Add(x => x.Length);
Це виглядає так, що має бути гаразд. Враховуючи це, для мене, помилка стає яснішою:
var suite = new TestSuite<string, int>();
suite.Plus(x => x.Length);
Це просто прохання бути:
var suite = new TestSuite<string, int>().Plus(x => x.Length);
В ідеалі я хотів би, щоб моїм користувачам не було сказано, що тестовий набір незмінний. Я хочу, щоб вони потрапили в яму успіху. Це може бути неможливо, але я б хотів спробувати.
Прошу вибачення за занадто спрощене початкове запитання, говорячи лише про незмінний тип списку. Не всі колекції є такими ж самоописовими, як ImmutableList<T>
:)