Многоуровневая Абстракция

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

Эта статья содержит только теорию.

Следующая статья будет практической (попробую чередовать).



Многоуровневая абстракция

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

Это может показаться немного заумным.

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



Почему они делятся на уровни абстракции?

1. Борьба со сложностью.

На каждом уровне применяются методы этого конкретного уровня.

2. Снижение возможности подключения.

3. Обеспечение взаимозаменяемости классов всех уровней, кроме верхнего.



Многоуровневая абстракция работы с данными

Идем в порядке убывания уровня абстракции: * Класс сущности реального мира *Поставщик данных * Реальные библиотеки данных Пример: *Пользователь * IUserProvider, SqlUserProvider, XmlUserProvider,… * SqlClient, XmlDocument,… При этом мы получаем низкую связность: Пользователь знает об интерфейсе IUserProvider, SqlUserProvider и XmlUserProvider выполняют IUserProvider и используют библиотеки SqlClient и XmlDocument. При этом объекты определенного уровня абстракции работают только с объектами следующего (ниже) уровня абстракции, а не наоборот, что не допускает циклических связей.



Когда возникают проблемы?

1. Обычно в одном проекте присутствует несколько многоуровневых абстрактных моделей.

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

В этом случае необходимо внести изменения во все промежуточные уровни абстракции, включая верхний.

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

3. Абстрагирование от источников данных может (и иногда приводит) привести к неоптимальной работе с источниками данных.



Что делать?

Генерация кода во многих случаях (не всегда) может заменить многоуровневую абстракцию.

В этом случае будут сгенерированы итоговые классы (из верхнего уровня абстракции), содержащие методы для работы с выбранным источником данных.

1. На основе метаданных мы можем вносить изменения в алгоритмы генерации кода и модифицировать сразу всю модель.

2. При наличии метаданных прототип модели можно получить в кратчайшие сроки.

3. За счет наличия генераторов для каждого источника данных модель будет сформирована с приемлемой оптимальностью для работы с выбранным источником данных с учетом его специфики.



Как генерация кода может помочь в сложных моделях

Сложные приложения всегда задают много вопросов.

По моим наблюдениям, на большинство из них можно ответить в процессе разработки (например, нужно ли сайту кэшировать или нет; какая операционная система будет стоять на сервере; использовать ли буферизацию вывода или нет.).

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

Но это не значит, что меньше результирующего кода = более простая система.

Сам генератор кода должен быть достаточно качественным, чтобы генерировать качественный код.

Генерация кода + многоуровневая абстрактная модель

Эти подходы не противоречат друг другу и могут использоваться вместе.

Например, в ASP.NET есть система хранения личных данных пользователей в профилях (Profile).

Там построена абстрактная модель с несколькими уровнями абстракции, а ProfileBase лежит сверху.

Если мы укажем в конфигурации список свойств, то будет сгенерирован потомок класса ProfileBase — ProfileCommon, который будет содержать те свойства, которые мы указали в конфигурации.

Фактически мы указали метаданные в конфигурации.

В следующей статье мы разработаем некий простой генератор кода.

Теги: #генерация кода #абстракция #программирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.