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

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

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

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

TLDR: сводка двух популярных широких парадигм программирования:

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

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

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

Декларативный подход в первую очередь интересует «что», программа предназначена для выполнения.

Хотя эти парадигмы обычно используются в отличие от них, декларативные парадигмы можно рассматривать как расширение или идею, построенную поверх императивного программирования. Это не настоящие противоположности, а скорее связанные парадигмы, которые сосредоточены/заинтересованы в разных аспектах программирования. Две парадигмы (и кратко их подпарадигмы) более подробно рассматриваются ниже.

Императивное программирование — «как»:

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

Основной идеей императивного программирования является структурное программирование,идея, направленная на повышение удобочитаемости кода. Эта концепция, также называемая модульным программированием, направлена ​​на оптимизацию кода за счет использования операторов потока управления (IF/ELSE/WHILE и т. д.), разбивая программу на повторно используемые «модульные компонентов, каждый из которых имеет свою собственную цель. Две популярные парадигмы программирования, вытекающие из императивного/структурного программирования, — это процедурное программирование и объектно-ориентированное программирование. В частности, объектно-ориентированное программирование является популярной концепцией, изучаемой во многих вводных курсах по программированию.

Процедурное программирование:

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

#include <stdio.h>

int repetitiveTask() {
  // Step by step instructions of how to achieve said repetitive task
  int someResult = 0;
  // Return the result from the function so it can be used in the main program
  return someResult; 
}

int main(void) {
  // the main program executed when code is compiled

  // Repetitive tasks
  int resultA = repetitiveTask()
  int resultB = repetitiveTask()
  
  return 0;
}

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

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

В объектно-ориентированном программировании (ООП) процедуры и данные инкапсулируются в одну сущность, называемую объектом. Каждый «объект» можно рассматривать как полунезависимую часть программы. Обычный способ обучения объектно-ориентированному программированию — использование аналогии с человеком или животным. Например, код, моделирующий кошку, может иметь некоторые данные, характерные для кошки, такие как возраст, физические особенности, любимая еда и т. д. Кошки также перемещаются, что можно смоделировать с помощью функций (или методов в случае ООП). Возможно, вы видели что-то похожее на приведенный ниже фрагмент кода в Python, если вы посещали какие-либо курсы Python.

class Cat:
  def __init__(self, name:str, age:int, birthday:str, breed:str) -> None:
    self.name = name
    self.age = age
    self.breed = breed

  def meow(self, num_meows:int) -> None:
    '''
    Print "meow" num_meow times
    '''
    for meow in range(num_meows):
      print("Meow")
    return None

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

from pathlib import Path
import pandas as pd

class DataLoader:
  def __init__(self, input_directory_path:str):
    self.input_path = Path(input_directory_path)
    self.num_files_loaded = 0
    self.datatable = pd.DataFrame()

  def load_table(self, path_to_file) -> None:
    '''
    Wrapper function of pandas.read_csv(filepath)
    '''
    # Iterate through the files in the data directory
    for path_item in self.input_path.iterdir():
      # Skip the file if it is not a csv file or another folder
      if (path_item.suffix != '.csv') or (path_item.is_dir()):
        continue
      # Load the contents of the file
      temp_table = pd.read_csv(path_item)
      # Append to the end of the dataframe stored in the object
      self.datatable = pd.concat([self.datatable, temp_table], axis = 0)

  return None

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

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

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

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

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

В этой парадигме программы состоят из функций. Уже одно это утверждение затрудняет отличить его от императивного (или процедурного) программирования. Однако в императивном программировании функции состоят из операторов потока управления, тогда как функции в функциональном программировании состоят из операторов или других функций.

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

Логическое программирование:

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

Краткое содержание:

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

Источники:

  1. Виды парадигм программирования
  2. Логическое программирование
  3. Функциональное программирование
  4. Парадигмы программирования