ћерион Ќетворкс

10 минут

„то такое парадигмы программировани€? Ёто не более, чем просто замысловатое название дл€ попул€рных способов и стилей организации процесса написани€ программного кода.

Programming paradigm

я постараюсь разбить эту тему на части и дать простое по€снение по каждой парадигме. “аким образом, вы сможете легко пон€ть, о чем говор€т люди, когда произнос€т такие слова, как Ђобъектно-ориентированныйї, Ђфункциональныйї или Ђдекларативныйї. ƒавайте начнем!


„то такое парадигма программировани€?

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

¬опрос о том, почему существует так много различных парадигм программировани€, схож с вопросом о том, почему существует так много €зыков программировани€. ќпределенные парадигмы лучше подход€т дл€ определенных типов задач. »менно поэтому имеет смысл использовать разные парадигмы дл€ разных типов проектов.

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

» последн€€ причина Ц € думаю, это просто творческое начало в человеке. ѕо своей натуре, нам просто нравитс€ создавать новые вещи, улучшать то, что другие когда-то создали, и адаптировать инструменты под себ€ и свои предпочтени€ или просто делать их более эффективными (в нашем понимании).

¬се это привело к тому, что на сегодн€шний день мы имеем огромное количество вариантов, которые могут помочь нам написать и структурировать ту или иную программу.


„ем парадигма программировани€ не €вл€етс€?

ѕарадигмы программировани€ Ц это не €зыки и не инструменты. ¬ы не сможете ничего Ђсоздатьї с помощью парадигмы. ќни больше похожи на некий набор образцов и руковод€щих принципов, о которых условились большое количество людей, которым они следовали и которые они подробно изложили.

язык программировани€ не всегда прив€зан к определенной парадигме. ≈сть €зыки, которые были созданы с учетом определенной парадигмы и имеют функции, которые облегчают программирование в этом контексте больше, чем другие (хороший пример Ц Haskel и функциональное программирование).

ќднако существуют и Ђмногопарадигмальныеї €зыки. Ёто означает, что вы можете адаптировать свой код, чтобы он подходил под какую-то из парадигм (хороший пример Ц JavaScript и Python).

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


ѕопул€рные парадигмы программировани€

“еперь, когда вы знаете, что такое парадигмы программировани€, а что к ним не относитс€, давайте рассмотрим самые попул€рные из них, их характеристики и сравним их.

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


»мперативное программирование

»мперативное программирование Ц это набор подробных инструкций, которые даютс€ компьютеру, чтобы тот выполнил их в заданном пор€дке. Ётот тип программировани€ называетс€ Ђимперативнымї, потому что мы некоторым образом указываем компьютеру (как программисты), что он должен делать.

»мперативное программирование концентрируетс€ на описании того, как программа работает, шаг за шагом.

ƒопустим, вы хотите испечь торт. ¬аша императивна€ программа дл€ такого рода задачи может выгл€деть следующим образом:

1- Pour flour in a bowl
2- Pour a couple eggs in the same bowl
3- Pour some milk in the same bowl
4- Mix the ingredients
5- Pour the mix in a mold
6- Cook for 35 minutes
7- Let chill	

¬оспользуемс€ конкретным примером и предположим, что мы хотим отфильтровать массив чисел так, чтобы остались только числа, которые больше 5. Ќаш императивный код тогда будет выгл€деть следующим образом:

const nums = [1,4,3,6,7,8,9,2]
const result = []

for (let i = 0; i < nums.length; i++) {
    if (nums[i] > 5) result.push(nums[i])
}

console.log(result) // Output: [ 6, 7, 8, 9 ]	

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

Ќаши инструкции предельно детализированы и конкретны, и именно это и €вл€етс€ императивным программированием.


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

ѕроцедурное программирование Ц это производное от императивного программировани€ только с функци€ми (также известных как Ђпроцедурыї или Ђподпрограммыї).

ѕроцедурное программировани€ предлагает пользователю разделить выполнение программы на функции, чтобы оптимизировать модульный принцип организации.

¬ернемс€ к нашему примеру с тортом. ѕроцедурна€ программа дл€ этого примера будет выгл€деть следующим образом:

function pourIngredients() {
    - Pour flour in a bowl
    - Pour a couple eggs in the same bowl
    - Pour some milk in the same bowl
}

function mixAndTransferToMold() {
    - Mix the ingredients
    - Pour the mix in a mold
}

function cookAndLetChill() {
    - Cook for 35 minutes
    - Let chill
}

pourIngredients()
mixAndTransferToMold()
cookAndLetChill()	

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

“акое упрощение и абстрактное представление €вл€етс€ одним из преимуществ процедурного программировани€. ќднако внутри функций находитс€ все тот же императивный код.


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

‘ункциональное программирование продвигает концепцию создани€ функций немного дальше.

¬ функциональном программировании функции рассматриваютс€ как Ђполноправные гражданеї. Ёто означает, что их можно присваивать переменным, передавать в качестве аргумента и возвращать в качестве результата других функций.

≈ще одна ключева€ концепци€ Ц это иде€ чистых функций. „иста€ функций Ц это функци€, котора€, чтобы получить результат, полагаетс€ только на свои входные данные. » при одних и тех же входных данных всегда будет один и тот же результат.  роме того, эти функции не имеют никаких побочных эффектов (то есть не внос€т никаких изменений вне контекста функции).

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

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

const nums = [1,4,3,6,7,8,9,2]
const result = [] // External variable

for (let i = 0; i < nums.length; i++) {
    if (nums[i] > 5) result.push(nums[i])
}

console.log(result) // Output: [ 6, 7, 8, 9 ]	

ƒл€ того, чтобы преобразовать это в функциональное программирование, мы можем сделать следующее:

const nums = [1,4,3,6,7,8,9,2]

function filterNums() {
    const result = [] // Internal variable

    for (let i = 0; i < nums.length; i++) {
        if (nums[i] > 5) result.push(nums[i])
    }

    return result
}

console.log(filterNums()) // Output: [ 6, 7, 8, 9 ]	

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


ƒекларативное программирование

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

Ѕудет намного пон€тнее, если мы приведем пример. ¬оспользуемс€ примером с фильтрацией массива. ƒекларативный подход здесь будет выгл€деть следующим образом:

const nums = [1,4,3,6,7,8,9,2]

console.log(nums.filter(num => num > 5)) // Output: [ 6, 7, 8, 9 ]	

ќбратите внимание, что, использу€ функцию фильтрации filter, мы €вно не указываем компьютеру перебирать массив или сохран€ть значени€ в отдельном массиве. ћы просто говорим о том, что мы хотим (Ђfilterї) и условие, которое необходимо выполнить (Ђnum > 5ї).

„то хорошего в таком подходе? ≈го легче читать и понимать, и зачастую он более емкий в записи. ’орошими примерами декларативного кода €вл€ютс€ функции filter, map, reduce и sort в JavaScript.

≈ще один хороший пример Ц современные фреймворки/библиотеки JS, такие как React. ѕосмотрите, например, на этот код:

<button onClick={() => console.log('You clicked me!')}>Click me</button>

«десь у нас есть кнопка (button) с приемником событий, который запускает функцию console.log при нажатии кнопки.

—интаксис JSX (то, что использует React) совмещает HTML и JS. Ёто упрощает и ускор€ет написание приложений. Ќо это не то, что браузеры читают и выполн€ют.  од React позже преобразуютс€ в обычный HTML и JS, а вот это уже то, с чем работают браузеры.

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

«десь также важно отметить, что в декларативном программировании компьютер все равно обрабатывает информацию как императивный код.

≈сли снова вернутьс€ к примеру с массивом, то компьютер по-прежнему выполн€ет итерацию по массиву, как в цикле for, но нам, как программистам, не нужно писать это напр€мую. ƒекларативное программирование скрывает всю сложность от программиста.


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

ќдной из самых попул€рных парадигм программирование €вл€етс€ объектно-ориентированное программирование (ќќѕ).

ќсновна€ концепци€ ќќѕ заключаетс€ в разделении пон€тий на сущности, которые описываютс€ как некие объекты.  ажда€ сущность группирует заданный набор информации (свойств) и действий (методов), которые может выполн€ть эта сущность.

ќќѕ широко использует классы.  лассы - это способ создани€ новых объектов с помощью макета или шаблона, который задает программист. ќбъекты, которые были созданы с помощью класса, называютс€ экземпл€рами.

¬ернемс€ к примеру с приготовлением пищи на псевдокоде. ѕредположим, что в нашей пекарне у нас есть главный повар (по имени ‘рэнк) и помощник повара (по имени Ёнтони). ” каждого их них есть определенные об€занности. ≈сли бы мы использовали ќќѕ, то наша программа бы выгл€деть следующим образом:

// Create the two classes corresponding to each entity
class Cook {
	constructor constructor (name) {
        this.name = name
    }

    mixAndBake() {
        - Mix the ingredients
    	- Pour the mix in a mold
        - Cook for 35 minutes
    }
}

class AssistantCook {
    constructor (name) {
        this.name = name
    }

    pourIngredients() {
        - Pour flour in a bowl
        - Pour a couple eggs in the same bowl
        - Pour some milk in the same bowl
    }
    
    chillTheCake() {
    	- Let chill
    }
}

// Instantiate an object from each class
const Frank = new Cook('Frank')
const Anthony = new AssistantCook('Anthony')

// Call the corresponding methods from each instance
Anthony.pourIngredients()
Frank.mixAndBake()
Anthony.chillTheCake()	

ѕреимущество ќќѕ заключаетс€ в том, что оно облегчает понимание программы за счет четкого разделени€ задач и об€занностей.


»тоги

 ак мы увидели, парадигмы программировани€ Ц это различные способы решени€ задач программировани€ и организации нашего кода.

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


—кидки 50% в Merion Academy

¬ыбрать курс