Задать вопрос
ragnar_ok
@ragnar_ok

Применимы ли генераторы для переиспользования кода?

Известно, что генераторы нужны для оптимизации потребления памяти при обработке больших массивов. А если использовать генератор, чтобы придерживаться DRY?

В моем коде требуется несколько раз переиспользовать foreach вложенный в foreach. Чтобы избежать дублирования написал простой генератор. В этом контексте использование генератора оптимально? Или можно при помощи нативных функций php избежать такого дублирования?

function generate(array $array, string $key): Generator
{
    foreach ($array as $item) {
        if (empty($item[$key]) || !is_array($item[$key])) {
            continue;
        }

        foreach ($item[$key] as $value) {
            yield $value;
        }
    }
}


sandbox.onlinephpfunctions.com/code/64de77be858114...
  • Вопрос задан
  • 148 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Для провторного использования кода генераторы как раз подходят.
В частности, они позволяют использовать полиморфизм, в едином интерфейсе обращаться как к изначально итерируемым ресурсам, так и к потокам.

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

Синтаксический сахар, которым, по сути, является генератор, никогда никакого отношения к потреблению ресурсов не имеет.
Ресурсы всегда экономит (или не экономит) тот код, который мы заворачиваем в генератор. Но сам он вообще не при делах. Всё, что "наэкономит" генератор, можно сэкономить и без него.

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

В моем коде требуется несколько раз переиспользовать foreach вложенный в foreach.


Скорее всего генератор здесь будет бессмысленным.
Чтобы понять, насколько здесь нужна какая-либо оптимизация, надо привести ИСХОДНЫЙ код, про который вдруг в голову ударила идея что его надо обязательно "оптимизировать"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы