Более пристальный взгляд на различные стили и парадигмы программирования

Более пристальный взгляд на различные стили и парадигмы программирования

7 марта 2022 г.

Императивное программирование


Вот несколько фактов об императивном стиле программирования.


Объектно-ориентированное программирование — это императивный стиль программирования.


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


  1. Установите «счетчик» на «0», запустите цикл первых «100» значений и добавьте каждое число к «счетчику».

  1. Установите «данные» равными «0», добавьте первое число в массиве к «данным» и повторите это для остальных чисел в массиве и разделите «данные» на «длину» «массива». .

Здесь мы рассматриваем значения как ведра. Таким образом, значение может быть изменено в приложении в любое время. Охватывает изменчивость объекта.


Объявленные переменные содержат некоторое значение и изменяются в какой-то момент программы. Подумайте о переменных класса POJO с помощью сеттеров.


Допускается изменение значения переменной.


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


Пошаговая инструкция, как достичь цели.


Пример 01: Список объектов


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


Book POJO с конструктором, геттерами и сеттерами.


```java


учебник {


Заголовок строки;


Автор строки;


Целый год;


Целочисленные копииSoldInMillions;


Двойной рейтинг;


Двойная стоимость в евро;


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


это.название = название;


этот.автор = автор;


этот.год = год;


this.copiesSoldInMillions = копииSoldInMillions;


this.rating = рейтинг;


this.costInEuros = стоимостьInEuros;


публичный двойной getCostInEuros () {


стоимость возврата в евро;


@Override


общедоступная строка toString () {


вернуть "Книга {" +


"название='" + название + '\'' +


", автор='" + автор + '\'' +


", год=" + год +


", копийПроданоВМиллионах=" + копийПроданоВМиллионах+


", рейтинг=" + рейтинг +


", стоимость в евро = " + стоимость в евро +


BookDatabase для фиктивной инъекции данных.


```java


импортировать java.util.Arrays;


импортировать java.util.List;


открытый класс BookDatabase {


общедоступный статический список<книга> getAllBooks() {


вернуть Arrays.asList(


новая Книга("Дон Кихот", "Мигель де Сервантес", 1605, 500, 3.9, 9.99),


новая книга («Повесть о двух городах», «Чарльз Диккенс», 1859, 200, 3.9, 10.0),


новая книга («Властелин колец», «Дж. Р. Р. Толкин», 2001, 150, 4.0, 12.50),


новая Книга("Маленький принц", "Антуан де Сент-Экзюпери", 2016, 142, 4.4, 5.0),


новая книга («Сон в Красной палате», «Цао Сюэцинь», 1791, 100, 4.2, 10.0)


Вот наш класс BookApplication, который выполняет императивное программирование или мутации переменной book внутри цикла for.


```java


импортировать java.util.ArrayList;


импортировать java.util.List;


открытый класс BookApplication {


public static void main(String[] args) {


List books = BookDatabase.getAllBooks();


Список<Книга> impurativeWay = новый ArrayList<>();


для (Книжная книга: книги) {


если (book.getCostInEuros() >= 5) {


императивный способ.добавить(книга);


императивный путь.для каждого(System.out::println);


Объяснение


  1. У нас есть список данных книг.

  1. Затем мы использовали цикл for для перебора всех объектов книги.

  1. Внутри цикла for мы постоянно меняем данные переменной book и дополнительно проверяем проверку if, чтобы добавить отфильтрованные данные в другой список.

  1. Итак, мы мутируем, что означает, что мы изменяем переменную book, которая содержит значение, из одного состояния в другое.

  1. Мы печатаем отфильтрованные данные, используя цикл.

Пример 02: Уникальные целые числа


Другой простой пример — удаление дубликатов из списка вводимых целых чисел. Этот пример поможет вам понять, как на самом деле выполняется императивное программирование.


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


Образец кода


```java


импортировать java.util.ArrayList;


импортировать java.util.Arrays;


импортировать java.util.List;


класс УникальныеЭлементы {


public static void main(String[] args) {


Список<Целое> целоеСписок =


Arrays.asList(1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8);


List uniqueList = new ArrayList<>();


// "целочисленная" переменная изменяется/обновляется для каждой итерации.


for (Целое число: integerList) {


если (!uniqueList.contains(integer)) {


уникальныйСписок.добавить(целое число);


System.out.println("Уникальный список: " + uniqueList);


Объяснение


  1. У нас есть список целочисленных значений.

  1. Затем мы использовали цикл for для перебора всех значений списка.

  1. Внутри цикла for мы постоянно меняем данные переменной «integer» и дополнительно проверяем проверку if, чтобы добавить уникальные данные в другой список.

  1. Итак, мы мутируем, что означает, что мы изменяем «целочисленную» переменную, которая содержит значение, из одного состояния в другое.

  1. Мы загружаем все уникальные значения в другой список и печатаем их последними.

Декларативное программирование


Вот несколько фактов о декларативном стиле программирования.


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


  1. Установите счетчик как сумму всех чисел от 0 до 100.

  1. «данные» — это сумма всех чисел в массиве. разделить на длину массива.

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


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


С Streams API мы переходим от императивного к декларативному программированию.


Пример 01: Список объектов


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


Следующий пример содержит алгоритм, который делает это возможным.


Book POJO с конструктором, геттерами и сеттерами.


```java


учебник {


Заголовок строки;


Автор строки;


Целый год;


Целочисленные копииSoldInMillions;


Двойной рейтинг;


Двойная стоимость в евро;


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


это.название = название;


этот.автор = автор;


этот.год = год;


this.copiesSoldInMillions = копииSoldInMillions;


this.rating = рейтинг;


this.costInEuros = стоимостьInEuros;


публичный двойной getCostInEuros () {


стоимость возврата в евро;


@Override


общедоступная строка toString () {


вернуть "Книга {" +


"название='" + название + '\'' +


", автор='" + автор + '\'' +


", год=" + год +


", копийПроданоВМиллионах=" + копийПроданоВМиллионах+


", рейтинг=" + рейтинг +


", стоимость в евро = " + стоимость в евро +


BookDatabase для фиктивной инъекции данных.


```java


импортировать java.util.Arrays;


импортировать java.util.List;


открытый класс BookDatabase {


общедоступный статический список<книга> getAllBooks() {


вернуть Arrays.asList(


новая Книга("Дон Кихот", "Мигель де Сервантес", 1605, 500, 3.9, 9.99),


новая книга («Повесть о двух городах», «Чарльз Диккенс», 1859, 200, 3.9, 10.0),


новая книга («Властелин колец», «Дж. Р. Р. Толкин», 2001, 150, 4.0, 12.50),


новая Книга("Маленький принц", "Антуан де Сент-Экзюпери", 2016, 142, 4.4, 5.0),


новая книга («Сон в Красной палате», «Цао Сюэцинь», 1791, 100, 4.2, 10.0)


Вот наш класс BookApplication, который выполняет декларативное программирование или неизменность для каждого объекта книги.


```java


импортировать java.util.List;


импортировать java.util.stream.Collectors;


открытый класс BookApplication {


public static void main(String[] args) {


List books = BookDatabase.getAllBooks();


Список<книга> declarativeWay =


книги.поток()


.filter(книга -> book.getCostInEuros() >= 5)


.collect(Коллекторы.toList());


declarativeWay.forEach(System.out::println);


Объяснение


В приведенном выше примере у нас есть список книг, и мы запускаем для него некоторую цепочку методов, таких как фильтр, карта и т. д. Эта цепочка вызовов методов называется Stream Pipeline.


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


Давайте посмотрим, что происходит в каждой строке


  1. Сначала мы фильтруем «книги», стоимость которых больше или равна «5», используя лямбда-выражение «.filter(book -> book.getCostInEuros() >= 5)».

  1. Теперь у нас есть «список» книг, цена закрытия которых выше «5 евро». Мы связываем это с другим методом .collect(...), который преобразует данные потока в список с помощью Collections.toList(), возвращает список и сохраняет его в ссылочной переменной declarativeApproach.

  1. Мы печатаем его, вызывая .forEach(...) для ссылочной переменной.

Пример 02: Уникальные целые числа


Другой простой пример — удаление дубликатов из списка вводимых целых чисел. Этот пример поможет вам понять, как на самом деле выполняется императивное программирование.


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


Образец кода


```java


импортировать java.util.Arrays;


импортировать java.util.List;


импортировать java.util.stream.Collectors;


класс УникальныеЭлементы {


public static void main(String[] args) {


Список<Целое> целоеСписок =


Arrays.asList(1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8);


Список<Целое> уникальныйСписок =


целочисленныйСписок.поток()


.отчетливый()


.collect(Коллекторы.toList());


System.out.println("Уникальный список1: " + uniqueList);


Объяснение


  1. У нас есть список целочисленных значений.

  1. Затем мы добавили .stream(), поэтому наборы целочисленных значений преобразуются в потоки целочисленных значений.

  1. мы связали его с другой функцией под названием distinct(), которая удаляет повторяющиеся элементы из списка.

  1. После того, как мы просмотрим все отфильтрованные данные, нам нужно завершить поток, и мы делаем это с помощью .collect(...).

  1. В .collect(...) есть Collections.toList(), который преобразует данные потока в список, а результаты загружаются в переменную integerList1.

  • Впервые опубликовано [здесь] (https://dev.to/ggorantala/imperative-and-declarative-styles-of-programming-186d/)*


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE