При кодировании я часто сталкиваюсь со следующим шаблоном:
- Вызовы метода другой (Прекрасный) метод, но метод, названный параметрами взятий, таким образом, в методе обертывания, я передаю в параметрах. Проблема, этот перенос зависимости может продолжиться и на. Как я мог избежать этого (какой-либо ценивший пример кода)?
Спасибо
Шаг 1: Вместо того, чтобы передавать все как отдельные аргументы, сгруппируйте аргументы в класс, скажем X.
Шаг 2: Добавьте геттеры в класс X, чтобы получить соответствующую информацию. Вызываемый должен использовать геттеры для получения информации вместо того, чтобы полагаться на параметры.
Шаг 3: Создайте интерфейсный класс, наследуемый классом X. Поместите все геттеры в интерфейс (в C ++ это чисто виртуальные методы).
Шаг 4: Сделайте вызываемые методы зависимыми только от интерфейса.
Refactoring: Внедрение объекта параметра
У вас есть группа параметров, которые естественно идут вместе?
Замените их объектом.
http://www.refactoring.com/catalog/introduceParameterObject.html
Преимущество объекта параметров в том, что вызовы, передающие их, не должны меняться при добавлении/удалении параметров.
(учитывая контекст ваших ответов, я не думаю, что библиотека IoC или паттерны инъекции зависимостей - это то, что вам нужно)
Вы можете использовать инфраструктуру внедрения зависимостей. Одним из таких примеров является Guice: см. http://code.google.com/p/google-guice/
Передача параметра только потому, что он нужен компоненту нижнего уровня, является признаком негерметичной абстракции. Часто более эффективным может быть рефакторинг зависимостей для агрегирования сервисов и скрытие каждой зависимости за интерфейсом.
Сквозные проблемы (которые часто являются наиболее распространенной причиной для передачи параметров) лучше всего решать с помощью декораторов.
Если вы используете DI-контейнер с возможностями перехвата, вы можете воспользоваться ими для очень эффективной реализации декораторов (некоторые называют это возможностями AOP контейнера).
Поскольку они не могут быть (легко) протестированы по модулю, большинство разработчиков предпочитают внедрять объекты в представления. Поскольку представления (обычно) не используются для создания других представлений, на этом ваша цепочка DI заканчивается. У вас может быть проблема (с которой я сталкивался каждый раз в ahwile), когда вам нужно создавать объекты в правильном порядке, особенно при использовании инфраструктуры DI, такой как Unity, когда попытка разрешить объект приведет к взаимной блокировке. Главное, о чем вам нужно беспокоиться, - это круговая зависимость. Чтобы сделать это, прочтите следующую статью:
Может ли внедрение зависимостей предотвратить циклическую зависимость?