Yvision.kz
kk
Разное
Разное
399 773 постов42 подписчика
Всяко-разно
-4
06:03, 13 июня 2011

Как с использованием IoC-контейнера "приготовить "спагетти-код"

Инверсия управления (Inversion of Control, IoC) — важный принцип объектно-ориентированного программирования, используемый для уменьшения связанности в компьютерных программах и входящий в пятерку важнейших принципов SOLID. (Википедия).

Теперь, без лишних определений, посмотрим, как использовать IoC-контейнер в точности наоборот и, испортив архитектуру слабо-связанного кода, "приготовить "спагетти-код".


1. Перво-наперво, нужно создать сам IoC-контейнер в виде строго определенного класса. Автоматически, мы создали зависимость всего приложения от этой реализации IoC-контейнера, а реализацией может быть даже сторонний IoC-контейнер (свои собственные реализации контейнеров пишут очень редко).

2. Затем, следует зарегистрировать контейнер в самом себе (да-да!) и использовать его в конструкторах максимального количества классов.

3. Вуаля! В каждом классе, достаем из полученного в конструкторе IoC-контейнера, реализации для нужных нам интерфейсных классов.

Что мы получили в итоге? Пересыпанный приправой из IoC-контейнера спагетти-код, в котором слабой связанностью компонентов даже не пахнет и первым в этом будет виноват всё тот же IoC-контейнер.

В общем страшная реализация сервис-локаторов или синглтонов.

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

1.1. Должен быть интерфейсный класс (интерфейс), который реализует работу с IoC-контейнером. И любую реализацию IoC-контейнера, мы "обворачиваем" в этот интерфейс. В результате, код приложения будет "приправлен" IoC-интерфейсом, а не конкретной реализацией IoC-контейнера.

2.1. Отвергайте любые "приправы" IoC-контейнером в конструкторах классов. Ни один класс не имеет права принимать в своем конструкторе IoC-контейнер.

3.1. Что это за штука в конструкторе? Что это за черный ящик из которого класс должен доставать объекты? Это IoC-контейнер? Подавайте в конструктор, исключительно реализации, которые специфически необходимы для класса. Поверьте, классу не нужен IoC-контейнер.

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

-4
324
1