Побочные эффекты
Современные языки программирования позволяют функциям работать не только внутри себя, но и влиять на окружение. Например, функция может вывести что-то на экран, записать на диск, изменить какую-то глобальную переменную. Взломать Пентагон, опять же. Всё это называется побочными эффектами. Хорошие программисты смотрят на них крайне настороженно.
Примерчики!
Мы пишем таск-менеджер. В памяти программы хранятся задачи, у каждой из которых есть приоритет: высокий, средний и низкий. Все задачи свалены в кучу в памяти, а нам надо вывести только те, что с высоким приоритетом.
Можно написать функцию, которая считывает все задачи из памяти, находит нужные и возвращает. При этом на задачи в памяти это не влияет: они как были свалены в кучу, так и остались. Это функция без побочных эффектов.
getTasksByPriority(‘high’) — вернёт новый массив с приоритетными задачами, не изменив другие массивы. В памяти был один массив, а теперь появится ещё и второй.
А можно написать функцию, которая считывает задачи, находит нужные, стирает их из исходного места и записывает в какое-то новое — например, в отдельный массив приоритетных задач. Получается, будто она физически вытянула нужные задачи из исходного массива. Побочный эффект этой функции — изменение исходного массива задач в памяти.
- pullTasksByPriority(‘high’) — физически вытащит задачи из исходного массива и переместит их в какой-то новый. В старом массиве уменьшится число задач.
- Такие изменения называют мутациями: я вызвал функцию в одном месте, а мутировало что-то в другом.
Программисты настороженно относятся к мутациям, потому что за ними сложно следить. Что если из-за какой-то ошибки функции выполнятся в неправильном порядке и уничтожат важные для программы данные? Или функция выполнится непредсказуемо много раз? Или она застрянет в цикле и из-за мутаций разорвёт память? Или мутация произойдёт не с тем куском программы, который мы изначально хотели?
Вот типичная ошибка, связанная с мутацией. Мы пишем игру, нужно поменять сумму игровых очков. За это отвечает функция changeScore(), которая записывает результат в глобальную переменную playerScore — то есть мутирует эту переменную. Мы случайно, по невнимательности, вызвали эту функцию в двух местах вместо одного, и баллы увеличиваются вдвое. Это баг.
Другая типичная ошибка. Программист написал функцию, которая удаляет из таблицы последнюю строку, потому что был почему-то уверен: строка будет пустой и никому не нужной. Случайно эта функция вызывается в бесконечном цикле и стирает все строки, от последней к первой. Данные уничтожаются. А вот если бы функция не удаляла строку из таблицы, а делала новую таблицу без последней строки, данные бы не пострадали.
Без мутирующих функций, конечно, мы не обойдёмся — нужно и выводить на экран, и писать в файл, и работать с глобальными переменными. Сложно представить программу, в которой вообще не будет мутирующих функций. Но программисты предпочитают выделять такие функции отдельно, тестировать их особо тщательно, и внимательно следить за тем, как они работают. Грубо говоря, если функция вносит изменения в большой важный файл, она должна как минимум проверить корректность входящих данных и сохранить резервную копию этого файла.
Что такое модуль, процедура, функция? Как оформляются и вызываются процедуры?
Модуль (программирование) — функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом или поименованной непрерывной её части.
Процедура (в программировании) — понятие, которое используется в большинстве языков программирования высокого уровня, и соответствует значению подпрограмма.
Открытые процедуры состоят из малого количества команд, их вставляют в тело программы каждый раз, когда встречается их вызов.
Закрытые процедуры размещаются отдельно от основной программы, при каждом вызове закрытой процедуры, организуется соответствующая передача управления и поворота в точку вызова. Как правило, стандартные процедуры заперты.
Фу́нкция — в программировании — это поименованная часть программы, которая может вызываться из других частей программы столько раз, сколько необходимо. Функция, в отличие от процедуры, обязательно возвращает значение.
Структура процедуры имеет следующий вид:
Procedure <имя процедуры>(формальные параметры : их тип);
Процедура вызывается по имени:
<имя процедуры> (фактические параметры);
Значение каждого фактического параметра при вызове процедуры передаётся формальному параметру. Временно управление передаётся процедуре. После завершения работы процедуры управление возвращается в основную программу.
Каждый формальный параметр указывается вместе со своим типом. Соответствующий ему фактический параметр указывается без типа. Между формальными и фактическими параметрами должно быть соответствие по количеству параметров, по их типу и порядку следования.
Другой вид подпрограммы-функция-оформляется аналогично процедуре. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров); результат обозначается именем функции и передаётся в основную программу. Функция оформляется в следующем виде:
Function <имя функции>(формальные параметры: тип): тип значения функции;
Вызывается функция по её имени с указанием фактических параметров.
Вызов функции можно делать непосредственно внутри выражения. При вызове функции тип не указывается.
21. Как в VBA оформляются и вызываются функции? Категории встроенных функций.
22. Встроенные типы данных VBA.
23. назначение переменных, их описание, локальные и глобальные переменные, назначение инструкции option Explicit
24. Массивы, их описание, доступ к элементам массива, многомерные массивы, динамические массивы, переопределение их размерности.
25. Пояснить связь математических понятий вектора и матрицы с понятиями одномерного и двумерного массивов в программировании.
26. Константы, их определение и использование. Доступ к данным, хранимым в ячейках Excel и в виде свойств объектов-элементов управления.
27. Собственные типы данных.
28. Основные группы инструкций языка Выжил Бесик . Инструкция присваивания, арифметические операции, конкатенация.
Чем отличаются понятия функции, процедуры и метода в программировании?
Периодически вижу все 3 определения. Это одно и то же или же что-то разное, и какое из понятий правильнее всего употреблять?
- Вопрос задан более трёх лет назад
- 82863 просмотра
КомментироватьРешения вопроса 2
Функция — подпрограмма, выполняющая какие-либо операции и возвращающая значение.Процедура — подпрограмма, которая только выполняет операции, без возврата значения.Метод — это функция или процедура, которая принадлежит классу или экземпляру класса.
Ответ написан более трёх лет назад
Нравится 30 5 комментариев
Забыли сказать, что у функции, процедуры и метода должно быть имя и параметры (или ничего, но скобки нужны в любом случае)
MaxLich, Ничего я не забыл. Это не имеет отношения к вопросу. Вопрос был: чем отличаются. А то что функция/процедура/метод имеет имя и список рациональных параметров это и так очевидно. Скобки — это вообще деталь реализации.
«Процедура», имхо, устаревшее понятие. Просто функция, которая не возвращает ничего (void). Это еще во времена Delphi процедура имела отдельное ключевое слово.
D3lphi, Ну я-то про определения, которые Вы дали. Это не просто подпрограмма, а подпрограмма, имеющая имя. Инициализатор (в джаве), например, тоже блок кода, подпрограмма, но имени не имеет, и параметров тоже, поэтому это не функция/метод.
MaxLich, это не определения, а лишь то, чем эти понятия отличаются друг от друга. Функция/процедура не обязана иметь имя — анонимные функции, как пример.
Всё это можно свести к понятию — подпрограмма. Бывает, читаешь книгу, там автор пишет о своём куске кода как о методе, потом его начинает называть функцией.
Ответ написан более трёх лет назад
Комментировать
Нравится 6 КомментироватьОтветы на вопрос 4
# @mindtester
http://iczin.su/hexagram_48
как бы да, но. только на самом начальном этапе, что бы угомонить хаос в голове новичка ))
в дальнейшем, все интереснее все эти понятия контекстно зависимые, контекстом является парадигма программирования и/или конкретный язык
1 — в контексте парадигм, из данных понятий уникально одно Метод, как уже было сказано D3lphi, это нечто принадлежащее классу. класс, в свою очередь, это фундаментальное понятие ООП основанного на классах (шарм ситуации в том, что ООП бывает тоже разное ;))
в этом случае чаще принято уточнять что метод — это один из видов челнов класса (бывают еще поля, свойства, интерфейсы но это уже контекст конкретного языка) .. и как верно заметил Griboks — он реализуется функцией или процедурой
но .. есть много языков, где понятия метод нет вообще
а еще есть функциональное программирование .. эта парадигма частично присутствует во многих современных языках, однако есть языки, где любой код только функция
2 — из контекста языков:
понятие процедура в явном виде, чаще всего употребляют преподаватели, которые сами учились на языках типа Fortran, Pascal или родственных, и либо не имели другого опыта вообще, либо иной опыт был на много скромнее
сейчас доминируют языки, основывающиеся на Си синтаксисе, даже java и js в данном вопросе станут родственниками классического Си
а в нем нет понятия процедуры, только функции.. а на случай, когда функция не обязана возвращать какую либо величину, просто указывается тип возвращаемого значения void
смешение всего этого на примере C# — в этом языке, все есть объект. а любой исполняемый код это метод, и методы реализуются только функциями (в тч void функциями)
Предназначение
В шестидесятых годах прошлого века в программных языках типа ALGOL и FORTRAN появилась возможность использовать функции. Это сделало программы более понятными по своей структуре и существенно меньшими в объёме. В идеальном случае программное приложение возможно было сформировать из набора вызываемых функций и среди них несколько операторов, управляющих работой базовой части программы (условные переходы и циклы). Процесс проектирования и отладки этих программ существенно ускорился и облегчился. Специалист имел возможность создавать программы, которые используют вызов функций ещё не имеющих фактического тела. Подпрограммы могут быть написаны позже. Но чтобы была возможность запустить и проверить такую программу без остановок по ошибкам, вместо реального тела функции возможно вставить специальные программные заглушки. К примеру, это может выводиться сообщение специалисту, отлаживающему программу, «выполняется функция _ имя функции». Вывод таких сообщений позволяет увидеть выполнения обращения к функции без сообщений об ошибках в базовой части программы. После формирования главной части программы в обобщённом формате, выполняется доработка её составных частей. То есть пишутся кодовые тела соответствующих функций, и они вставляются вместо заглушек.
Такой метод написания программ получил название «сверху вниз». То есть уже написанная программа постепенно обрастает нужными функциями. Модернизация таких программ в дальнейшем может быть сведена к изменению кодов уже имеющегося функционального набора и её могут делать другие специалисты, а не только разработчик программы. Естественно, нужно сохранять изначальный программный интерфейс, чтобы не нужно было менять базовую часть программы, которая содержит обращения к функциям.
Функции: определение и назначение
Основное назначение функций — повышение удобства и эффективности разработки программ, а также улучшение читаемости и поддерживаемости кода. Функции позволяют разбить программу на модули, каждый из которых выполняет конкретную задачу.
Функции имеют свое имя и список параметров. Они могут принимать значения параметров, обрабатывать их и возвращать результат. Параметры функции — это специальные переменные, которые передаются в функцию для использования внутри нее. Результат работы функции может быть использован в дальнейшем коде программы.
Преимущества использования функций:
- Модульность: функции позволяют разбить программу на модули, управлять сложностью кода и повторно использовать уже написанный код;
- Поддерживаемость: функции облегчают обновление и изменение программы, так как при изменении функции необходимо вносить правки только в одном месте;
- Читаемость: использование функций способствует более понятному и структурированному коду;
- Отладка: функции могут быть отдельно протестированы и отлажены, что упрощает обнаружение и исправление ошибок;
- Расширяемость: функции позволяют добавлять новый функционал и возможности в программу без изменения ее основной структуры.
Функции – это неотъемлемая и важная часть программирования, которая дает разработчикам возможность эффективно организовывать код и повышать уровень абстракции программы.
5.1.5. Побочный эффект¶
Побочный эффект (англ. Side Effect) – любые действия программы, изменяющие среду выполнения (англ. Execution Environment).
К побочным эффектам выполнения функции можно отнести:
изменение данных в памяти;
чтение/запись файла или устройства;
ввод/вывод значений;
самостоятельную реакцию на исключительные ситуации;
и др.
Часто функции с побочным эффектом при вызове несколько раз с одними и теми же аргументами в качестве результата возвращают разные значения. Пример – стандартная функция генерации случайного числа.
Создавая функцию, необходимо избегать побочных эффектов – такие функции легче тестируются и не содержат скрытых действий. Один из примеров такой функции – функция в .
Естественно, что полностью избежать побочных эффектов невозможно. В таких случаях необходимо локализовать участки кода с побочным эффектом в отдельные функции (Листинге 5.1.16).
Листинг 5.1.16 – Локализация кода с побочным эффектом в отдельные функции |
def heron(a, b, c): """Вернуть площадь треугольника по формуле Герона. Параметры: - a, b, c (float): стороны треугольника. Результат: - float: значение площади. - None: если треугольник не существует. """ if not (a + b > c and a + c > b and b + c > a): return p = (a + b + c) 2 return (p * (p - a) * (p - b) * (p - c))**0.5 def input_data(): """Запросить стороны треугольника с клавиатуры. Результат: - tuple of float: (a, b, c). Побочный эффект! """ return (float(x) for x in input('Введите стороны (a b c): ').split()) def print_res(res): """Вывести на экран 'res'. Параметры: - res (float): площадь треугольника. Побочный эффект! """ if res print('S = {:.2f}'.format(res)) else print('Треугольник не существует!') a, b, c = input_data() res = heron(a, b, c) print_res(res)
Предупреждение
Решая задачу, необходимо следить чтобы каждая проектируемая функция выполняла минимальную, логически полную задачу.
Например, если необходимо вычислить сумму и среднее значение элементов списка, правильнее будет создать 2 функции для каждого вычисления, а не одну; при этом ввод и вывод значений также оформить в виде отдельных функций.
Примеры использования процедур и функций
Процедуры и функции в Python позволяют облегчить написание кода, сократить его размер и повысить его читабельность. Вот несколько примеров использования:
- Разбиение задач на более мелкие части. Создание процедуры или функции для каждой из этих частей позволяет легче поддерживать и читать код.
- Избежание дублирования кода. Если у вас есть несколько участков кода, которые выполняют похожие функции, вы можете выделить повторяющуюся часть в отдельную функцию и вызывать ее вместо дублирования кода.
- Создание повторно используемых компонентов. Вы можете создать компоненты, которые будут полезны и пригодны для использования во многих программах или модулях.
- Повышение безопасности. Если выскользнувшая ошибка может повлиять на функцию, можно создать процедуру или функцию для обработки этой ошибки.
Рассмотрим пример создания функции в Python:
def sum_two_numbers(a, b):
result = a + b
return result
print(sum_two_numbers(5, 3)) # 8
Функция sum_two_numbers принимает два аргумента a и b и возвращает результат их суммирования.
Рассмотрим пример создания процедуры в Python:
def print_hello():
print(“Hello, world!”)
print_hello() # Hello, world!
Процедура print_hello не требует аргументов и выводит «Hello, world!» на экран.
Также в Python существует множество встроенных функций и процедур, таких как print, len и другие. Их использование очень распространено при написании кода на Python.
Процедуры в Python
Процедуры в Python – это блоки кода, которые могут быть вызваны из других частей программы. Они используются для группировки и организации кода, упрощения его чтения и понимания. Кроме того, процедуры позволяют избежать дублирования кода и повторного использования универсальных функций.
Процедуры в Python объявляются с помощью ключевого слова «def», после которого следует имя процедуры и ее параметры, если они есть. Затем идет блок кода, который выполняется при вызове процедуры.
Параметры процедуры представляют собой переменные, которые передаются в нее при вызове. Они служат для передачи данных внутрь процедуры и могут быть как обязательными, так и необязательными. Если параметр не является обязательным, то он имеет значение по умолчанию.
Процедуры могут возвращать результат своей работы с помощью ключевого слова «return». Этот результат может быть любым объектом – числом, строкой, списком и т.д. Если процедура не возвращает значение, то используется ключевое слово «pass».
Пример вызова процедуры:
def say_hello(name):
print(“Привет, ” + name)
say_hello(“Иван”)
Результат работы данного кода будет следующим: Привет, Иван.
Также существуют встроенные процедуры в Python, такие как «print», «len», «range» и т.д. Они могут быть использованы в любой части программы без дополнительного объявления.
Использование процедур позволяет создавать более модульный и читаемый код, а также повышает переиспользуемость кода. Кроме того, процедуры в Python являются одним из базовых понятий языка и необходимы для работы с библиотеками и фреймворками.
Функции в Python
Функция в языке программирования Python — это блок кода, который может быть вызван из другого места программы. Она может принимать аргументы и возвращать значения. Использование функций упрощает кодирование, предотвращает дублирование кода и упрощает его понимание.
Для определения функции в Python используется ключевое слово def. Функция может принимать один или несколько аргументов и возвращать одно или несколько значений. Функция может быть вызвана в любой части программы.
Python также предоставляет множество стандартных функций, таких как print(), len(), range() и многие другие. Они позволяют упростить написание кода и сократить время разработки.
Кроме того, функции в Python могут иметь значения аргументов по умолчанию и могут быть определены с произвольным числом аргументов. Такие функции называются функциями с переменным числом аргументов.
В Python функции также могут быть определены внутри других функций. Они называются вложенными функциями. Это может быть полезно, когда функция нужна только внутри другой функции и не должна быть доступна в других частях программы.
Использование функций — это ключевая часть программирования на Python. Хорошо написанные функции позволяют создавать более понятный и эффективный код, ускоряют процесс разработки и облегчают сопровождение программы.
Функция и процедура в программировании: основные отличия
Функция – это подпрограмма, которая возвращает значение в вызывающую ее часть программы. Она обычно используется для выполнения каких-либо вычислений или обработки данных. Функция может принимать аргументы – значения, которые передаются ей при вызове, и возвращать результат своей работы.
Процедура, в отличие от функции, не возвращает значение. Она выполняет некоторые действия или процессы, но не возвращает конечный результат. Процедура также может принимать аргументы и использовать их для выполнения определенных действий.
Основные отличия между функцией и процедурой заключаются в цели их использования. Функция часто используется для выполнения вычислений или получения определенных значений, которые могут быть использованы в дальнейшей работе программы. Процедура, с другой стороны, используется для выполнения определенных процессов или действий без необходимости возвращать конечный результат.
Функция | Процедура |
---|---|
Возвращает значение | Не возвращает значение |
Может принимать аргументы | Может принимать аргументы |
Результат работы используется в программе | Результат работы не используется в программе |
Может быть использована как часть выражения | Не может быть использована как часть выражения |
Хотя функции и процедуры имеют разные цели и особенности использования, они оба являются важными инструментами в программировании и широко применяются для создания программ различной сложности.
Чем процедура отличается от функции в программировании
03.01.2016 19:54 147
Пользователи, далекие от программирования в принципе, сталкиваются с понятиями функции и процедуры редко, и ассоциируются они с чем-то математическим и бюрократическо-медицинским. В программировании же этими понятиями оперирует множество языков, правда, даже специалисты порой не могут четко осознать разницу между функцией и процедурой. Как с тем сусликом: он есть, но его никто не видит. Посмотрим, настолько ли невидимы отличия.
Что означают понятия функция и процедура
Функция в программировании — подпрограмма, вызываемая из других подпрограмм необходимое число раз. Процедура — поименованная часть программы (подпрограмма), многократно вызываемая из последующих частей программы необходимое число раз.
Сравнение функции и процедуры
Основная разница между функцией и процедурой — в возвращаемом результате. По сути, и функции, и процедуры представляют собой логически неделимые блоки, из которых складывается код программы. Функция возвращает значение, процедура в большинстве языков программирования — нет, либо (в Си, например) возвращает пустое значение. В последнем случае (в Си) процедура считается подчиненной разновидностью функции. Заголовок функции содержит слово “function”, идентификатор (собственное имя функции), вариативно список параметров и обязательно — тип результата. В теле функции обязательно прописывается оператор, присваивающий значение имени функции, которое она вернет в качестве результата. Заголовок процедуры содержит слово “procedure”, идентификатор (имя процедуры) и вариативно список параметров. Вызов функции осуществляется в составе выражений там, где эти выражения применяются, вызов процедуры требует отдельного оператора. Вызов процедуры осуществляется только по имени, имя функции же связано с ее значением. На схемах алгоритмов вызов функции изображается в блоке вывода или в блоке процесса, вызов процедуры — в специальном блоке “предопределенный процесс”.
Когда использовать функции
Кодирование повторяющихся действий: Если в программе есть несколько участков кода, которые выполняют одни и те же действия, то можно вынести эти действия в отдельную функцию и вызывать ее каждый раз, когда это необходимо. Это позволяет сократить объем кода и сделать его более понятным и модульным.
Разделение сложных задач на более простые: Если задача, которую нужно выполнить, сложна и требует решения нескольких подзадач, то можно разделить ее на более маленькие функции, каждая из которых будет отвечать за решение своей подзадачи. Это упростит понимание и реализацию программы.
Улучшение читаемости кода: Использование функций позволяет дать осмысленные названия различным блокам кода, что делает программу более легкой для понимания и сопровождения.
Обработка и перенаправление ошибок: Функции могут быть использованы для обработки и перенаправления ошибок, что улучшает надежность и устойчивость программы.
Модульное тестирование: Функции представляют собой независимые блоки кода, которые можно тестировать отдельно от других. Это упрощает процесс тестирования и помогает обнаружить и исправить ошибки до их распространения на другие части программы.
В целом, функции являются мощным инструментом программирования, который позволяет упростить и структурировать код, повысить его понятность и гибкость. Использование функций в программировании становится особенно важным при работе с большими и сложными проектами.
Применение функций в различных языках программирования
Функции представляют собой важный инструмент программирования и используются в различных языках программирования для выполнения определенных операций. Они подразумевают создание блока кода, который можно вызывать из других частей программы для решения определенной задачи.
Функции имеют много полезных свойств и преимуществ:
- Модульность: функции позволяют разбить программу на отдельные блоки, которые могут быть повторно использованы в разных частях программы. Это приводит к улучшению структуры кода и упрощению его понимания.
- Улучшение читаемости: функции позволяют называть блоки кода осмысленными и информативными именами, что упрощает чтение и понимание программы.
- Упрощение отладки: функции позволяют изолировать определенные части кода, что делает процесс отладки более простым и эффективным.
- Уменьшение дублирования: функции позволяют избежать дублирования кода путем разделения его на меньшие, повторно используемые блоки.
Конструкция функций может отличаться в разных языках программирования, но общие принципы остаются схожими. Например, в языке Python функции определяются с использованием ключевого слова «def», а в языке JavaScript с использованием ключевого слова «function». В обоих случаях функции могут принимать параметры и возвращать значения.
Функции также могут быть анонимными, то есть не иметь имени, и использоваться в качестве аргументов для других функций. Это особенно полезно для работы с коллекциями данных, обработки событий и асинхронного программирования.
Примеры функций в разных языках программирования:
- В языке Python:
В языке JavaScript:
В языке C++:
Как видно из примеров, функции могут быть очень полезными и мощными инструментами программирования. Они помогают создавать более читаемый, модульный и эффективный код, что является важным аспектом разработки программного обеспечения.
Подпрограмма – это…
Подпрограмма – записанный отдельно и поименованный алгоритм, необходимый для решения конкретной задачи. В соответствующий компонент можно передавать различные данные для их дальнейшей обработки.
Подпрограмма – фундаментальное средство структурного программирования. Носит название «процедуры». Подпрограммы выполняют те или иные операции, но никаких значений они не возвращают.
Форма и особенности
Подпрограмма – обобщенный алгоритм, написанный по специальным правилам. Самостоятельно он не выполняется. Вызывается подпрограмма для обработки информации. Соответствующий алгоритм, предназначенный для работы с данными, называется. Он не будет самостоятельным – рассматриваемый компонент должен вызываться извне.
К ключевым особенностям изучаемого элемента относят:
- Возможность уменьшения объема исходного кода. Это позволяет ускорить и облегчить тестирование и отладку контента.
- Снижение ошибок в будущем приложении.
- Повышение читабельности кода программы. В некоторых проектах смогут разобраться даже новички.
- Ускорение разработки схожих программных продуктов. Достигается за счет того, что рассматриваемый компонент может использоваться «готовым блоком» для будущих проектов.
- Возможность абстрагироваться от деталей при применении подпрограмм вместо крупных алгоритмов в основной программе.
Соответствующий элемент – важная и очень удобная для разработчика часть в программировании.
Для чего нужны
Рассматриваемый элемент – это средство оптимизации программ по объему занимаемой памяти. В исходном коде с его помощью удалось избежать повторений одинаковых блоков – теперь они описываются однократно. Вызываются по мере необходимости.
Сейчас изучаемый компонент – это вспомогательное средство. Ключевое его назначение – помощь структуризации для упрощения понимания и сопровождения:
- Выделение набора действий с его последующим вызовом по мере надобности дает возможность логически выделить целостную подзадачу, которая имеет типовое решение.
- Однократное применение тоже оправдано. Оно дает возможность сократить объем целостного блока кода.
Главное – разобраться в принципах составления компонента и его параметрах.