Изучение функционального программирования
Я изучаю функциональное программирование. Я решил попробовать это на Java с помощью кортежей.
Я прочитал Java кортеж Саджала Чакраборти - Работа с кортежами в Java и решил создать несколько примеров. Java не включает в себя функциональность кортежей. Поэтому я установил библиотеку javatuples .
Преимущества функционального программирования
С преимуществами функционального программирования трудно спорить.
- Неизменныйобъекты, которые не изменяются при их передаче по системе - улучшенный параллелизм и параллелизм.
- Более быстрое создание прототипов / более краткий - нет необходимости создавать раздутые шаблоны, заполненные POJOs².
- Никаких побочных эффектов -Вывод функций зависит от входа³.
- Простое и легкое модульное тестирование - не нужно беспокоиться о вызове функций в определенном порядке или настройке внешнего состояния⁴.
Фактически, Эрик Мейер вего курс edX Введение в функциональное программирование утверждает, что функциональное программирование "позволяет писать программы четко, кратко и на высоком уровне абстракции".
Однако я борюсь соснованный на индексе характер кортежей. Они не кажутся мне более понятными.
Пример GPS-координат
Возьмем, к примеру, фиктивное приложение, которое принимает и сохраняет координаты GPS.
Объектно-ориентированная версия
Следуя парадигме объектно-ориентированного программирования (ООП), вы создадите объект Java.
public class Coordinates {
private Double lat;
private Double lng;
public Coordinates(Double lat, Double lng) {
this.lat = lat;
this.lng = lng;
}
public Double getLat() {
return lat;
}
public Double getLng() {
return lng;
}
}
Затем вы создадите сервис для сохранения координат.
public class CoordinatesService {
public static void saveCoordinates(Coordinates coordinates) {
double latitude = coordinates.getLat();
double longitude = coordinates.getLng();
// Save the coordinates (before they are lost forever! ;))
}
}
И, наконец,, вы должны создать новые координаты и передать их службе.
Coordinates coordinatesWithPojo = new Coordinates(34.90011, 46.62922);
CoordinatesService.saveCoordinates(coordinatesWithPojo);
Версия функционального программирования
Следуя парадигме функционального программирования (с использованием кортежей), вы создадите службу для сохранения координат.
public class CoordinatesService {
public static void saveCoordinates(Pair<Double, Double> coordinates) {
double latitude = coordinates.getValue0();
double longitude = coordinates.getValue1();
// Save the coordinates (before they are lost forever! ;))
}
}
И тогда вы создадите новые координаты и передадите их службе.
Pair<Double, Double> coordinatesWithTuple = Pair.with(34.90011, 46.62922);
CoordinatesService.saveCoordinates(coordinatesWithTuple);
Компромисс Obscurity?
Хотя функциональная версия более лаконичнаверсия ООП кажется более понятной. При доступе к объекту Coordinates
в IntelliJ IDE становится ясно, из чего состоит объект Coordinates
.
Однако, когда я получаю доступ к полям в кортеже, они закрываются индексами.
Трудно понять, какой индекс связан с широтой ис долготой. А что будет, если они случайно переключатся? Это простой пример. Но эта проблема возрастает с увеличением количества параметров в кортеже.
Даже аннотации параметров более ясны в версии ООП.
Версия ООП
Функциональная версия
Вопросы
- Является ли тот факт, что кортежи Java создают неясность, компромиссом приверженности парадигме функционального программирования?
- Является ли это общим компромиссом функционального программирования?
- Если это правда, не так ли? Разве это не противоположность хорошей абстракции - создание ясного и лаконичного языка и значения, которое люди понимают и могут рассуждать?
Примечание: У меня есть элементарные знания функционального программирования,Это означает, что я все еще учусь формулировать свои вопросы и аргументы по этому вопросу. Поэтому я с радостью приму любые отзывы по самим вопросам. Моя цель - узнать больше о функциональном программировании, а не вступать в горячие споры.
Источники
¹ Java 8 в действии
² Введение в функциональное программирование
³ Функциональное программирование HOWTO
⁴ Функциональное программирование для всех остальных