jumpordie
@jumpordie
Веб-разработчик, Череповец

Нормально ли обращаться к методам и свойствам классов через единый сервис?

Добрый день!
Есть класс сервиса, через который идет обращение к свойствам и методам других классов (моделей). Реализовано примерно так:
namespace App\Services;

use App\Models\City;
use App\Models\Country;
use App\Models\Hotel;
use App\Models\Region;

class Service
{
    private Country $country;
    private City $city;
    private Hotel $hotel;
    private Region $region

  /**
     * @param $name
     * @return City|Country|Hotel|Region
     * @throws \Exception
     */
    public function __get($name)
    {
        switch ($name) {
            case 'country':
                return new Country();
            case 'city':
                return new City();
            case 'hotel':
                return new Hotel();
            case 'region':
                return new Region();
            default:
                throw new \Exception('Property ' . $name . ' is not exist.');
        }
    }
}

Обращения происходят так:
$service = new Service();
$some = $service->city->someMethod();
$field_name = $service->country->field_name;

Вопрос в том, насколько разумен такой подход и м.б. есть какие-то подводные камни?
  • Вопрос задан
  • 213 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
С моей колокольни статических языков такая конструкция — избыточная сложность на пустом месте.
Но есть места, где такая сложность ещё и чем-то оправдана. Например, Qt — содержимое ячейки таблицы…
QVariant SomeModel::data(
    const QModelIndex &index, int role = Qt::DisplayRole) const override {}

Для чего оно такое в Qt…
• в самом начале функции может вычисляться адрес в памяти, где все эти данные находятся, а за ним — длинный switch/case «в зависимости от роли, возьми то-то»;
• возможно возвращение пустого QVariant, когда надо сказать: «действуй как обычно»;
• наконец, возможны сложные операции с данными, вроде преобразования в отображаемую форму и сортировки, которые не зависят от специфики модели данных.

Так что ответ. Смотрите по месту: что вы хотите этой конструкцией сказать и почему более простые не оправданы.
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
поздравляю, ты открыл для себя шаблон проектирования фасад
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы