Как написать нормальный код в данном случае?

Forever

Новичок
Реальный пример:

Одной функцией из БД выбираются модели $departments (отделы) вместе с их сотрудниками $department->users ( через один ко многим)
вместе с нормочасами сотрудников user->tracked_hours (тоже один ко многим)

Из этой коллекции моделей нужно получить два списка сотрудников:

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

1) Можно написать функцию ,которая пройдет по коллекции и вернет массив с двумя списками
Код:
return [
    'bad_users' => []
    'good_users' => []
]
Один элемент в каждом списке выглядит как то так:
['user' => 'Вася',
'tracked_hours' => число выработанных часов',
'hours_minimum' => минимум часов которые нужно вырабатывать,
'percent_of_minimum' => сколько часов не хватило до нормы в процентах,
'hours_diff_from_minimum' => сколько часов не хватило до нормы
]
Для второго списка еще добавляется массив отгулов и отпусков, из-за которых не была набрана норма
Довольно много вычислений на одну итерацию

Плюсы :
- за один проход по коллекции получаем все нужные данные , меньше нагрузки

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


2) Написать две Функции, которые будут возвращать разные списки

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


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


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

WMix

герр M:)ller
Партнер клуба
не особо переиспользуемо, т.к. всегда возвращаются два списка, а может нужен один
а ты возвращай один со статусом на строку к примеру, добавь фильтр

Минусы - в два раза медленнее,
точно в два раза?

на одну и ту же коллекцию
либо плохой либо хороший, не?

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

Forever

Новичок
либо плохой либо хороший, не?

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

Но ты прав, в таких случаях лучше решать проблемы по мере поступления,тем более не банковскую систему пишу
 
Сверху