Добавить в корзинуПозвонить
Найти в Дзене

Структурный, объектный и функциональный стили кода.

Наткнулся на любопытные рассуждения об основных парадигмах программирования: структурной, объектно-ориентированной и функциональной. Здесь и далее основным источником будет книга Роберта Мартина "Чистая архитектура". В большинстве статей преимущественно рассматривается, какие возможности дает каждый из подходов: упорядочивание кода, моделирование реального мира, свобода от побочных эффектов. Но все эти инструменты были доступны изначально, хоть возможно и не в самой удобной форме. Основная идея в том, что подходы вносят ограничения, а не возможности. Вместе эти парадигмы отнимают оператор `GO TO`, указатели на функции и оператор присваивания. Описанные выше подходы были открыты в 1958-1968 годах. Учитывая тот факт, что осталось не так много вещей, которые можно ограничить, а так же все остальные подходы являются расширением или дополнением основных концепций можно предположить, что новых основных концепций на текущем оборудовании и не будет. Подводя итог - нет смысла останавливаться

Наткнулся на любопытные рассуждения об основных парадигмах программирования: структурной, объектно-ориентированной и функциональной. Здесь и далее основным источником будет книга Роберта Мартина "Чистая архитектура".

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

  • Структурное программирование ограничивает прямую передачу управления. Одна из главных идей, заложенных в основу - любую программу можно написать используя 3 операции: последовательность, итерация и выбор. Оно отобрало у программистов возможность прыгать к любой строке кода используя оператор `GO TO`, который существенно повышал сложность кода и усложнял (если не делал невозможным) его тестирование. Структурный подход направлен на разбиение главных модулей на второстепенные, их на ещё более мелкие части и так далее до тех пор, пока они не станут простыми. Это позволяет проще тестировать и поддерживать код. Про структурное программирование могу посоветовать прочесть книгу Ван Тассела "Стиль, разработка, эффективность, отладка и испытание программ." У меня есть о ней небольшой пост.
  • Объектно-ориентированное программирование(ОО). Основная польза от объектно ориентированного подхода - инверсия зависимостей. При структурном подходе главные пакеты тащат свои зависимости в более мелкие и при изменении какой-либо части часто приходится изменять множество связанных с ней пакетов. ОО позволяет выделять более глобальные архитектурные "компоненты", развертывать части приложения отдельно друг от друга.
  • Функциональное программирование. Функциональное программирование ограничивает присваивание. В ФП языках либо стараются избегать либо просто выпиливают мутабельные переменные. Это позволяет избавиться от состояний гонки и блокировок при написании многопоточных программ. Возможно ли это на практике? Цитируя "Чистую архитектуру" - "Если у вас есть неограниченный объем памяти и процессор с неограниченной мощностью вычислений". В остальных способах приходится идти на компромиссы. Как один из вариантов - "транзакционная память". Состояние объекта неизменно либо пересчитывается раз в определенное время, мы храним все произошедшие с ним изменения в виде транзакций и рассчитываем их в момент обращения.

Вместе эти парадигмы отнимают оператор `GO TO`, указатели на функции и оператор присваивания. Описанные выше подходы были открыты в 1958-1968 годах. Учитывая тот факт, что осталось не так много вещей, которые можно ограничить, а так же все остальные подходы являются расширением или дополнением основных концепций можно предположить, что новых основных концепций на текущем оборудовании и не будет.

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

На этой позитивной ноте я отправляюсь кормить котейку. Спасибо за чтение и приятного дня)