Как понять абстракции и писать независимые компоненты?

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

К примеру я работаю с Yii2 и многие разработчики говорят, что там слишком большая зависимость между компонентами системы. Я никак не могу понять, что под этим подразумевают.

Объясните пожалуйста на момем примере, как правильно с точки зрения принципов SOLID организовать следующую вещь:

Предположим у меня есть модуль отвечающий за перевод средств между пользователями на сайте. И есть модуль уведомлений, в базу которого попадают всякие предупреждения, уведомления и новости для пользователей.

Я хочу сделать такую штуку, когда пользователь1 переводит средства пользователю2, у пользователя2 появлялось уведомление. Тоесть я так себе прикинул, что мне нужно подружить 2 модуля.
Момент в том, что тут начинается мое непонимание всех этих моментов. Кто от кого зависит и тп.? Тоесть если я отключу модуль уведомлений, то в моем случае весь перевод средств работать не будет.

Организовывал я это дело вот так:


// открыл транзакцию, проверил данные

// осуществляю транзакцию
public function beforeSave($insert)
{
        if(parent::beforeSave($insert)) {
                   // обновил историю, у одного деньги снял, другому добавил
                    ...
                    // и вот теперь я хочу сделать уведомление о переводе 
                    // Уведомление о переводе 
                    Notification::note(Notification::TYPE_TRANSFERS, $this->user_recipient, $this->noteTitle, $this->noteText);
                }
            }
            
            return true;
        }
        
        return false;
	}


В данном случае у меня есть сторонняя модель стороннего модуля Notification, к которой я обращаюсь, что бы сделать запись. Мало того, мне еще потребовалось создать в текущей модели метод noteTitle, в котором храниться текст уведомления.

Тоесть вышло так:
у модуля transfers есть спец. метод для модуля Notification
модуль transfers вызывает модуль Notification
а в свою очередь у модуля Notification есть тип TYPE_TRANSFERS, который указывает на то, что это перевод средств.

Как я понял это и есть зависимость. Но подскажите пожалуйста как это реализовать абстрактно, в общем нуждаю в хороших советах, так как я еще это дело не осилил.
  • Вопрос задан
  • 2505 просмотров
Решения вопроса 1
pavel_salauyou
@pavel_salauyou
Symfony2 & Angular разработчик
независимый компонент - это такой компонент, который можно перенести в другое пхп приложение и оно будет там работать без дополнительных телодвижений (в идеале). Вот сейчас у вас есть очень сильная зависимость от класса Notification, так как вы напрямую вызываете метод отправки уведомления из модели, а вот если бы вы внедрили его через конструктор, то уже зависимость была бы меньше, а вот если бы вы вообще его убрали из метода beforeSave а вынесли в отдельный сервис, то вообще бы красота была.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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