Кортежи скрывают значения и параметры как индексы? - PullRequest
0 голосов
/ 30 сентября 2019

Изучение функционального программирования

Я изучаю функциональное программирование. Я решил попробовать это на 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
Функциональное программирование для всех остальных

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Pair (или Tuple) являются анонимными и индексируются, как вы сказали. Однако функциональное программирование также вызовет следующий функционал :

public class Coordinates {
  public final double lat;
  public final double lng;

  public Coordinates(double lat, double lng) {
    this.lat = lat;
    this.lng = lng;
  }

  public Coordinates translate(double dlat, double dlng) {
      return new Coordinates(..., ...);
  }
}

BiFunction<Coordinates, Coordinates, Coordinates> f = Coordinates::translate;
Coordinates c1 = f.apply(c2, c3);

Эта версия координат неизменна (конечные поля), и, следовательно,подходит как класс FOP.

0 голосов
/ 30 сентября 2019

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

например. первый гражданин в Java - это объект, а не функция

, здесь нет функции высокого порядка, следовательно, методы принадлежат классу

, на java невозможно выполнить криринг, плохая альтернативавызывать цепочку методов, но это не что иное, как myFunction (p1) (p2) (p3)

Если вы хотите тренироваться и / или использовать FP, я рекомендую использовать язык с парадигмой FP, такой как Javascript,Kotlin Scala или Haskell.

извините за мой плохой английский, надеюсь, это поможет

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