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

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

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

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

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

from math import exp, sin, sqrt, fabs


def get_exp(x):
    return exp(sin(sqrt(fabs(x))) + 1)


print(get_exp(6))

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

Для реального примера можно представить банк: чтобы получить справку 414, нужно получить справку 519, для неё нужна 139, а для неё паспорт и так далее. Вызов выглядит вот так

справка_414(справка_519(справка_139(паспорт)))

Структурное программирование

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

a = input('Первое число: ')
b = input('Второе число: ')
c = input('Третье число: ')

if a > b and a > c:
    print('Самое больше число {}'.format(a))
elif b > c and b > a:
    print('Самое большое число {}'.format(b))
else:
    print('Самое большое число {}'.format(c))

Модульное программирование

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

import proxy_changer
import list_control
import loger
'Дальше по коду идут вызовы через точку loger.функция, list_control.функция ,proxy_changer.функция'

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

Код состоит из объектов — классов. Классы работают как рецепты для еды. У них есть название, есть ингредиенты и способы готовки. Но это рецепт, чтобы его приготовить, нужно вызвать рецепт из main-блока, то есть — создать объект этого рецепта.
Для примера сделаем крабсбургер

class Крабсбургер
  {
  булочки = 2
  сыр = 2
  котлетки = 1
  томаты = 2
  салат = 1
  кетчуп = 1,25
   
  def готовка():
    'положить одно на другое и прогреть'
}

мой_перекус = Крабсбургер()

С ООП мы сталкивались когда писали бота.

# Создаём объект бота через класс TeleBot.
bot = tb.TeleBot('Токен бота', threaded=False)
# Используем метод send_message, который теперь доступен у объекта бота
bot.send_message(message.chat.id, about_me)

Декларативный

Описывает сам объект, что он из себя представляет и его характеристики.
Например, мы хотим бутерброд. «ЗАХААААР, сделай мне бутерброд». Он идёт на кухню и делает бутерброд как умеет.
Декларативный факториал

def factorial(num):
    if (num == 1):  # Это условие для факториала единицы 1! = 1 
        return 1

    # А это вычисление любого факториала
    num = num * factorial(num - 1)
    return num

Императивный

Описывает как найти объект или вычислить его значение.
Опять таки мы хотим бутерброд. «ЗАХАААР, иди на кухню, возьми и порежь хлеб, намажь на него масло и положи сверху три кусочка колбасы.» Идёт и делает по вашему алгоритму, а не как он умеет.
Императивный факториал

def factorial(num):
    counter = 1  
    result = 1  

    while(counter <= num):  # Выполняется пока счётчик не дойдёт до края, а если край один — сразу выходит из цикла
        result *= counter  # Сокращённое выражение result = result * counter
        counter += 1  # Сокращённое выражение counter = counter + 1

    return result

В следующей статье расскажем про компиляторы и интерпретаторы.

Поделиться
Отправить
Популярное