«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2020/08/06 14:42:27  №1770074 1
>>1731888 (OP)
ОП, проверь Вектор - https://ideone.com/06qnUR сделал с антикризисными мерами.

Пробовал создавать новые объекты vector через сlone, не получалось (данные были одинаковы во всех остальных после применения антикризисных мер), пришел к сериализации.
Ответы: >>1786072 >>1792962
Аноним 2020/08/30 17:17:25  №1792962 2
>>1770074 →

> Пробовал создавать новые объекты vector через сlone, не получалось

Если ты клонируешь объект, содержащий другие объекты (например, клонируешь Департамент, в котором есть Работники), то основной объект клонируется, а вложенные - нет, просто в объект-клон копируются ссылки на них. Надо использовать магический метод __clone и в нем вручную клонировать вложенные объекты.

Антикризисные меры логичнее сделать в отдельном объекте ("антикризисный комитет"). Так как у каждого класса должна быть своя зона ответственности, а в твоем примере Департамент отвечает и за управление списком работников, и за антикризисные меры. Дальше добавится еще задача, ты ее снова засунешь в Департамент, и получится класс-монстр, который занимается всем на свете.

> dismissEmployee(int $id)

Неудачно сделан аргумент - id - откуда мы его должны брать, он ведь не прописан в Работнике? Логичнее было бы сюда передавать объект-работника и пусть класс сам разбирается, как его найти.

Увольнение инженеров лучше было бы сделать так:

- выбрать всех инженеров (метод в департаменте)
- отсортировать по рангу (usort)
- отрезать первые 40% (array_slice)
- уволить по получившемуся списку

То есть тут можно использовать готовые функции работы с массивами вместо сложных циклов с кучей if внутри.

> $job = get_class($search->getJob());
> $search->setJob(new $job(), $maxRank, true);

Тут стоило сделать метод changeRank() в Employee. Так как этот класс отвечает за хранение и обновление ранга, и код логичнее всего поместить в него. И $e->changeRank(...) проще читать, чем это.

Неудачно сделан учет ранга. Логично иметь объект Job с базовыми (неизменными) ставками, и отдельно поле rank, и при расчете зарплаты учитывать ранг. А ты вместо этого меняешь сами базовые ставки в объекте Job. Если вызвать метод updateJob() несколько раз, то базовая ставка будет многократно увеличена:

$emp->updateJob(3);
$emp->updateJob(3);
$emp->updateJob(3);

То есть этот метод работает некорректно.
Ответы: >>1793026 >>1794773
Аноним 2020/08/30 17:58:12  №1793026 3
>>1792962
Спасибо. Сделаю рефакторинг и отправлю еще раз =)