Парадигмы программирования. Эпизод I: Процедурное программирование.

Парадигмы программирования. Эпизод I: Процедурное программирование.

Больше вкусностей найдешь на моем канале - https://t.me/emotional_robot


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

Что такое парадигма?

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

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

Так что насчет слова "парадигма"? Был такой крутой философ в XX веке по имени Томас Кун, который ввел это слово в своем труде "Структура научных революций". Цитатка оттуда:

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

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

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

Естественно, программирование не стало исключением. Как и в любой науке, здесь присутствуют различные взгляды на процесс программирования, организацию кода, стиль написания компьютерных программ. Аналогию с парадигмами Куна провел ученый Роберт Флойд в 1978 году. Она весьма удачно вписалась. Но стоит понимать важное отличие.

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

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

Но чтобы успешно применять парадигмы программирования, в них нужно шарить. Сразу скажу, что парадигм - туева хуча, даже не пытайтесь во все вникнуть разом, знакомьтесь постепенно или по мере необходимости. Я же расскажу о самых распространенных, с которых, собственно, и начинается обучение программированию. Вы готовы, дети?


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

Прочитайте определение нашей любимой Википедии:

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

Я надеюсь, вы увидели знакомые слова? Верно, императивный язык (если не узнали, двойка вам за посещение занятий, вот вам статья - и без новых знаний не возвращайтесь).

Вся программа строится на последовательном описании шагов (инструкций), которые она должна пройти, чтобы получить результат. Этими шагами являются операторы - команда или набор команд. Ими могут быть объявления переменной, присваивание переменной значения, условные операторы, циклы и так далее - мы обязательно об этом поговорим.

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


Какие последовательные действия он совершает?

1) Проснуться в 6:00.

2) Подумать о самоубийстве.

3) Сходить в туалет.

4) Помыться.

5) Найти в холодильнике подобие еды.

6) Съесть.

7) Помолиться, чтобы не траванулся.

8) Нацепить лохмотья, которые считаются одеждой.

9) Выйти из дома, не вступив в какашку.

10) Поехать на работу.

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

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

Например, пусть процедура сбора на нелюбимую работу будет выглядеть так (далее пойдет псевдокод - вольная интерпретация языка программирования, дабы не привязываться к конкретному существующему):

procedure prepareForTheUnlovedWork(wakeUpTime, isNeedToWash) {

wake up at ${wakeUpTime}

...

if ${isNeedToWash} == true then wash

...

}

Вместо многоточия будут идти команды из алгоритма выше, они всегда будут одинаковые, потому не акцентируем внимание на них. Важнее две команды: "wake up at" и "wash". Первой команде мы подставляем значение из параметра "wakeUpTime", вторую команду вызываем, только если значение параметра "isNeedToWash" истинно (равно "true"). Параметрами называются переменные, которые приходят на вход процедуре, когда её вызывают. Конструкция ${wakeUpTime} - просто вариант написания получения значения из переменной, об этом тоже будем говорить.

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

prepareForTheUnlovedWork('6:00', true);

prepareForTheUnlovedWork('6:05', true);

prepareForTheUnlovedWork('6:20', false);

prepareForTheUnlovedWork('6:30', false);

prepareForTheUnlovedWork('5:40', true);

Это и есть суть процедурного программирования. Сначала создаются кирпичики (процедуры), затем из этих кирпичиков строится дом (программа). Таким образом, мы экономим собственное время при разработке, делаем код структурным и легко читаемым, придерживаемся принципа DRY - "Don't Repeat Yourself" ("Не повторяйся").

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

Итого

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



Report Page