Ранее я писал о том как полезно знание шаблонов проектирования, и как оно все может поменять.
Один из ключевых шаблонов, которые изменили мое мировоззрение в ООП мире был
Dependency Injection. И это поистине великолепное решение.
Если вы не знаете что это за шаблон, то самое время это
исправить.
Конечно же это не панацея. И многие из разработчиков думают, что если мы заинжектили зависимость, то этого достаточно, чтобы снизить
зацепление (coupling) кода. Но это не совсем так. Нужно хорошо понимать мотивацию данного подхода и проблемы которые он решает.
Стандартный подход для устранения зависимостей — использование интерфейсов. Интерфейс позволяет отвязаться от конкретной реализации. А это дает свободу дейсвий и гибкость. Но подход должен быть конзистентным на всех слоях архитектуры.
Представьте, что мы заинжектили интерфейс для взаимодействия с базой данных
void PerformSomeQuery(IDb db)
{
db.Exec("INSERT INTO blabla VALUES('bla', 'bla')");
}
Но что если метод Exec этого интерфейса выглядит следующим образом:
interface IDb
{
void Exec(SQLString query);
}
Проблема данного кода в том, что интерфейс вводит новую зависимость: SQLString — некий внутренний тип для IDb. Это большая проблема, так как имплементировать интерфейс IDb, не привязываясь к внутренним типам, не представляется возможным. Что, по сути, делает данный интерфейс практически бесполезным.
В статье
DIP in the Wild Мартин говорит о том, что
Высокоуровневый код не должен зависеть от низкоуровневых деталейЧтобы избавить пользователя от головной боли, автор интерфейса должен так же использовать интерфейс
interface IDb
{
void Exec(ISQLString query);
}
А SQLString, в свою очередь, должен имплементировать ISQLString. Тогда пользователь класса сможет реализовать удобные для него имплементации, и не привносить никаких дополнительных зависимостей.
Если это возможно, то лучше ограничиваться стандартными типами, и, например, заменить ISQLString на стандартный string.
В статье Мартина вы сможете найти много других интересных примеров и решений распространенных проблем.
Если вас интересуют подобные проблемы и тема проектирования архитектуры приложения, то очень советую книгу
Clean Architecture