Я пытаюсь «узнать больше» и «извлечь уроки» из функционального программирования и идеи неизменности, полезной для параллелизма и т. Д.
В качестве мыслительного упражнения я представил себепростая игра, в которой персонаж типа Mario-esq может бегать и прыгать с врагами, которые стреляют в него ...
Затем я попытался представить, что это написано функционально с использованием неизменных объектов.
Это подняло некоторыевопросы, которые озадачивали меня (будучи программистом по императивному OO).
1) Если мой маленький парень в позиции x10, y100 двигается вправо на 1 единицу, я просто восстанавливаю его, используя его старые значения со +1 к егопозиция x (например, x11, y100)?
2) (Если мое первое предположение верно) Если мой входной поток перемещает маленького парня вправо на 1 единицу, и мой вражеский поток AI стреляет в маленького парня, а вражеский поток ai разрешаетсяперед потоком ввода мой парень потеряет здоровье, затем после разрешения потока ввода вернет его обратно и переместится вправо ...
Означает ли это, что я не могу уволить - и - забытьмои темы даже с неизменяемостью?Нужно ли мне отправлять свои потоки, чтобы они синхронно делали свое дело, затем new (), когда у меня есть результаты обеих потоковых операций?или есть простое «функциональное» решение?
Это немного другая проблема с многопоточностью, с которой я сталкиваюсь ежедневно.Обычно я должен решить, волную ли меня, в каком порядке разрешаются потоки или нет.Где, как и в приведенном выше случае, технически мне все равно, получает ли он урон или двигается первым.Но мне не все равно, из-за того, что условия гонки во время создания экземпляра приводят к полной потере данных одного потока.
3) (Опять же, если мое первое предположение верно) Имеет ли постоянно создаваемый экземпляр новых экземпляров объекта (например, парень из Марио)ужасные накладные расходы, которые делают это очень серьезным / важным дизайнерским решением?
РЕДАКТИРОВАТЬ Извините за это дополнительное редактирование, я не очень рекомендую здесь о последующих вопросах ...
4) Если неизменность - это то, что я долженстремиться и даже прыгать через обручи создания новых версий объектов, которые изменились ... И если я создаю экземпляр моего парня каждый раз, когда он движется (только с другой позицией), разве у меня нет точно таких же проблем, как если бы онбыл изменчив?в той степени, в которой что-то, что ссылалось на него в какой-то момент времени, на самом деле смотрит на старые значения? .. Чем больше я копаюсь в этом, тем больше вращается моя голова, поскольку генерация новых версий одной и той же вещи с разными значениями просто кажется изменчивостью, черезхак.: ¬?
Наверное, мой вопрос: как должно работать?и как это выгодно просто поменять свою позицию?
for(ever)//simplified game-loop update or "tick" method
{
if(Keyboard.IsDown(Key.Right)
guy = new Guy(guy){location = new Point(guy.Location.x +1, guy.Location.y)};
}
Также сбивает с толку: приведенный выше код означает, что парень изменчив! (даже если его свойства не таковы)
4.5)что вообще возможно с абсолютно неизменным парнем?
Спасибо,
J.