Методы экземпляра F # ... должны ли они возвращать новый экземпляр вместо изменения текущего объекта? - PullRequest
1 голос
/ 31 октября 2011

Проблема заключается в том, должен ли метод экземпляра в любом случае изменять объект, содержащий метод, или он должен возвращать новый экземпляр?Я новичок в F # и концепции полной изменчивости, которая предлагается для F #.

Просто пока использую код psuedo, если мне не нужно быть более конкретным.сообщение в список сообщений на объекте:

class Something
  ctr(messages)
     _messages.Add(messages)

  AddMessage(message)
   _messages.Add(message)

Вторым является создание нового списка, который объединяет старый список и новое сообщение.Тогда я бы создал новый экземпляр altogther и отправил обратно.

class Something
  ctr(messages)
     _messages.Add(messages)

  AddMessage(message)
    newMessageList = _messages.Join(message)
      return new Something(newMessageList)

Я слишком много думаю об неизменности?

Ответы [ 2 ]

4 голосов
/ 31 октября 2011

На мой взгляд, ответ зависит от ваших требований.Неизменяемый стиль, вероятно, более идиоматичен и будет разумным значением по умолчанию.Тем не менее, одна приятная вещь в F # - это то, что вы можете выбирать, что делать, исходя из ваших потребностей;нет ничего плохого в коде, который использует мутацию.Вот некоторые вещи, которые следует учитывать:

  • Иногда изменчивый подход приводит к лучшей производительности, особенно при использовании в однопоточном контексте (но обязательно убедитесь, что вы измеряете реалистичные сценарии!)
  • Иногда неизменный подход лучше использовать в многопоточных сценариях
  • Иногда вы хотите взаимодействовать с библиотеками, которые проще использовать с неуязвимым кодом (например, API, принимающий System.Action<_>).
  • Ты работаешь в команде?Если да, то опытные ли они разработчики на C #?Опытные разработчики F #?Какой код они найдут наиболее легким для чтения (возможно, изменяемый стиль)?Какой тип кода вам проще всего поддерживать (вероятно, неизменный стиль)?
  • Вы просто делаете это как упражнение?Тогда практиковать неизменный стиль, возможно, стоит.

Если вернуться еще дальше, есть еще несколько моментов, на которые следует обратить внимание:

  • Вам действительно нужен метод экземпляра?Часто использование функции let-bound в модуле более идиоматично.
  • Вам действительно нужен новый номинальный тип для того, что вы делаете?Если это просто тонкая оболочка вокруг списка, вы можете просто использовать list s.
1 голос
/ 01 ноября 2011

Поскольку вы занимаетесь программированием на основе классов, которое является одним из способов (скорее неудачным) для объектно-ориентированного программирования, вы будете выполнять модификацию состояния на месте, а не возвращать новое состояние (как это и ожидалось, когдавы делаете OO).

Если вы действительно хотите перейти к неизменности, я бы предложил вам использовать больше понятий FP, таких как Модули, Функции (не те методы, которые есть у вас в программировании на основе классов), рекурсивныетипы данных и т. д.

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

...