Как найти область определения функции и область значения функции: область определения и область значений функций + ПРИМЕРЫ

Функция. Область определения функции. Область значений функции — АЛГЕБРА — Уроки для 7 классов — конспекты уроков — План урока — Конспект урока — Планы уроков

Урок № 60

Тема. Функция. Область определения функции. Область значений функции

 

Цель: закрепить терминологию, отработать навыки работы с понятиями функции; отработать навыки работы с функцией, заданной формуле и таблично; находить функции, аргумента, области определения функции.

Тип урока: усвоение умений и навыков.

Ход урока

I. Организационный момент (традиционно)

 

II. Проверка домашнего задания

@ Поскольку основная часть домашнего задания — освоение теории (определения понятий), то целесообразно проверку домашнего задания провести в форме математического диктанта.

1. Математический диктант

1) Задайте формулой функцию, которая сопоставляет каждому числу третий степень этого числа [сумма этого числа с числом 5].

2) Функция задана формулой . Найдите ее значение при значении аргумента -2 [-1].

3) Функция задана формулой у = 3х — 7 [у = 5 — 2х]. Найдите значение аргумента, при котором значение функции равно нулю.

4) При каких значениях переменной имеет смысл выражение ?

После выполнения проводится коррекция (работа в парах).

2. Работа с опережающим домашним заданием.

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

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

Вопрос

1. Что называют допустимым значением переменной в выражении? Приведите пример.

2. Что означает термин «область допустимых значений переменной в выражении»? Как кратко обозначается?

3. Как найти ОДЗ в выражении, которое имеет вид: а) многиочлена; б) дроби, где в знаменателе число; в) дроби, знаменателем которого является буквенный выражение; г) целого выражения?

4. Найдите ОДЗ выражений: а) х + 3; б) ; в) ; г) (х + 3)2; д) .

5. Назовите аргумент и зависимую переменную, если функция задана формулой . Каких значений приобретает функция при значении аргумента -1; 2; -3? Можно ли вычислить значение функции при х = 0? Почему? Существует ли еще какое-либо значение аргумента, при котором нельзя вычислить значение выражения? Почему? Какой будет область определения функции , исходя из сказанного выше?

6. Сравните вывод п. 4 п. 5. Что вы заметили? Какое предположение можно сделать на основании этого сравнения.

 

III. Формулировка цели и задач урока

@ Из работы, выполненной на предыдущем этапе урока, учащиеся должны сделать важный вывод: область определения функции может быть найдено через ОДЗ выражения, задающего данную функциональную зависимость. То есть задания функции формулой является наиболее удобным способом задания функции именно потому, что помогает решать задачи с незнакомыми или новыми для учеников объектами (функция, аргумент, область определения функции) путем выполнения знакомых ученикам действий (вычислением значений буквенных выражений, решением уравнений и нахождением ОДЗ выражения).

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

 

IV. Дополнение знаний

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

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

— Существует общее правило (алгоритм) для нахождения области определения функции, которая задана формулой?

Выполнив несколько упражнений и сравнив результаты (например, найти ОДЗ выражения х+3 и найти область определения функции у = х + 3 и т. д.), приходим к выводу, который можно записать в конспекты учащихся.

 

Конспект 16

Как найти область определения функции

Вид функции

Формулировка

Пример

1

Многочлен

Область определения: х — любое число

у = х2 + 3х — 2 — многочлен; область определения: х — любое число

2

Целый выражение

Область определения: х — любое число

у = (х + 3)2 — (х — 1)2 — целое выражение; область определения: х — любое число

3

Дробный выражение (знаменатель — буквенный выражение)

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

— дробное выражение,

х + 3 ≠ 0, х ≠ -3.

Область определения: х ≠ -3 (х — любое число, кроме -3)

 

V. Первичное закрепление материала

Выполнение устных упражнений

1. Дано функцию: 1) у = х + 3; 2) у = х2 + (х — 1)2; 3) .

а) Какова область определения функции? Почему?

