Итак, что такое парадигма программирования? И как выбрать лучший?

Если вы пытаетесь ответить на эти вопросы, вы попали в нужное место.

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

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

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

Проблема под рукой

В демонстрационных целях я составил проблему и написал решение ее тремя разными способами, каждый из которых следует своей парадигме. Вот:

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

Например, «привет» состоит из двух букв: восьмой буквы алфавита плюс девятой. Когда функция вызывается со словом «привет», она должна возвращать сумму 8 + 9, то есть 17.

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

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

Запомните это, потому что мы к этому еще вернемся.

Обязательно

Решение

Эта функция принимает на вход строку («str»). Затем он разбивает эту строку на массив каждой буквы. Счетчик («strValue») отслеживает общее значение строки; мы добавляем к нему значение каждой буквы в нашем массиве. Затем в конце возвращаем итоговое значение.

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

Мы начинаем с того, что берем письмо, с которым имеем дело в этом цикле. Затем мы можем найти индекс этой буквы в массиве «алфавит», добавить к нему 1, чтобы получить числовое значение этой буквы, а затем добавить его в наш счетчик «strValue». Эти четыре строки кода делают то же самое, что и одна строка кода в предыдущем примере.

Обсуждение

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

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

Функциональный

Решение

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

Обратите внимание, что функция findValue использует ту же константу «алфавита», что и раньше!

Теперь мы можем использовать эти вспомогательные функции в нашей более крупной функции, чтобы найти числовое значение строки.

Обсуждение

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

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

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

Объектно-ориентированный

Решение

В объектно-ориентированном программировании используются классы, в которых данные и методы задачи хранятся вместе. Данные хранятся в конструкторе класса, после чего впоследствии могут быть написаны методы класса.

Функция getStringValue, выполняющая здесь тяжелую работу, работает точно так же, как и наше императивное решение. Однако, поскольку входная константа «str» и «алфавит» хранятся в конструкторе класса, на них следует ссылаться с помощью ключевого слова «this».

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

Обсуждение

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

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

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

Резюме

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

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