Я знаю, что вы просили код, который показал преимущества изменяемых переменных. И я хотел бы предоставить это. Но, как указывалось ранее, нет проблем, которые не могут быть выражены в обеих модах. И тем более, что вы указали, что область примера полигона jpalecek может быть написана с помощью свертываемого алгоритма (который, на мой взгляд, намного сложнее и поднимает проблему на другой уровень сложности), - это заставило меня задуматься, почему вы переходите на изменчивость жесткий. Поэтому я попытаюсь привести аргументы в пользу общей позиции и сосуществования неизменяемых и изменяемых данных.
По моему мнению, этот вопрос немного упускает из виду. Я знаю, что нам, программистам, нравятся вещи простые и понятные, но мы иногда упускаем из виду, что смесь тоже возможна. И, вероятно, поэтому в дискуссии об неизменности редко кто-то занимает среднюю позицию. Мне просто интересно, почему, потому что давайте посмотрим правде в глаза - неизменность является отличным инструментом абстрагирование всех видов проблем. Но иногда это огромная боль в заднице . Иногда это просто слишком сложно. И это само по себе заставляет меня остановиться и все такое - мы действительно хотим потерять изменчивость? Это действительно или-или? Нет ли какой-нибудь точки соприкосновения , к которой мы можем прийти? Когда неизменность помогает мне быстрее достичь своих целей, когда изменчивость? Какое решение легче читать и поддерживать? (Какой для меня самый большой вопрос)
На многие из этих вопросов влияет вкус программиста и то, в чем он используется для программирования. Поэтому я сосредоточусь на одном из аспектов, который обычно является центром большинства аргументов про неизменяемости - параллелизм:
Часто параллелизм вбрасывается в спор об неизменности. Я работал над проблемными наборами, для решения которых требовалось более 100 процессоров в разумные сроки. И это научило меня одной очень важной вещи: большую часть времени распараллеливание манипуляций с графиками данных на самом деле - не та вещь, которая будет наиболее эффективным способом распараллеливания. Это, безусловно, может принести большую пользу, но дисбаланс является реальной проблемой в этом проблемном пространстве. Поэтому обычно параллельная работа над несколькими изменяемыми графами и обмен информацией с неизменяемыми сообщениями намного эффективнее. Это означает, что когда я знаю, что график изолирован, что я не открыл его внешнему миру, я хотел бы выполнять свои операции над ним самым кратким образом, который я могу себе представить. И это обычно включает в себя изменение данных. Но после этих операций с данными я хочу открыть данные для всего мира - и в этот момент я обычно немного нервничаю, если данные изменчивы. Поскольку другие части программы могут повредить данные, состояние становится недействительным ... потому что после открытия миру данные часто попадают в мир параллелизма.
Таким образом, в реальных параллельных программах обычно есть области, в которых графы данных используются в определенных однопоточных операциях - потому что они просто неизвестны извне - и области, где они могут быть задействованы в многопоточных операциях (надеюсь, просто не предоставляя данные манипулировать). Во время этих многопоточных частей мы никогда не хотим, чтобы они менялись - просто лучше работать с устаревшими данными, чем с несогласованными данными. Что может быть гарантировано понятием неизменности.
Это заставило меня прийти к простому выводу: настоящая проблема для меня заключается в том, что ни один из языков программирования, с которыми я знаком, позволяет мне сказать: «После этого вся эта структура данных должна быть неизменной» и "дайте мне изменяемую копию этой неизменяемой структуры данных здесь, пожалуйста, убедитесь, что только я могу видеть изменяемую копию" . Прямо сейчас я должен гарантировать это сам, щелкая бит readonly или что-то подобное. Если бы у нас могла быть поддержка компилятора, это не только гарантировало бы мне, что я не сделал ничего глупого после переключения указанного бита, но и могло фактически помочь компилятору выполнить различные оптимизации, которые он не мог сделать раньше. Плюс - язык все еще будет привлекательным для программистов, которые более знакомы с моделью императивного программирования.
Итак, подведем итоги. Программы IMHO обычно имеют веские основания использовать как неизменяемые, так и изменяемые представления графов данных . Я бы сказал, что данные должны быть неизменяемыми по умолчанию , и компилятор должен обеспечить это - но у нас должно быть понятие частных изменяемых представлений , потому что, естественно, существуют области, где многопоточность никогда не достигать - а удобочитаемость и удобство обслуживания могут выиграть от более обязательного структурирования.