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



Я сосредотачиваюсь на том, чтобы сделать предметы неизменяемыми. Неизменяемые объекты позволяют гораздо проще рассуждать о многопоточном коде, чем «потокобезопасные» объекты. У объекта есть одно видимое состояние, которое может передаваться между потоками без какой-либо синхронизации. Это требует мысли о многопоточном программировании.
Если вам интересно, я опубликовал много своих работ с неизменяемыми объектами, в частности с неизменяемыми коллекциями в галерее кода. Название проекта - RantPack. В зоне сбора у меня есть
Существует дополнительный слой прокладки, который (CollectionUtility) будет создавать объекты-оболочки, реализующие интерфейсы BCL, такие как IList <T> и ICollection <T>. Они не могут полностью реализовать интерфейсы, поскольку они неизменяемы, но реализованы все возможные методы.
Исходный код (C#), включая модульное тестирование, также доступен на сайте.
Не используйте переменные-члены или глобальные переменные. Используйте локальный стек функций / методов. Когда метод использует только переменные с внутренней областью видимости и параметры вызова и возвращает всю информацию с использованием параметров out / inout / reference или возвращаемых значений, он является функциональным.
Программирую в основном на Java. Терпеливо жду того дня, когда в язык добавят закрытия. Но поскольку я все еще застрял на Java 1.4.2, даже если они будут добавлены, это не будет для меня надолго!
Тем не менее, мой основной «функциональный» способ программирования - это частое использование ключевого слова «final». Я стараюсь, чтобы как можно больше классов были полностью неизменяемыми, а в остальном - иметь четкое различие между временным и неизменным.
+1 за «финал» - неизменность - ваш друг. также вам не нужно ждать закрытия, если вы используете один из функциональных языков JVM (например, Clojure или Scala) :-)
Сделайте все асинхронным. Используйте неизменяемые объекты, сообщения и т. д. Общайтесь через очереди.
Я вижу, как MQ помогает параллелизму, но действительно ли это работает?
Вы правы, это не работает, но помогает параллелизму, что, как я понимаю, является здесь основной целью. Может я ошибаюсь, и это не так.
Вот доклад на rubyconf 2008 об этом предмете, он в основном сосредоточен на Ruby, но некоторые концепции остаются в силе.
http://rubyconf2008.confreaks.com/better-ruby-through-functional-programming-2.html
Вы не охватили все это: […] не используйте функции ввода-вывода или функции, возвращающие случайное значение и т. д. Как правило, не используйте функции с побочными эффектами.