Каковы преимущества функционального программирования? [закрытый]

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть NullPointerException. Как вы это исправите? Возьмем простой пример, который выдает NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Идентифицирует нулевые значения

. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, что s имеет значение null, а вызов метода length на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) в методе print(), а this.name - null.

Трассировка, где эти значения должны быть установлены

Где установлен this.name? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может проверить значение null например:

printString((name == null) ? "" : name);

Или вы можете создать класс, чтобы name всегда имел ненулевое значение :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

См. также:

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).

92
задан Bill the Lizard 8 August 2012 в 19:43
поделиться

8 ответов

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

Функциональное программирование перемещает более основные идеи программирования в компилятор, идеи, такие как понимания списка и кэширование.

самое большое преимущество Функционального программирования является краткостью, потому что код может быть более кратким. Функциональная программа не создает переменную итератора, чтобы быть центром цикла, таким образом, это и другие виды издержек устраняются из Вашего кода.

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

Некоторые выигрыши в производительности видны в контексте однопроцессорного также, в зависимости от способа, которым записана программа, потому что большинство функциональных языков и расширений поддерживают отложенные вычисления. В Haskell можно сказать, что "эта маркировка представляет массив, содержащий все четные числа". Такой массив является бесконечно большим, но можно попросить 100,000-й элемент того массива в любой момент, не имея необходимость знать - во время инициализации массива - что самое большое значение, Вы собираетесь нуждаться. Значение будет вычислено только при необходимости в нем, и не далее.

71
ответ дан Chris Wenham 24 November 2019 в 06:33
поделиться

Самое большое преимущество - то, что это не то, к чему Вы привыкли. Выберите язык как Схема и учитесь решать проблемы с нею, и Вы станете лучшим программистом на языках, которые Вы уже знаете. Это похоже на изучение второго естественного языка. Вы предполагаете, что другие являются в основном изменением самостоятельно, потому что у Вас нет ничего для сравнения его с. Воздействие другим, конкретные, которые не связаны с тем, что Вы уже знаете, поучительно.

28
ответ дан Kirk Strauser 24 November 2019 в 06:33
поделиться

Это не должно быть один или другой: использование языка как C#3.0 позволяет Вам смешивать лучшие элементы каждого. OO может использоваться для крупномасштабной структуры на уровне класса и выше, Функциональный стиль для мелкомасштабной структуры на уровне метода.

Используя Функциональный стиль позволяет коду быть записанным, который объявляет его намерение ясно, не путаясь с операторами управления, и т.д. Из-за принципов как побочный эффект бесплатное программирование, намного легче рассуждать о коде и проверить его правильность.

5
ответ дан Samuel Jack 24 November 2019 в 06:33
поделиться

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

FP является простым обобщением, которое способствует функциям значения первого класса, тогда как ООП для крупномасштабного структурирования кода. Существует некоторое перекрытие, однако, где шаблоны разработки ООП могут быть представлены непосредственно и намного более кратко использующие первоклассные функции.

Много языков обеспечивают и FP и ООП, включая OCaml, C# 3.0 и F#.

С наилучшими пожеланиями, Jon Harrop.

0
ответ дан Jon Harrop 24 November 2019 в 06:33
поделиться

Почему функциональное программирование важно
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Аннотация

Поскольку программное обеспечение становится все более и более сложным, все большее значение приобретает его правильная структура. все более важным становится его хорошее структурирование. Хорошо структурированное программное обеспечение легко писать и отлаживать, и предоставляет коллекцию модулей, которые можно можно использовать повторно для снижения будущих затрат на программирование.

В этой работе мы показываем что две особенности функциональных языков, в частности, функции высшего порядка функции высшего порядка и ленивая оценка, могут внести значительный вклад в модульности. В качестве примеров мы манипулируем списками и деревьями, программируем несколько численных алгоритмов, и реализуем эвристику альфа-бета (алгоритм из области искусственного интеллекта, используемый в игровых программах). программах). Мы пришли к выводу, что, поскольку модульность является ключом к успешному программированию, функциональное программирование дает важные преимущества. программирования, функциональное программирование предлагает важные преимущества для разработки программного обеспечения.

11
ответ дан 24 November 2019 в 06:33
поделиться

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

Функциональное программирование также повышает модульность - вы часто можете видеть методы/функции в императиве, которые слишком длинные - вы почти никогда не увидите функцию длиной более пары строк. А так как все развязано - повторное использование значительно улучшается, а модульное тестирование становится очень простым.

5
ответ дан 24 November 2019 в 06:33
поделиться

Поэтому хорошей отправной точкой будет попытка понять некоторые вещи, которые невозможны в императивных языках, но возможны в функциональных языках.

Если вы говорите о вычислимости, то, конечно, нет ничего, что было бы возможно в функциональном, но не в императивном программировании (или наоборот).

Смысл различных парадигм программирования не в том, чтобы сделать возможными вещи, которые раньше были невозможны, а в том, чтобы сделать легкими вещи, которые раньше были трудными.

Функциональное программирование нацелено на то, чтобы позволить вам легче писать программы, которые лаконичны, не содержат ошибок и поддаются параллелизации.

10
ответ дан 24 November 2019 в 06:33
поделиться

Не думайте о функциональном программировании с точки зрения "необходимости". Вместо этого думайте о нем как о еще одной технике программирования, которая откроет ваш разум точно так же, как ООП, шаблоны, язык ассемблера и т.д., возможно, полностью изменили ваш образ мышления, когда (если) вы их изучили. В конечном счете, изучение функционального программирования сделает вас лучшим программистом.

1
ответ дан 24 November 2019 в 06:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: