Как программировать без побочных эффектов на Java? - PullRequest
8 голосов
/ 05 декабря 2011

Будучи давним Java-программистом и в последние годы зависимым от Haskell, я сейчас изучаю Scala. Мой вопрос:

Как программировать без побочных эффектов в Java?

т.е. Как я могу сделать вручную то, что Scala делает для меня?

Книга Scala от Одерского часто объясняет функциональные концепции в терминах ОО-терминологии (например, val = final, если = ternary op.).

Существует ли доступное руководство по программированию без побочных эффектов на Java (как можно меньше)? Я думаю, что можно было бы получить многие из известных преимуществ с простой старой Java и небольшой дисциплиной (например, неизменяемые коллекции, конечные значения, жесткие методы, которые не изменяют состояние объекта / приложения).

Ответы [ 4 ]

12 голосов
/ 05 декабря 2011
  1. Сделайте каждый метод, поле и класс либо abstract, либо final.
  2. Создайте каждую переменную и параметр метода final.
  3. Если вы используете изменяемые структурыкак Array или ресурсы ввода / вывода, такие как файлы и соединения с базой данных, никогда не позволяйте им выходить за рамки, в которых они построены.
9 голосов
/ 05 декабря 2011
7 голосов
/ 05 декабря 2011

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

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

5 голосов
/ 05 декабря 2011

Будучи давним Java-программистом и в последние годы зависимым от Haskell, я сейчас изучаю Scala.

Поздравляю:)

Какпрограмма без побочных эффектов на Java?т.е. как я могу сделать вручную то, что Scala делает для меня?

Что ж, Scala не делает для вас слишком много (по сравнению с Haskell) с точки зрения принудительного применения или помощи без побочных эффектовстиль.Например, у вас всегда есть возможность в Scala использовать var везде, где вам угодно, тогда как в Haskell, если вам нужен изменяемый IORef или STRef, вам нужно указать это системе типов, используя соответствующую монаду.

Другими словами, хотя вы спрашиваете, как имитировать стиль Scala в Java, первый шаг, который нужно рассмотреть, - это как имитировать стиль Haskell в Scala, где, конечно, Scalaz вступает в игру.

Учитывая все вышесказанное, я думаю, что вы в основном ответили на свой вопрос:

Я думаю, что можно получить многие из известных преимуществ с помощью простой старой Java и немного дисциплины (например, неизменяемые коллекции, конечные значения, жесткие методы, которые не изменяют состояние объекта / приложения).

Дисциплина - это как минимум половина истории.Простое использование final и неизменных коллекций (а-ля Guava ) имеет всевозможные последствия для того, как будет выглядеть ваш код.Другая половина истории, конечно, что вы делаете, когда ваша программа требует побочных эффектов (таких как ввод-вывод)?В Haskell вы бы использовали монаду IO, а в Scala вы можете использовать scalaz.effects.IO, но в Java, честно говоря, я думаю, что сражаться не стоит.

По моему мнению, две наиболее важные строки кода функционального стиля, которые вы будете писать в любой программе Java, следующие:

import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;

Остальное - упражнение для читателя;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...