Элегантный и практичный yield | OTUS
🔥 Что нужно, чтобы писать чистый код?
Курс «Архитектура и шаблоны проектирования». Спеццена для сдавших тест!
Подробнее

Курсы

Программирование
Flutter Mobile Developer Подготовка к сертификации Oracle Java Programmer (OCAJP)
-8%
Алгоритмы и структуры данных
-12%
Backend-разработчик на PHP
-8%
Web-разработчик на Python
-11%
Архитектура и шаблоны проектирования
-14%
Супер-интенсив «СУБД в высоконагруженных системах»
-18%
iOS-разработчик. Базовый курс
-23%
Разработчик на Spring Framework
-23%
Python Developer. Basic
-16%
C# ASP.NET Core разработчик
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
Highload Architect
-9%
React.js Developer
-12%
Android Developer. Professional
-7%
Software Architect
-12%
Разработчик C# AWS для разработчиков Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов Backend-разработка на Kotlin Agile Project Manager Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Advanced Fullstack JavaScript developer Супер-интенсив "Tarantool"
Инфраструктура
PostgreSQL
-10%
IoT-разработчик
-12%
Administrator Linux. Professional
-11%
Базы данных
-19%
Administrator Linux.Basic
-18%
Супер-интенсив «СУБД в высоконагруженных системах»
-18%
Супер-интенсив "SQL для анализа данных"
-16%
Highload Architect
-9%
MS SQL Server Developer Безопасность Linux Cloud Solution Architecture Разработчик голосовых ассистентов и чат-ботов Внедрение и работа в DevSecOps Администратор Linux. Виртуализация и кластеризация Нереляционные базы данных Супер-практикум по использованию и настройке GIT Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Элегантный и практичный yield

Csharp_Deep_30.9-5020-637bc4.png

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

        public List<Person> GetPersonsWithOrders1()
        {
            var result = new List<Person>();
            foreach (var person in GetPersons())
            {
                person.Orders = GetOrdersForPerson(person);
                result.Add(person);
            }
            return result;
        }

Сначала он получает из БД список сотрудников (в котором может быть 300-500 человек), и по каждому сотруднику подтягивается информация об обработанных им заказах, число которых может достигать нескольких сотен или даже тысяч.

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

Для решения данной проблемы достаточно немного доработать первую функцию:

        public IEnumerable<Person> GetPersonsWithOrders2()
        {
            foreach (var person in GetPersons())
            {
                person.Orders = GetOrdersForPerson(person);
                yield return person;
            }
        }

Здесь мы используем неоправданно забытое многими программистами ключевое слово yield.

Что это даёт?

Во-первых, код становится короче и удобнее для чтения.

Во-вторых, в случае следующего вызова метода GetPersonsWithOrders2().Take(10); список заказов запрашивается только для 10 сотрудников, которые находятся на первой странице портала, что облегчит жизнь БД!

А как вы используете yield? Пишите в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться