[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Возможен ли нормальный код в данной ситуации?
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) сделать одну функцию, которая в зависимости от флага будет возвращать один или два списка
Плюсы - быстро, минусы - еще более нечитаемо, куча ср.ных ифов


Каждый из вариантов мне кажется г.внокодом, но к сожалению, на ум не приходит ничего другого, а очень хотелось бы совета, как можно сделать все по нормальному, как сделали бы Вы
S.Chushkin
Правильно будет:
1) Использовать ООП, а не функции.
2) Создать класс с тремя методами, типа:
- LoadBadUsers()
- LoadGoodUsers()
- LoadAllUsers()
3) Пользовать тот метод, который требуется в конкретном случае.

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

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Forever
Цитата (S.Chushkin @ 29.03.2020 - 22:38)
Правильно будет:
1) Использовать ООП, а не функции.
2) Создать класс с тремя методами, типа:
- LoadBadUsers()
- LoadGoodUsers()
- LoadAllUsers()
3) Пользовать тот метод, который требуется в конкретном случае.

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

Ну вообще да, это я в классе делал, методами:)
FatCat
Цитата (S.Chushkin @ 29.03.2020 - 21:38)
Создать класс с тремя методами, типа:
- LoadBadUsers()
- LoadGoodUsers()
- LoadAllUsers()

Предпочитаю в методе подставлять:
LoadUsers("Bad") /LoadUsers("Good") /LoadUsers("All")

_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.