Каково лучшее название невидоизменения, “добавляет” метод на неизменном наборе?

Вы также можете просто использовать self вместо Chromosome. Также object не обязательно, я думаю.

from random import choice

class Chromosome():
    variable1 = [x for x in range(1,51)]
    variable2 = [x for x in range(51,101)]

    def __init__(self):
        self.var1 = choice(self.variable1)
        self.var2 = choice(self.variable2)
227
задан 8 revs, 4 users 67% 27 January 2012 в 15:36
поделиться

55 ответов

Я использовал бы конструктора.

Foo f1 = new Foo("one");
Foo f2 = new Foo(f1, "two");
Foo f3 = new Foo(f2, "three");

f1 содержит "тот". f2 содержит "один", "два". f3 содержит "один", "два", "три".

0
ответ дан Skip Head 23 November 2019 в 03:48
поделиться

Таким образом, я предполагаю, что метод, названный "ImmutableAdd ()", полностью слишком упрощен?

0
ответ дан Alex Baranosky 23 November 2019 в 03:48
поделиться

Как насчет "Палки" или "StickTo", это прикрепляет элемент на конец.

Или "Присоединение" или "AttachTo".

0
ответ дан 2 revs 23 November 2019 в 03:48
поделиться

мне Нравится И () . Я думаю, что это имеет наименее потенциальное для неоднозначности. Единственное столкновение, о котором я могу думать, с логическим И, я не вижу, что, будучи проблемой с разработчиком C# и даже для VB думаю, что контекст делает его вряд ли для порождения проблемы, и любая проблема была бы взята быстро во время компиляции. Это также работает хорошо в на английском языке, "Делают что-то к Ним И Что" или "Помещенный Они И Это в поле".

я думаю .With () является OK. Мое беспокойство - это, может немного походить на linq Where<> метод особенно, если существует лямбда как аргумент. Английский в моей голове также менее ясен особенно, "Делают что-то к Ним С Этим".

мне не нравится.Plus () . Я не могу закончить его, как Добавляет синоним для: плюс = знак "плюс" = + = добавляют.

0
ответ дан 7 revs 23 November 2019 в 03:48
поделиться

"добавьте ()"

факт, который это возвращает, новый список является несущественным, это - деталь реализации, показанная подписью. Основное действие, которое выполняет метод, "добавляет" новый элемент к списку. Как или что это deos или возвраты не должны быть частью имени метода. Если бы метод синхронизировался, который влиял бы на имя метода - "synchronizedAdd ()"??? - конечно, нет.

Классы как Строка, которые следуют за would-be-mutator шаблоном все еще, имеют имена действительно простого метода - ни один не составленные слова.

0
ответ дан mP. 23 November 2019 в 03:48
поделиться

. След подразумевает, что очень глубокое понимание списка не изменилось, этот объект запаздывает позади списка, это не было добавлено к нему.

var list = new ImmutableList<string>().Trail("Hello");
                                      .Trail("immutable");
                                      .Trail("word");
0
ответ дан Chris Marisic 23 November 2019 в 03:48
поделиться

Так как именем типа является ImmutableList, таким образом указывающий, что это, заражают неизменный, я думаю, что.Add () прекрасен. Однако, Если Ваше действительно настойчивое на чем-то еще, я мог бы пойти с чем-то как.AddEx (), где Исключая расширенными средствами и подразумевает, что пользователь должен определить то, что это Исключая (путем чтения документов) перед использованием. Мне также нравится предложение Плюс () и GetCopyWith ()

0
ответ дан shsteimer 23 November 2019 в 03:48
поделиться

Как насчет "Приращения"?

Это - другое слово от, Добавляют, но это - близкий синоним.

0
ответ дан nsayer 23 November 2019 в 03:48
поделиться

Я пошел бы для простого, Добавляют (). Альтернатива была бы, Добавляют (), если Вы хотите передать это, это - действительно операция набора.

В дополнение к явному методу, я все еще предложил бы реализовать obverloaded + operatr. Это - известная операция. Все знают, что Строка неизменна, все же все используют '+' для создания новых экземпляров из нее.

0
ответ дан Franci Penov 23 November 2019 в 03:48
поделиться

"Замена"? Это не добавляет к списку, это заменяет список новым.

0
ответ дан Paul Tomblin 23 November 2019 в 03:48
поделиться

Я прибываю немного поздно сюда, как насчет NewWith?

0
ответ дан Benjol 23 November 2019 в 03:48
поделиться

Я назвал бы это ToInclude

var empty = new ImmutableList<string>();
var list1 = empty.ToInclude("Hello");
var list2 = list1.ToInclude("immutable");
var list3 = list2.ToInclude("word");

идиоматически(?)

var list = new ImmutableList<string>().ToInclude("Hello");
                                      .ToInclude("immutable");
                                      .ToInclude("word");

Работы для случая, который Вы упомянули также.

var list = new ImmutableList<string>();list.ToInclude("foo");

var suite = new TestSuite<string, int>();suite.ToInclude(x => x.Length);
0
ответ дан 2 revslittlegeek 23 November 2019 в 03:48
поделиться

2 предложения:

А "бесплатная" функция:

Foo f = new Foo(whatever);
Foo fPlusSomething = Foo.Concat(f, something);

перегрузка конструктора А (который является, в некотором смысле, вариация на "свободную функциональную" тему):

Foo f = new Foo(whatever);
Foo fPlusSomething = new Foo(f, something);
2
ответ дан Éric Malenfant 23 November 2019 в 03:48
поделиться

Любое имя, которое подразумевает, что объект того же типа будет возвращен, должно быть прекрасным для использования. Плюс хорошее название этого, как будто Вы плюс два объекта Вы ожидаете, что результат будет возвращен.

Плюс просто не походит на корректное имя для использования в этом экземпляре, хотя, так как Вы - 'Plus'ing тест в набор тестов.

GetWith () походит на опцию мне. Или когда-либо GetTypeWith (), где тип является, очевидно, типом Ваше использование. Так, например:

var list = new ImmutableList<String>();
var list2 = list.GetWith("First");
var list3 = list2.GetWith("Second");

// OR

var list2 = list.GetListWith("First");

Получение подразумевает, что Вы получаете список, это уже содержится, и С подразумевает, что Вы хотите другой объект наряду с ним. CopyWith () также встретил бы это критерии.

Непосредственная проблема, которую я вижу с GetWith, состоит в том, что это не является легко отгадываемым. Разработчик хочет добавить комплект, не получить текущий комплект. Я сразу ввел бы.Add, и надежда intellisence показал что-то очень близко к тому, что я буду ожидать.

1
ответ дан Josh Smeaton 23 November 2019 в 03:48
поделиться

Очень поздно к игре, но как насчет Freeze . В WPF есть приоритет для использования Freeze и IsFrozen для проверки, является ли объект изменчивым. Конечно, это немного искажает значение в том смысле, что обычно Freeze () предназначен для того, чтобы сделать текущий объект неизменным, но если у него есть параметр, вы можете увидеть, что получаете что-то, что является неизменным.

var list = new ImmutableList<string>().Freeze("Hello")
                                      .Freeze("Fridgid")
                                      .Freeze("World");

В основном:

  1. Это одно слово.
  2. Коннотация вращается вокруг неизменности.
  3. Приоритет в WPF для «похожего» синтаксиса.
0
ответ дан 2 revs 23 November 2019 в 03:48
поделиться

Как насчет метода расширения? Вы можете назвать это Присоединиться к в этом случае. Будучи методом расширения, пользователи должны знать, что это статический метод, и поэтому могут дать им небольшую паузу и побудить их взглянуть на возвращаемое значение. В то же время у вас есть удобство использования «экземпляра» метода.

public static ImmutableList<T> Join(this ImmutableList<T> body, T tail)
{
    // add robust error checking in case either is null...
    return new ImmutableList<T>(body, tail);
}

, а затем позже ...

var list = new ImmutableList<string>().Join("Hello")
                                      .Join("Extensible")
                                      .Join("World");

Я не совсем знаю, как вести себя при публикации нескольких ответов, но это интересный вопрос, поскольку Я думаю, что номенклатура является критическим шагом в дизайне, и мой мозг продолжает размышлять над этим.

0
ответ дан Erich Mirabal 23 November 2019 в 03:48
поделиться

Псевдокод C # выглядит следующим образом:

interface Foo
{
    // Constructors
    Foo();
    Foo(params Foo[] foos);

    // Instance method
    Foo Join(params Foo[] foos);

    // Class method
    static Foo Join(params Foo[] foos);
}    

Таким образом, вы можете называть вещи так:

var f0 = new Foo();
var f1 = new Foo(new Foo(), new Foo(), new Foo());
var f2 = Foo.Join(new Foo(), new Foo(), new Foo());
var f3 = f0.Join(new Foo(), new Foo(), new Foo());
var f4 = new Foo(new Foo(new Foo()), new Foo(), new Foo(new Foo()));

Etc ....

0
ответ дан 23 November 2019 в 03:48
поделиться

Как программист на C ++ и поклонник STL, я предложил add_copy . (это также предполагает remove_copy , replace_copy и так далее)

1
ответ дан 23 November 2019 в 03:48
поделиться

Возможно, лучше всего подойдет статический метод или оператор (который является статическим). Это снимет ответственность с экземпляров, и пользователи сразу поймут, что операция не принадлежит ни одному из экземпляров. Особенно важно НЕ использовать методы расширения, поскольку их сходство с методами экземпляра при использовании сводит на нет всю цель.

Статический метод можно назвать Join:

public static class ListOperations {
  public static ImmutableList<T> Join<T>(ImmutableList<T> list, T tail) {
    // ...
  }
  public static ImmutableList<T> Join<T>(T head, ImmutableList<T> list) {
    // ...
  }
  public static ImmutableList<T> Join<T>(ImmutableList<T> list1, ImmutableList<T> list2) {
    // ...
  }
  // substitutes chaining:
  public static ImmutableList<T> Join<T>(ImmutableList<T> list, params T[] tail) {
    // ...
  }
}

// ....

var list = new ImmutableList<string>("Hello");
var list2 = ListOperations.Join(list, "immutable"); // inferred type parameter
var list3 = ListOperations.Join(list2, "world!");

Но я бы предпочел, чтобы в C# были бесклассовые функции. Или, по крайней мере, что-то вроде статического импорта в Java.

Оператор может быть +:

var list = new ImmutableList<string>("Hello");
var list2 = list + "immutable";
var list3 = list2 + "world!";

Но я бы предпочел иметь возможность использовать что-то другое, например <<, :: или . , которые невозможны в C#.

Кроме того, статические члены выглядят более функционально и, как мне кажется, лучше подходят для такого неизменяемого представления.

3
ответ дан 23 November 2019 в 03:48
поделиться

Как насчет создания класса-оболочки с Augment (или AugmentWith ) метод?

0
ответ дан 23 November 2019 в 03:48
поделиться

Поскольку этот вопрос является теперь в основном тезаурус: Как насчет .Bring () . Например, дать мне этот список и принести с собой этот элемент?

Foo = List.Bring('short');
          .Bring('longer');
          .Bring('woah');

Это не скатывается с языка, но означает для меня.

На самом деле, AndBring ( ) может быть даже лучше.

0
ответ дан 23 November 2019 в 03:48
поделиться

Я бы пошел с перегрузкой оператора + . Причина в том, что в Python это работает именно так - .append () в списке изменяет список, а выполнение + с другим списком создает новый список. + также определенно не подразумевает мутации. Думаю, именно поэтому вам так нравится .Plus () , поэтому, если вы не хотите перегружать оператор, вы можете использовать .Plus () .

0
ответ дан 23 November 2019 в 03:48
поделиться

list.copyAndAppend (elt)

Как это звучит?)

0
ответ дан 23 November 2019 в 03:48
поделиться

Как упоминалось ранее, вы пытаетесь выполнять 2 действия одновременно и выполняете микрооптимизацию только для этой цели. Если копирование происходит не в соответствии с определением исходной коллекции, такие имена, как «Добавить», «Добавить», только сбивают с толку.

« CloneAppend » - вот что я мог бы использовать в этой ситуации.Что-то подсказывает мне, что меня бы не было в этой ситуации. Я считаю, что скоро вам понадобятся другие подобные операции, такие как « CloneFirstN » или « CloneRemoveLast ». И вскоре вы поймете, что гораздо лучше связать метод клонирования / копирования, добавить / удалить все, что вам нужно, а затем преобразовать коллекцию обратно в неизменяемую, даже если для этого потребуется дополнительная строка кода.

0
ответ дан 23 November 2019 в 03:48
поделиться

Лично я бы назвал метод Clone и вызвал бы параметр AdditionalValue , так как это, по сути, то, что он , по-видимому, делает, и это будет легко понять, например,

var empty = new ImmutableList<string>(); 
var list1 = empty.Clone("Hello"); 
var list2 = list1.Clone("immutable"); 
var list3 = list2.Clone("word");
0
ответ дан 23 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: