Могу ли я предложить вам взглянуть на инструмент Jenv
Это позволит вам в любое время переключаться между установленными JVM.
Просто как:
jenv global oracle-1.7
, а затем для тестирования:
jenv global oracle-1.6
И у вас есть гораздо больше команд.
Основное применение - передача функций в функции более высокого порядка, такие как фильтр и карта (Где и Выбрать в .Net). Это действительно самое большое влияние, позволяющее писать такие вещи, как операции установки, только один раз, затем вещи, которые воздействуют на наборы или изменяют их.
Так что такие вещи, как
var SquareOfEvenIntegers = MyListOfInts
.Where(i=>even(i))
.Select(i=>i*i);
вместо
List<int> SquareOfEvenIntegers = new List<int>()
foreach(int i in MyListOfInts)
{
if (even(i))
{
SquareOfEvenIntegers.Add(i*i);
}
}
Сейчас мне намного проще писать многопоточный код.
У меня меньше переменных уровня класса, чем раньше.
Я также предпочитаю функционально независимые интерфейсы ... опять же, это дает огромный выигрыш, когда дело доходит до многопоточности, поскольку это может значительно уменьшить количество требуемых блокировок объектов, при условии, что ваши потоки также функционально независимы.
Я также склонен преследовать меня в кошмарах о закрытии скобок.
Мне приходят в голову две вещи, связанные с функциональным программированием, которое я использую:
Написание приличного фрагмента Haskell означает, что мне намного проще использовать Linq to SQL в моем коде C #.
Теперь я сильно склоняюсь к написанию кода, который принимает результат и возвращает результат, а не изменение переменной в качестве побочного эффекта.
Я написал большие куски как процедурного, так и функционального кода, что облегчает мне разбиение моего кода на более мелкие куски, которые принадлежат к одному стилю или Другой. Когда я знал только процедурное / ООП программирование, у меня было меньше инструментов в моем ментальном наборе инструментов.
Чтение исходных текстов библиотек в Haskell научило меня, как лучше свести мой код, чтобы отделить абстракции от реальной задачи.
Я получил много от написания Haskell!
Обработчики событий, которые являются замыканиями;
button.OnClick += (sender, args) => MessageBox.Show("we captured " + someCapturedVariable);
Я считаю, что переход Python 3.x к итераторам очень естественен для меня , потому что это напоминает мне ленивую оценку Haskell.
На самом деле, независимо от того, используете ли вы Python 2.x или Python 3.x, составления списков , map
, itertools
], operator
и (в несколько меньшей степени) functools
, мои друзья!
В некотором смысле меня поразило то, как часто я бессознательно использовал программирование в функциональном стиле, не осознавая, что это такое.
Например, в Java я активно использую конструкции в коллекциях Commons, такие как Transformer и Predicate, которые по сути являются замыканиями, но реализованы как интерфейсы Java. Затем вы используете предоставленные служебные функции для преобразования и фильтрации элементов в коллекции. Это идет вразрез со "стандартным" императивным способом выполнения такого рода вещей в Java.
Это, конечно, обычные функциональные операции сопоставления и фильтрации, но я инстинктивно использовал их, не осознавая, что это было. Это говорит мне о том, что функциональный стиль в значительной степени интуитивно понятен, даже если вам об этом не говорят.
Поскольку функциональное программирование ортогонально ООП, оно действительно открыло мне глаза на то, как я структурирую свои классы.
Функциональное программирование и объектно-ориентированное программирование. Непересекающиеся понятия. Один недостаток функциональных языков, который я вижу, - это отсутствие выразительности ADT. Самое близкое, что я видел к функциональному программированию на объектно-ориентированном языке, - это Eiffel. По соглашению функции ссылочно прозрачны, было бы идеально, если бы это было принудительно.
Я немного писал об этом в
Как функциональное программирование влияет на структуру вашего кода?
Некоторые из них специфичны для F #, но есть много общих наблюдений.