Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Принцип инверсии зависимостей

Читайте также:
  1. I. Принцип вероятностных суждений
  2. I.5. Принципы отбора материала и организации учебного материала.
  3. II. Понятие и принципы построения управленческих структур.
  4. II. Принципы профессиональной деятельности нотариуса
  5. II. Принципы российского гражданства.
  6. III. Танец-отражение музыки с помощью движения. Принципы движений хип-хоп-аэробики.
  7. IV. Принципы построения сюжета

Инверсия зависимости – это особый вид инверсии контроля, который применяется в Объектно-ориентированном подходе для удаления зависимостей между классами. Зависимости между классами превращаются в ассоциации между объектами. Ассоциации между объектами могут устанавливаться и меняться во время выполнения приложения. Это позволяет сделать модули менее связанными между собой.

Можно выделить 2 основных принципа инверсии зависимостей:

· Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба типа модулей должны зависеть от абстракций;

· Абстракция не должна зависеть от реализации. Реализация должна зависеть от абстракции.

Рассмотрим пример программы, которая копирует в файл данные, введенные с клавиатуры.

Рисунок 11.1. Схема программы копирования данных.

 

Здесь используются 3 класса: один класс (иногда его называют сервис) отвечает за чтение с клавиатуры, второй – за вывод в файл, а третий высокоуровневый класс объединяет два низкоуровневых класса с целью организации их работы.

Класс Сopy может выглядеть примерно следующим образом:

1: public static class CopyManager

2: {

3: public static void Copy()

4: {

5: var keyboard = new Keyboard();

6: var file = new File();

7: byte[] buffer;

8:

9: while ((buffer = keyboard.Read())!= null)

10: {

11: file.Write(buffer);

12: }

13: }

14: }

Низкоуровневые классы Keyboard и File обладают высокой гибкостью. Можно легко использовать их в контексте, отличном от класса CopyManager. Однако сам класс CopyManager не может быть повторно использована в другом контексте. Например, для отправки данных из файла системному обработчику логов.

Используя принцип инверсии зависимостей, можно сделать класс CopyManager независимым от объектов источника и назначения данных. Для этого необходимо выработать абстракции для этих объектов, и сделать модули зависимыми от этих абстракций, а не друг от друга.

Рисунок 11.2. Схема программы с введенными абстракциями.

1: public interface IReader

2: {

3: public byte[] Read();

4: }

5:

6: public interface IWriter

7: {

8: public void Write(byte[] arg);

9: }

Класс CopyManager должен полагаться только на выработанные абстракции и не делать никаких предположений по поводу индивидуальных особенностей объектов ввода/вывода:

1: public static class CopyManager

2: {

3: public static void Copy(IReader reader, IWriter writer)

4: {

5: byte[] buffer;

6:

7: while ((buffer = reader.Read())!= null)

8: {

9: writer.Write(buffer);

10: }

11: }

12: }

Примерно следующим образом выглядит использование данного класса:

1: CopyManager.Copy(new Keyboard(), new File());

Теперь класс Copy можно использовать в различных контекстах копирования. Изменение его поведения достигается путем ассоциации его с объектами других классов (но которые зависят от тех же абстракций).

Несмотря на простоту выполненных действий, был получен очень важный результат. Теперь код обладает следующими качествами:

· класс может быть использован для копирования данных в контексте отличном от данного;

· возможно добавлять новые устройства ввода/вывода не меняя при этом класс Copy.

Таким образом, снизилась хрупкость кода, повысилась его мобильность и гибкость.


Дата добавления: 2015-08-13; просмотров: 87 | Нарушение авторских прав


Читайте в этой же книге: В паттерне MVVM инкапсулирует логику представления и данные для отображения (англ. яз.). | Интерфейс, предоставляющий базовую поддержку валидации данных и сообщения об ошибках | Шаг 4. View | Шаг 4. Редактирование | Шаг 5. Команды | Создание ссылок на XAML файлы | Синхронное использование XAML | Отсутствие метода OverrideMetadata() | Отсутствие свойства No PathSegment.IsStroked | Краткие итоги |
<== предыдущая страница | следующая страница ==>
Задача 3.| Формы инверсии зависимостей

mybiblioteka.su - 2015-2024 год. (0.009 сек.)