Как правильно вызвать нужный класс? Всем привет! Помогите понять как лучше всего вызвать нужный класс.
Я упрощу изложение вопроса до нескольких модулей на сайте... Допустим, на сайте есть модули: комментарий, посты, пользователи.
Для каждого модуля есть свой набор возможностей (лайк для комментариев и постов, подписка для пользователя и т.д.). Возьмем для примера только лайк.
Лайки у меня ставятся по принципу: тип объекта и его ID отсылается к единому файлу на сервере like.php. Значит ставя лайк для поста 333, файл like.php получает значение: type == post и id == 333
Далее, для каждого типа объекта есть свой классы, которые отвечают за генерацию объекта уведомления в БД. т.е. Устанавливая лайк посту 333, файл like.php должен создать объект класса LikePost и вызвать метод createNotify передавая в него нужные параметры. Вот как я это делаю сейчас:// это файл like.php
//.........
switch($object_type){
// проверяем тип объекта и вызываем метод создания уведомления нужного класса
case 'post':
/*
* т.к. файл like.php знает только тип и ID объекта
* то уже внутри класса LikePost вызывается модель (в этом случае поста)
* и получаем ID автора поста, чтобы записать его вместе с уведомлением как
* получателя этого уведомления
*/
LikePost::createNotification($auth->user_id, $object_id);
break;
case 'comment':
// тот же смысл что при type == post
LikeComment::createNotification($auth->user_id, $object_id);
break;
case 'news':
// тот же смысл что при type == post
LikeNews::createNotification($auth->user_id, $object_id);
break;
//..... и т.д.
}
//.........
У меня все получается, все работает, но код получается очень разбросанным, выходит что если на объект можно подписаться, поставить лайк, добавить комментарий, поделиться. То в каждом таком файле как like.php, мне нужно создавать такие проверки. И при добавлении на сайт какого-то нового типа объекта не забывать добавлять это все по каждому такому файлу, кроме того, изменяя название типа объекта, мне нужно будет в каждом тиком файле искать его и переименовывать.
На сколько я понимаю - это не правильный подход, но другого я придумать не могу, поэтому прошу объяснить, как на самом дела это все красиво делается?

21 Авг 2019 в 07:00
244 +1
0
Ответы
1

Для упрощения и оптимизации вашего кода, вам стоит использовать паттерн проектирования "Фабричный метод" или "Фабрика".

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

Примерно это может выглядеть так:

Создайте интерфейс/абстрактный класс NotificationFactory, в котором будет метод createNotification($auth_user_id, $object_id).Создайте классы для каждого типа объекта (LikePost, LikeComment, LikeNews), которые будут реализовывать этот интерфейс/наследоваться от абстрактного класса.В самом файле like.php создайте переменную, которая будет хранить объект фабрики в зависимости от типа объекта.Вызывайте метод createNotification через эту переменную, передавая необходимые аргументы.

Пример реализации:

interface NotificationFactory {
public static function createNotification($auth_user_id, $object_id);
}
class LikePost implements NotificationFactory {
public static function createNotification($auth_user_id, $object_id) {
// Реализация создания уведомления для поста
}
}
class LikeComment implements NotificationFactory {
public static function createNotification($auth_user_id, $object_id) {
// Реализация создания уведомления для комментария
}
}
// В вашем файле like.php
switch($object_type) {
case 'post':
$factory = new LikePost();
$factory::createNotification($auth->user_id, $object_id);
break;
case 'comment':
$factory = new LikeComment();
$factory::createNotification($auth->user_id, $object_id);
break;
// Для других типов объектов создайте соответствующие классы и добавьте их обработку здесь
}

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

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 96 005 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир