что значит императивный подход

Чем отличается императивное программирование от декларативного

Предыстория

Не так давно я была в активном поиске работы и просматривала кучу сайтов с вакансиями/проектами. На некоторых из них «проходные» вопросы можно посмотреть еще до подачи отклика.

Большинство было вполне обычными, типа «сколько лет вы пользуетесь фреймворком Х?», но один мне показался интересным (я даже туда откликнулась, но #меняневзяли).

Это собственно и был вопрос из заголовка. И я решила разобраться. А лучший способ понять — это, как известно, объяснить. Так что добро пожаловать под кат.

В чем же отличия?

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

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

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

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

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

Такой стиль, в котором вы описываете, какой именно результат вам нужен.

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

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

Пример на JS

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

Наверное, правильно называть один стиль «более декларативным», а другой — «более императивным».

Источник

Императивное и декларативное программирование простым языком — объясняют эксперты

Авторизуйтесь

Императивное и декларативное программирование простым языком — объясняют эксперты

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

технический директор центра инновационных технологий и решений «Инфосистемы Джет»

Императивные языки, такие, как Java, Python, JavaScript, C, C++ занимают доминирующее положение в индустрии ПО, соответственно императивное программирование — самое распространённое. Смысл его в том, что императивная программа содержит прямые указания, что должен сделать компьютер и в каком порядке должны выполняться инструкции. Этот подход легко понять программисту, а компилятору — легко породить достаточно эффективный код.

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

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

Вообще в декларативных языках обычно отсутствует изменение переменных или обычно спрятано за каким-либо специальным механизмом.

Самый популярный язык РСУБД SQL так же является декларативным. На нём описывается конечный результат, а способ его получения генерируется сервером СУБД исходя из множества факторов.

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

Конечно, практически все основные языки сочетают в себе элементы и декларативного и императивного программирования. Огромное влияние оказывает функциональное программирование на JavaScript, Java, C++, C# и т.д.

ведущий системный программист компании «Аэродиск»

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

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

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

Сейчас широко распространены как узкоспециализированные декларативные языки программирования (HTML + CSS, SVG, VRML, SQL, lex/VACC), в том числе функциональные (Haskell, Erlang, Scala), так и императивные языки (C/C++/C#, Java, Go, Rust, Python). Однако практически все современные языки программирования общего назначения высокого уровня, за исключением некоторых функциональных, относятся к императивным языкам.

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

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

руководитель отдела разработки ECM «Техносерв Консалтинг»

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

Читайте также:  что делают перед эко

Рассмотрим ещё один пример. Допустим, мы хотим приготовить обед.

В императивной парадигме это выглядит как-то так:

В декларативной: хочу на обед жареное мясо с овощами (неплохо звучит, правда? :)).

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

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

Источник

Что такое Декларативный и Императивный подход?

Oct 19 · 4 min read

Самый очевидный способ продемонстрировать декларативность, взять пример из реальной жизни.

Вы пришли в ресторан, официант принимает у вас заказ, вы ему говорите название желаемого блюда из меню. Благодаря тому что у всех блюд есть короткое название, вам достаточно назвать его, ничего не объясняя, и не успеете оглянуться как ваш заказ будет готов. И вам не обязательно идти на кухню или знать рецепт. За вас всё сделают.

Так же и в программировании. Декла р ативный подход позволяет вам получить необходимый результат, не углубляясь в детали используемых функций. Например в React-e используется именно такой подход. Благодаря этому вы записываете, как должна выглядеть ваша страница, а не как ее отобразить:

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

Вот несколько преимуществ которые вы получаете:

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

Наглядные отличия подходов

Если совсем коротко то: императивный программирование — как сделать, а декларативное программирование — что сделать.

В данном примере функция принимает массив элементов, возвращает сумму каждого четного числа и умножает ее на 2.

Давайте подробнее рассмотрим каждый из подходов.

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

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

Читая код, вы можете понять, что он делает, но возникает недоумение: зачем нужны эти шаги, к чему они приведут?

Такой код длиннее и его сложнее понять с первого взгляда.

Декларативный подход

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

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

Эталон декларативности

Ну ладно, возможно слишком громко сказано, но согласитесь: код выглядит почти как фраза на английском. В предыдущем примере вам пришлось самому разобраться, что number % 2 === 0 будет true только если — чётное число. Определить, что тут number * 2 — полученное число умножаем на два. И последнее, что acc + next означает, что мы складываем текущее число с предыдущим.

Вы постоянно занимаетесь этим процессом переваривания кода в уме. В максимально декларативном примере вам не приходиться думать о коде, потому что он читается как фраза на английском. В нем говорится: «возьмите все числа, отфильтруйте чётные, умножьте на 2 и сложите».

Ну вот мы довольно неплохо сократили наш код. А как известно, чем меньше кода, тем меньше ошибок, верно?

И вот я уже слышу недоумение: — Но декларативное программирование по-прежнему использует императивное программирование под капотом, поэтому невозможно писать только декларативный код!

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

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

Идём дальше

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

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

И так, давайте разберёмся что это такое:

Возьмем, к примеру, наши функции onlyEven, multiplyByTwo и sumAll. Все они соблюдают каждое правило функционального программирования, которое мы рассмотрели. Это то, что делает их читаемыми, предсказуемыми и тестируемыми.

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

Если хотите ещё сильнее погрузиться в функциональное программирование, прочтите вот эти статьи:

Важно видеть разницу

Декларативное программирование противоположно императивному программированию и только ему. То есть вы обычно можете комбинировать их со всеми другими парадигмами программирования, такими как те, которые я упомянул. Главное не думать, что вам необходимо выбирать между “ императивным и функциональным программированием” или “ декларативным и объектно-ориентированным программированием”, потому что это все равно что сравнивать яблоки и апельсины.

Заключение

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

Источник

Императивный и диспозитивный методы.

Выделяют императивный и диспозитивный методы.

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

Читайте также:  что значит твитеры колонки

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

Диспозитивный метод правового регулирования может выполнять дополнительно функции поощрения или рекомендации.

Способ поощренияпредполагает свободу поведения субъектов права, на которое оказывается стимулирующее воздействие. За желаемый вариант поведения устанавливается стимул (награда, льгота, вознаграждение и т. п.). Такого рода воздействие имеет целью направлять активное поведение субъектов на достижение определенной цели.

Способ рекомендацийиспользуется аналогично поощрительному, но не предусматривает конкретной награды. В правовых нормах, осуществляющих этот метод, содержатся слова: «вправе», «желательно», «рекомендовать», «предложить» и т. п. Реальное воздействие рекомендательного метода зависит от авторитета их источника, автора.

Предмет и метод правового регулирования позволяют дифференцировать большинство правовых норм по отраслям и институтам права.

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

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

Соотношение системы права и системы законодательства может быть охарактеризовано как связь внешней и внутренней форм. В силу единства этих форм в праве основные подразделения структуры законодательства его отрасли – это в то же время и отрасли права.

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

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

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

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

Предмет и метод правового регулирования

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

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

В современном законотворчестве используют в равной степени как узкий, так и широкий подход к определению данного термина. Статьей 1.1. КоАП РФ установлен широкий подход, в соответствии с которым законодательство об административных правонарушениях состоит из кодекса и принимаемых в соответствии с ним законов субъектов Российской Федерации об административных правонарушениях. Лесной кодекс Российской Федерации понимает под законодательством кодекс, другие федеральные законы и законы субъектов Российской Федерации. Градостроительный кодекс Российской Федерации в статье 3 дает очень широкое понимание термина «законодательство» – кодекс, другие федеральные законы, иные нормативные правовые акты РФ, законы и иные нормативные акты субъектов РФ.

В ст. 3 Гражданского кодекса РФ установлено узкое понимание гражданского законодательства.

Употребление узкого подхода к определению термина «законодательство» более точно соответствует природе и сущности правовой государственности, так как оно существенно усложняет подзаконное правотворчество и ставит его под контроль представительной власти. Конституция РФ установила, что подзаконные акты должны приниматься на основании и в соответствии с законами. Именно такой подход нашел отражение в Гражданском кодексе РФ: «На основании и во исполнение настоящего Кодекса и иных законов, указов Президента Российской Федерации Правительство Российской Федерации вправе издавать постановления, содержащие нормы гражданского права». Наиболее точно сформулированы в Гражданском кодексе РФ пределы подзаконного правотворчества: «Органы исполнительной власти могут издавать акты, содержащие нормы гражданского права, в случаях и в пределах, предусмотренных настоящим Кодексом, другими законами и иными правовыми актами» (п. 7 ст. 3 ГК РФ). Таким образом, в соответствии с узким пониманием термина «законодательство» подзаконное правотворчество разрешается законом, который, естественно, принимается раньше подзаконного нормативного правового акта. Такая модель последовательного принятия и зависимости подзаконного акта от закона служит гарантией прав и свобод человека и гражданина.

Система права делится на две сферы: частную и публичную. Деление права на публичное и частное восходит еще к античной древности. Одним из авторов данного учения справедливо считают Ульпиана. Так, например, он считал, что публичное право относится к положению Римского государства. Он полагал, что для частного права наибольший интерес представляют потребности отдельных лиц, их правовое положение и имущественные отношения. Для публичного права приоритет имеют государственные интересы, правовое положение государства, его органов и должностных лиц, регулирование отношений, обладающих ярко выраженным общественным значением.

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

Реформа правовой системы в 90 х годах XX века, ориентированная на рыночные экономические отношения, обусловила новый виток в проблеме соотношения частного и публичного в отраслях права. Современная юридическая доктрина строится на разделении права на частное и публичное.

Читайте также:  что значит эмоционально привязан

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

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

Публичное право обладает следующими специфическими признаками:

• иерархические отношения субъектов, основанные на властном и, соответственно, подчиняемом их положении друг по отношению к другу;

• императивное правовое регулирование при помощи обязывающих либо запрещающих правовых норм;

Диспозитивный метод гражданско-правового регулирования

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

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

Методу как общетеоретической категории в науке уделялось серьезное внимание, т.к. наряду с предметом он назывался в качестве критерия разграничения отраслей права. С.С.Алексеев видит один из недостатков теоретической разработки метода правового регулирования в том, что нередко противопоставляются два изолированно рассматриваемых способа правового регулирования – «метод равенства», который называют еще «диспозитивный», «метод координации», «метод децентрализации» и «метод власти – подчинения», называемый методом централизованного регулирования, методом субординации. Фактически в чистом виде эти методы не существуют и «… в каждом методе правового регулирования мы можем найти и элементы «равенства», и элементы «автономии», и элементы «власти – подчинения». Все дело в том, каково соотношение этих элементов в рамках органичного целого, единого метода правового регулирования…».

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

Однако категория метода представляет ценность не только при изучении системы права – отмечает В.Ф.Яковлев. Метод выступает обобщающей категорией, «в единстве отражающей характерные юридические особенности той или иной отрасли права».

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

Широкое распространение получила точка зрения, что отраслевой метод нельзя сводить к одному способу, приему, используемому законодателем в определенной отрасли права, это совокупность способов, приемов правового воздействия. Так, В.П.Грибанов под методом правового регулирования общественных отношений понимает «совокупность способов, средств, приемов, посредством которых право воздействует на общественные отношения». В литературе справедливо подчеркивалось, что метод – это «устойчивое сочетание форм, приемов, способов, применяемых государством для регулирования общественных отношений определенного вида». Е.А.Суханов определяет метод правового регулирования как «комплекс правовых средств и способов воздействия соответствующей отрасли права на общественные отношения, составляющие ее предмет». Это можно обосновать словами С.С.Алексеева: «метод правового регулирования не может быть сведен к какой-либо одной изолированно рассматриваемой черте права».

В гражданском праве эти признаки метода гражданско-правового регулирования Е.А.Суханов представляет как 1) юридическое равенство; 2) договор как наиболее распространенная форма возникновения прав и обязанностей; 3) судебный порядок защиты гражданских прав; 4) имущественный характер ответственности, который носит компенсационный характер.

Механизм правового регулирования и его методы (императивный и диспозитивный)

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

В.А.Белов называет следующие свойства (характеристики) метода гражданско-правового регулирования: 1) юридическое равенство участников регулируемых отношений; 2) неприкосновенность права собственности и иных субъективных частных прав; 3) свобода договора и вообще определения мотивов реализации своих субъективных прав и правоспособности; 4) недопустимость произвольного вмешательства кого-либо в частные дела; 5) беспрепятственное осуществление субъективных прав; 6) обеспечение восстановления нарушенных субъективных прав, в частности – посредством их судебной защиты. Именно перечисленные свойства предопределяют название метода гражданско-правового регулирования – диспозитивный, координационный или частно-правовой.

Именно такие черты (элементы, признаки) гражданско-правового метода как юридическое равенство, свободное волеизъявление, имущественная самостоятельность отражены в ст.1 ГК Украины при определении предмета гражданского права.

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

Критикуя позицию Н.Д.Егорова, Е.А.Суханова отмечает, что такой подход «упрощает и обедняет содержание данной категории». Такая оценка поддержана и А.В.Дзерой, который также отмечает: «необходимо учитывать очевидно все фундаментальные черты, присущие отраслевому методу регулирования».

Источник

Строительный портал