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

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

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

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

Похожие вопросы