б) какое значение приобретает функция при значении аргумента х = 1; х = -1?

в) существует Ли такое значение аргумента, при котором функция равна 0?

 

VI. Применение умений и навыков

Выполнение письменных упражнений

1. Функция задана формулой . Заполните таблицу.

 

х

-12

-6

 

 

 

 

3

-4

 

1,5

в

 

 

1

2

-3

4

 

 

0,5

 

 

2. Найдите область определения функции, заданной формулой:

1) у = х2 + 1; 2) ; 3) ; 4) .

3. Функция задана формулой у = х2 — 4х + 1. Составьте таблицу значений этой функции с шагом 1, где -3 ≤ х ≤ 4.

4. У мальчика было 1 грн. 50 к. Он купил х календариков по 25 к за штуку. Обозначив число копеек, оставшихся у мальчика, буквой у, задайте формулой зависимость у от х. Какова область определения этой функции? А область значений функции?

5*. Дополнительно (логическая упражнение). Найдите пропущенное число, букву, выражение или рисунок.

 

 

VII. Итоги урока

Какие основные понятия темы «Функция» были рассмотрены на уроке?

Установите логическую связь между названными понятиями.

 

 

VIII. Домашнее задание

Повторив содержание основных теоретических положений урока (см. схему) выполните упражнения.

№ 1. Функция задана формулой: .

Заполните таблицу:

 

х

-12

-6

 

 

 

 

24

-24

в

 

 

2

3

-4

-6

 

 

 

№ 2. (Придумайте) задайте формулой функцию, в которой область определения:

1) любое число; 2) все числа, кроме 2; 3) все числа, кроме чисел -2 и 2?

№ 3. 2-4x+3

Множество всех значений, которые может принять зависимая переменная, называется областью значения функции и обозначается E (f) или E (y).

Валерий Волков 5 15.01.2016

Будем рады, если Вы поделитесь ссылкой на этот видеоурок с друзьями!

Новости образования

ЕГЭ по математике

Профильный уровень

Задание 1     Задание 2

Задание 3     Задание 4

Задание 5     Задание 6

Задание 7     Задание 8

Задание 9     Задание 10

Задание 11     Задание 12

Задание 13     Задание 14

Задание 15     Задание 16

Задание 17     Задание 18

Задание 19     Задание 20

Задание 21

ГИА по математике

Задача 1     Задача 2

Задача 3     Задача 4

Задача 5     Задача 6

Задача 7     Задача 8

Задача 9     Задача 10

Задача 11     Задача 12

Задача 13     Задача 14

Задача 15     Задача 16

Задача 17     Задача 18

Задача 19     Задача 20

Задача 21     Задача 22

Задача 23     Задача 24

Задача 25     Задача 26

Демонстрационные варианты ОГЭ по математике

Математика. 5 класс.

Натуральные числа

Обыкновенные дроби

Десятичные дроби

Проценты

Математика. 6 класс.

Делимость чисел

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

Умножение и деление обыкновенных дробей

Отношения и пропорции

Положительные и отрицательные числа

Измерение величин

Математика. 7 класс.

Преобразование выражений

Многочлены

Формулы сокращенного умножения

Математика. 8 класс.

Модуль числа. Уравнения и неравенства.

Квадратные уравнения

Квадратные неравенства

Уравнения с параметром

Задачи с параметром

Математика. 9 класс.

Функции и их свойства

Прогрессии

Векторы

Комбинаторика, статистика и теория вероятностей

Математика. 10 — 11 класс.

Числовые функции

Тригонометрические функции

Тригонометрические уравнения

Преобразование тригонометрических выражений

Производная

Степенные функции

Показательная функция

Логарифмические функции

Первообразная и интеграл

Уравнения и неравенства

Комбинаторика

Создаёте видеоуроки?

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

Актуально


Физкультминутки для школьников и дошкольников

Подготовка к ЕГЭ Подготовка к ОГЭ

© 2007 — 2022 Сообщество учителей-предметников «Учительский портал»
Свидетельство о регистрации СМИ: Эл № ФС77-64383 выдано 31.12.2015 г. Роскомнадзором.
Территория распространения: Российская Федерация, зарубежные страны.
Учредитель / главный редактор: Никитенко Е.И.


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

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


Фотографии предоставлены

Пять мощных функций области действия Kotlin, которые вы должны уметь использовать | Саймон Вирц

Нью-Йорк вершина скалы

Функции в Kotlin очень важны, и они являются одним из многих жизненно важных аспектов языка. Один специальный набор стандартных функций называется scope functions , которые являются частью библиотеки Kotlin: let , run , также , apply и with .
Есть большая вероятность, что вы уже сталкивались с ними, но, возможно, вам нужны советы о том, как правильно выбрать и как их использовать. В этой статье я хочу продемонстрировать различия между всеми функциями области видимости и обсудить соответствующие варианты использования. Ближе к концу статьи будет пример, показывающий, как применять функции области видимости, чтобы структурировать код Kotlin более идиоматично.

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

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

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

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

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

Простая функция высшего порядка, широко известная в Kotlin, называется repeat и он определен в стандартной библиотеке:

Как показано, repeat принимает два аргумента: обычное целое число умножить на и функцию типа (Int) -> Unit . Согласно приведенному ранее определению, repeat является функцией высшего порядка , поскольку она «принимает одну или несколько функций в качестве аргументов». В своей реализации функция просто вызывает действий так часто, как указывает раз . посмотрим как 9Можно использовать 0005 повтор :

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

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

Kotlin продвигает еще одну очень важную концепцию, которая делает функции еще более мощными. Если вы когда-либо видели внутренние доменные языки (DSL) в действии, вы, возможно, задавались вопросом, как они реализованы. Наиболее подходящее понятие для понимания называется 9Функциональный литерал 0003 с приемником (также лямбда с приемником). Поскольку эта функция также важна для функций области видимости, она будет обсуждаться в следующей части.

Функциональные литералы с получателем часто используются в сочетании с функциями более высокого порядка. Как было показано ранее, функции можно сделать параметрами других функций, что происходит путем определения параметров с синтаксисом типа функции (In) -> Out . Теперь представьте, что эти типы функций можно даже усилить, добавив Приемник : Приемник.(Вход) -> Выход . Такие типы называются функциональными литералами с приемником, и их лучше всего понять, если представить их как «временные функции расширения». Возьмем следующий пример:

Функцию createString можно рассматривать как функцию более высокого порядка, поскольку она принимает в качестве аргумента другую функцию блока . Этот аргумент определяется как литерал функции с типом получателя. Теперь давайте подумаем об этом как о функции расширения, определенной для StringBuilder , который будет передан функции createString . Клиенты будут передавать произвольные функции с сигнатурой () -> Unit , которые можно будет вызывать на экземплярах StringBuilder . Это также показано в реализации: создается экземпляр StringBuilder , и для него вызывается блок . В конце концов, метод преобразует StringBuilder в обычную строку и возвращает ее вызывающей стороне.

Как можно создавать и передавать функциональные литералы с получателем другим функциям?

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

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

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

Документация: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/let.html

Одна из самых известных функций области видимости — let . Он вдохновлен функциональными языками программирования, такими как Haskell, и довольно часто используется в языке Kotlin. Давайте проверим его подпись:

  • Определено как расширение на T , получатель/объект контекста
  • Универсальный тип R определяет возвращаемое значение функции
  • Результат R блока будет результатом let , т.е. это может быть произвольное значение block 6 90 обычная функция с аргументом
  • 90 type (T) -> R
  • Receiver T передается в качестве аргумента блоку

Варианты использования

a. Идиоматическая замена if (object != null) блоков

Как вы можете прочитать в разделе Kotlin Idioms, let предполагается использовать для выполнения блоков, если определенный объект не является null .

Обнуляемая переменная text помещается в новую область действия с помощью let , если она не равна null . Затем его значение сопоставляется с его длиной . В противном случае значение null сопоставляется с длиной по умолчанию 0 с помощью оператора Элвиса. Как видите, объект контекста текст отображается как it внутри let , что является неявным именем по умолчанию для отдельных параметров лямбды.

б. Сопоставить значение, допускающее значение NULL, если не null

Функция let также часто используется для преобразований, особенно в сочетании с типами, допускающими значение NULL. Этот подход также определяется как идиома.

в. Ограничить область действия переменной/вычисления

Если предполагается, что определенная переменная или вычисление доступны только в ограниченной области и не должны загрязнять внешнюю область, let полезно:

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

Документация: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/run.html

В качестве альтернативы let функция run использует функциональный литерал с приемником, который используется для параметра блока . Давайте проверим его сигнатуру:

  • Определен как расширение T , получатель/объект контекста
  • Общий тип R определяет возвращаемое значение функции
  • Результат R блока

    6 будет запустить саму

    , т.е. это может быть произвольное значение
  • блок аргумент, определенный как функциональный литерал с получателем T.() -> R

Варианты использования

run может в основном обслуживать те же варианты использования, что и let , тогда как получатель T отображается как this внутри лямбда-аргумента:

a. Идиоматическая замена если (объект != ноль) блоки

b. Transformation

Также хорошо использовать run для преобразований. Ниже показан пример, который даже более удобочитаем, чем с let , поскольку он обращается к функциям объекта контекста без квалификаторов:

Документация: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/also.html

Функция также — это функция области видимости, которая была добавлена ​​в язык Kotlin последним в версии 1.1. Давайте проверим его подпись:

  • , определяемый как расширение на T , приемник/контекстный объект
  • Возвращает объект приемника T
  • Блок с регулярной функцией типа (T) -> Блок
  • GESIFITER (T) -> Блок
  • GESEIVER TIPE (T) -> Блок
  • . передается в качестве аргумента блоку

также выглядит как let , но в качестве результата возвращает получателя T .

Варианты использования

а. Приемник не используется внутри блока

Может потребоваться выполнить некоторые задачи, связанные с объектом контекста, но фактически не используя его внутри лямбда-аргумента. Примером может быть ведение журнала. Как описано в официальных соглашениях о кодировании Kotlin, использование и является рекомендуемым способом решения сценариев, подобных показанному ниже:

В этом случае код читается почти как обычное предложение: Присвойте что-то переменной и также войти в консоль.

б. Инициализация объекта

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

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

в. Присвоение вычисляемых значений полям

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

Значение вычисляется и присваивается полю с помощь и . Поскольку также возвращает это вычисленное значение, его можно даже сделать прямым встроенным результатом функции окружения.

Документация: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/apply.html

Функция apply — это еще одна функция области действия, которая была добавлена ​​по просьбе сообщества. Его основной вариант использования — инициализация объектов, аналогично тому, что делает и . Разница будет показана далее. Давайте сначала проверим его подпись:

  • Определяется как расширение T , объект получателя/контекста
  • Возвращает объект получателя T
  • блок аргумент, определенный как функциональный литерал с получателем T. () -> R

Отношение между apply и , а также такое же, как между 60 run и 9000 Обычная лямбда по сравнению с Функциональный литерал с получателем Параметр

Отношение ( применить , также ) == Отношение ( 0 5 запустить 0006 )

Варианты использования

а. Инициализация объекта

Конечным вариантом использования apply является инициализация объекта. Сообщество на самом деле запросило эту функцию на относительно поздней стадии языка. Вы можете найти соответствующий запрос функции здесь.

Хотя и уже были показаны как инструмент для решения этих сценариев, применить имеет большое преимущество: нет необходимости использовать или в качестве квалификатора, поскольку объект контекста, 9Экземпляр 0005 Bar в этом случае выставляется как this . На разницу ответили в этом сообщении StackOverflow.

б. Использование методов в стиле Builder, которые возвращают Unit

Как описано в разделе Kotlin Idioms, apply можно использовать для обертывания методов, которые обычно приводят к ответам Unit .

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

Документация: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/with.html

Функция с — это последняя функция области видимости, которую мы хотим рассмотреть. Это очень распространенная функция во многих старых языках, таких как Visual Basic и Delphi.
Отличается от остальных четырех функций тем, что не определен как функция расширения . Давайте проверим его сигнатуру:

  • Определена как независимая функция, которая принимает объект получателя/контекста T в качестве первого аргумента
  • Результат R блока будет результатом с самим , т.е. быть произвольным значением
  • аргумент блока , определенный как литерал функции с получателем T.() -> R

Эта функция выравнивается с пусть и запускают в отношении возвращаемого значения R . Часто говорят, что это похоже на apply ; разница была описана здесь. Еще одно простое описание с можно найти здесь (оба StackOverflow).

Варианты использования

а. Работа с объектом в ограниченной области

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

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

б. Использование расширений членов класса

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

Объект Foo определяет функцию расширения члена random() , которую можно использовать только в рамках этого объекта. С помощью с этого можно легко добиться. Обратите внимание, что эта стратегия особенно рекомендуется, если определенные функции расширения должны быть сгруппированы осмысленно.

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

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

Функции области позволяют и запускать , с другой стороны, обе возвращают произвольный результат R , т.е. результат самого блока. Опять же, run работает с литералом функции с приемником, тогда как let использует простой тип функции.

И последнее, но не менее важное: с — это своего рода несоответствие между функциями области видимости, поскольку оно не определено как расширение T . Он определяет два параметра, один из которых представляет объект-получатель этой функции области видимости. То же, что и , применить и запустить , с работает с функциональным литералом с приемником.

Поддержка IDE

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

В этом разделе я собираюсь показать пример, который применяет ранее обсуждавшиеся функции области действия к довольно простому варианту использования: вызов конечной точки HTTP REST. Цель состоит в том, чтобы предоставить функциональность для запроса информации об участниках проекта jetbrains/kotlin GitHub. Для этого мы определяем соответствующую конечную точку GitHub и упрощенное представление Contributor , аннотированный для Jackson:

Ниже показан код, обеспечивающий желаемую функциональность в исходной форме:

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

  • Когда результат уже закеширован, немедленно вернуть его и пропустить остальные
  • Создать объект запроса с помощью ENDPOINT
  • Получить ответ, выполнив запрос на клиенте
  • Извлечь данные JSON из объекта ответа (обработка ошибок опущена) Массив
  • Фильтр для искомого участника
  • Кэшировать результат и вернуть его клиенту

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

Обзор кода

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

Рефакторинг №1

Первое, что мы можем улучшить, это блок if в самом начале: . Применительно к конкретному примеру получаем следующее:

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

Оператор Elvis, показанный ранее, очень часто используется для обработки случая else , т.е. когда получатель null . Чтобы сделать код более читабельным, приватная функция requestContributor теперь обрабатывает промах кэша.

Вот и все, блок if был заменен простым вызовом тоже . Более идиоматическое решение.

Рефакторинг №2

Следующая часть, которую стоит пересмотреть, содержит ненужную локальную переменную, представляющую запрос объект:

Он буквально используется только для получения объекта ответа от клиента и поэтому может быть просто встроен. В качестве альтернативы показанные действия можно рассматривать как базовое преобразование , которое мы научились выражать с помощью функции let : . Это делает локальную переменную запроса устаревшей, не влияя отрицательно на читаемость.

Рефакторинг №3

Следующий фрагмент указывает на другой блок if (obj != null) , который в данном случае может быть решен с помощью let :

Опять же, оператор Elvis обрабатывает null сценарий очень красиво.

Рефакторинг №4

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

Рефакторинг №5

После первых нескольких рефакторингов ситуация выглядит следующим образом: У нас есть ответ , responseAsString и переменная contributors и еще нужно отфильтровать Contributors s для 900 желаемая запись. По сути, вся обработка запросов и ответов не имеет отношения к последнему этапу фильтрации и кэширования. Мы можем плавно сгруппировать эти вызовы и ограничить их областью действия. Так как эти действия происходят с помощью OkHttpClient , имеет смысл сделать клиент контекстным объектом этой области:

Здесь нет никакого нового кода, предыдущие правки были просто завернуты в вызов с и поэтому не видны в окружающую область (функция requestContributors ) больше. В этом случае имело смысл использовать с , поскольку он выставляет клиента как , этот и вызов newCall , следовательно, могут опустить его квалификатор. Как уже было сказано, с может иметь произвольный результат R . В этом случае последний оператор внутри лямбды, результат последнего вызова let , становится R .

Рефакторинг №6

Теперь во внешней области видимости доступна единственная переменная contributors и мы можем применить фильтрацию:

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

Вся функция выглядит так:

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

В этой статье я обсудил мощный набор функций области действия стандартной библиотеки Kotlin. Многие ситуации могут быть решены очень идиоматично с помощью этих функций, и очень важно иметь общее представление о различиях между ними. Постарайтесь запомнить, что есть функции области видимости, которые могут возвращать произвольные значения ( let , run , with ) и те, которые возвращают сам приемник ( применяют , также ). Затем есть функции, которые выставляют свой приемник как это ( пусть , тоже ) и другие которые выставляют свой ресивер как это ( запускают , применяют , с ). Заключительный пример продемонстрировал, как легко можно использовать функции области видимости для рефакторинга соответствующих разделов кода в соответствии с изученными ранее концепциями. У вас не должно сложиться впечатление, что нужно использовать каждую возможность; по-прежнему необходимо рассуждать о применении функций области видимости. Кроме того, вы не должны пытаться использовать каждую из показанных функций любой ценой, поскольку большинство из них можно использовать взаимозаменяемо. Попробуйте найти свои собственные фавориты. 🙂

Как работает область видимости в JavaScript

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

В JavaScript переменные, объекты и функции могут иметь глобальную область действия, область действия модуля, область действия блока или область действия функции.

Глобальная область видимости в JavaScript

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

Например, объявление глобальной переменной в одном файле:

 // index.js 
let globalVariable = "some value"

Означает, что любой другой скрипт в вашей программе может получить к нему доступ:

 // otherScript.js 
console.log(globalVariable) // некоторое значение

Объявление Переменные JavaScript в глобальной области видимости — плохая практика, потому что это может привести к загрязнению пространства имен. Глобальное пространство имен — это верхнее пространство Javascript, которое содержит переменные, объекты и функции. В браузере он прикрепляется к Window , в то время как NodeJS использует объект с именем global .

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

Область действия модуля

Модуль — это отдельный файл, который инкапсулирует и экспортирует фрагменты кода для использования другими модулями в проекте. Это позволяет более эффективно организовывать и поддерживать кодовую базу.

Модули ES формализовали шаблон модуля JavaScript в JavaScript в 2015 году.

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

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

Вот пример, показывающий экспорт класса:

 // index.js 
Export Class Foo {
Constructor (Property_1, Property_2). экспортируемое свойство:

 // someModule.js 
import { Foo } from './index.js'

const bar = new Foo('foo', 'bar')

console.log(bar.property_1) // foo

Файлы не объявлены как модули по умолчанию в JavaScript.

В клиентском JavaScript вы можете объявить скрипт как модуль, установив для атрибута type значение module в теге script :

  

В NodeJS вы можете объявить скрипт как модуль, установив для свойства type значение module в файле package.json :

 { 
   "type": "module"
}

Область блока

Блок в JavaScript — это место, где пара фигурных скобок начинается и заканчивается.

Переменные, объявленные в блоке с ключевыми словами let и const , относятся к этому блоку, то есть вы не можете получить к ним доступ за его пределами. Эта область не применяется к переменным, объявленным с использованием ключевого слова var :

 { // Начало блока 
    const one = '1'
    let two = '2'
    var three = '15' 90 // Конец block

console.log(one) // выдает ошибку

console.log(three) // "3"

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

Область действия функции

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *