Введение

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

Пересматривая парадигмы программирования

Объектно-ориентированное программирование (ООП)

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

Типичная система ООП основана на таких концепциях, как:

  1. Классы и объекты. Классы представляют собой реальный объект, способный иметь некоторую память (переменные данных) и демонстрировать определенное поведение (методы). Объекты - это просто реализация/экземпляр этих сущностей.
  2. Инкапсуляция и абстракция. Проще говоря, инкапсуляция — это упаковка определенных вещей в одну коробку, а абстракция — это уровень видимости, который вы даете из указанной коробки.
  3. Наследование. Подобно тому, как мы наследуем черты наших предков, наследование представляет собой то, как два класса связаны друг с другом и обмениваются данными и поведением между собой.
  4. Полиморфизм. Он показывает, как один объект может брать на себя разные роли и обязанности в зависимости от среды.

Функциональное программирование (ФП)

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

Как и ООП, функциональное программирование имеет свои собственные концепции, на которых можно основываться.

  1. Неизменяемость. Все функции не должны поддерживать какое-либо состояние, которым они будут манипулировать на протяжении всего своего жизненного цикла для определения конечного результата. Другими словами, выходные данные любой функции основаны исключительно на входных данных, заданных ее входными или вспомогательными функциями.
  2. Чистые функции и функции высшего порядка. Функция, которая является детерминированной, т. е. дает вам одинаковый вывод и вход, называется чистой функцией, а функции, которые возвращают функции в качестве вывода, называются функциями высшего порядка.
  3. Композиция. В функциональном программировании композиция представляет собой шаблон проектирования, в котором системы строятся путем включения их поведения в систему, а не их врожденного свойства.
  4. Нет побочных эффектов. Каждая отдельная функция производит детерминированные выходные данные и не влечет за собой никаких непреднамеренных триггеров, влияющих на состояние других систем.

Обмен ударами

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

Время разработки

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

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

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

Тестируемость

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

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

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

Сопровождение кодовой базы

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

Кодовые базы в ООП обычно имеют тенденцию быть больше, чем их аналоги в ФП, из-за различных шаблонов, которые необходимо включить в ООП.

Благодаря меньшему количеству шаблонов и неизменности в основе, проще понять существующий код и отладить его в FP.

Новое изобретение колеса

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

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

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

Заключение

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