Вопрос по структуре классов ООП

101
04 марта 2021, 04:20

Существует несколько видов работников: программист, дизайнер, тестировщик, менеджер . Есть разные виды работ: 1) писать код, 2) тестировать код, 3)общаться с менеджером, 4) рисовать, 5)ставить задачи. Каждый из работников может выполнять определенную работу, к примеру программист может выполнять 1,2 и 3 виды работ, дизайнер в свою очередь 3,4, тестировщик - 2,3,5 и менеджер - 5. Нужно cоздать метод, который будет выводить виды работ которые может выполнять работник, к примеру

$developer = new Developer();
$developer->typeOfWork()
// на выходе получаем: 
// - code writing
// - code testing
// - communication with manager  

и возможность проверить, может ли этот работник выполнять конкретную работу, например $developer->getWriteCode(); - вернет true. $developer->getDraw() - вернет false. В своем решении я создал абстрактный класс Employee с 5ю защищенными переменными (видами работ) $writeCode, $draw и т.д., которые по умолчанию равны false. Также я создал методы, которые выводят значения этих защищенных свойств, getWriteCode() и т.д. и один метод для итерации свойств метода и вывода всех работ ( по типу typeOfWork() как я писал ранее) Далее я Наследую от этого Класса классы Самих работников, Developer, Designer и т.д, но в них я объявляю только свойства объекта, то есть виды работ, к примеру

class Developer extends Employee {
    protected $writeCode = 'code writing';
    protected $testingCode = 'code testing';
    protected $communicateWithManager = 'communication with manager';
}

Получается, что для вывода определенного свойства я обращаюсь к родительскому методу(то есть в классе Employee) и вывожу значения этого свойства. Собственно вопрос, насколько это корректная структура классов? Нормально ли создавать класс в котором объявлены только свойства(например, как в классе Developer), а все методы берутся с класса-родителя? Буду благодарен любому отзыву и мнению

Answer 1

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

<?php
interface ICodeWriting {}
interface ICodeTesting {}
interface IDesigning {}
interface ICommunicationWithManager {}
abstract class Employee {        
    public function getTypesOfWork() {
        $types = '';
        if ($this instanceof ICodeWriting)
            $types .= "code writing \n";
        if ($this instanceof ICodeTesting)
            $types .= "code testing \n";
        if ($this instanceof IDesigning)
            $types .= "designing \n";
        if ($this instanceof ICommunicationWithManager)
            $types .= "communication with manager \n";
        return $types;
    }
}
class Developer extends Employee implements ICodeWriting, ICodeTesting, ICommunicationWithManager { }
class Designer extends Employee implements IDesigning, ICommunicationWithManager {}
echo "developer: \n";
$developer = new Developer();
echo $developer->getTypesOfWork();
echo "\n";
echo "designer: \n";
$designer = new Designer();
echo $designer->getTypesOfWork();

Вывод:

developer: 
code writing 
code testing 
communication with manager 
designer: 
designing 
communication with manager 

http://sandbox.onlinephpfunctions.com/code/bc758b8ab1e825c102200c6ec4a51a7f3b5bea16

Еще можно с трейтами побаловаться и в них логику попрописывать и определять данные. И подключать к соответствующим классам. Ссылка на доки про Трейты

READ ALSO
Сериализовать объекты класса в json формат

Сериализовать объекты класса в json формат

Прошу подсказать по учебной задаче

102
Как поправить условия

Как поправить условия

Подскажите как правильно подправить условия? сейчас при заходе на страницу браузер выдает ошибку HTTP ERROR 500

156
Проблема с запросом

Проблема с запросом

Возникла такая проблемаИмеется вот такой код:

86
Получить полный путь

Получить полный путь

Как получить путь к странице с которой сделан переход, типа $_SERVER['HTTP_REFERER'] только нужен именно путь без http://

114