Как правильно вызвать нужный класс? Всем привет! Помогите понять как лучше всего вызвать нужный класс. Я упрощу изложение вопроса до нескольких модулей на сайте... Допустим, на сайте есть модули: комментарий, посты, пользователи. Для каждого модуля есть свой набор возможностей (лайк для комментариев и постов, подписка для пользователя и т.д.). Возьмем для примера только лайк. Лайки у меня ставятся по принципу: тип объекта и его 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, мне нужно создавать такие проверки. И при добавлении на сайт какого-то нового типа объекта не забывать добавлять это все по каждому такому файлу, кроме того, изменяя название типа объекта, мне нужно будет в каждом тиком файле искать его и переименовывать. На сколько я понимаю - это не правильный подход, но другого я придумать не могу, поэтому прошу объяснить, как на самом дела это все красиво делается?
Для упрощения и оптимизации вашего кода, вам стоит использовать паттерн проектирования "Фабричный метод" или "Фабрика".
Идея заключается в том, чтобы создать фабрику, которая будет отвечать за создание нужного объекта в зависимости от типа объекта. Таким образом, вам не нужно будет каждый раз добавлять проверки и вызывать методы конкретных классов в каждом файле.
Примерно это может выглядеть так:
Создайте интерфейс/абстрактный класс 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; // Для других типов объектов создайте соответствующие классы и добавьте их обработку здесь }
Таким образом, вы предотвратите дублирование кода, уменьшите его сложность и сделаете его более поддерживаемым и расширяемым.
Для упрощения и оптимизации вашего кода, вам стоит использовать паттерн проектирования "Фабричный метод" или "Фабрика".
Идея заключается в том, чтобы создать фабрику, которая будет отвечать за создание нужного объекта в зависимости от типа объекта. Таким образом, вам не нужно будет каждый раз добавлять проверки и вызывать методы конкретных классов в каждом файле.
Примерно это может выглядеть так:
Создайте интерфейс/абстрактный класс 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;
// Для других типов объектов создайте соответствующие классы и добавьте их обработку здесь
}
Таким образом, вы предотвратите дублирование кода, уменьшите его сложность и сделаете его более поддерживаемым и расширяемым.