Как правильно вызвать нужный класс? Всем привет! Помогите понять как лучше всего вызвать нужный класс.
Я упрощу изложение вопроса до нескольких модулей на сайте... Допустим, на сайте есть модули: комментарий, посты, пользователи.
Для каждого модуля есть свой набор возможностей (лайк для комментариев и постов, подписка для пользователя и т.д.). Возьмем для примера только лайк.
Лайки у меня ставятся по принципу: тип объекта и его 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
395 +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
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир