Я склонен думать в терминах глаголов;Уровни пользовательского интерфейса заполнены классами, которые отображают, просматривают, прокручивают, щелкают и отображают.Уровни данных сохраняются, загружаются, обновляются и удаляются.Бизнес-уровень - это объекты, которые каким-то образом отражают реальный мир.Таким образом, ваше приложение может содержать:
Пользовательский интерфейс: PersonView, PersonEditPage, NewPersonForm
Бизнес: Персона, День рождения, Адрес, Продавец, Сотрудник
Данные: соединение, база данных, таблица,Столбец
Таким образом, может произойти типичная последовательность операций в веб-приложении;
(screen) UI Business Data (storage)
Form/Page PersonView Organization Connection DB
| | | | |
|--type-+ | | | |
| | | | | |
|<------+ | | | |
| | | | |
|---click-->| | | |
| |--find(#3)-->| | |
| | |-LoadPerson(3)->X |
| | | X-select->X
| | | X X
| | | X<--------X
| | |<-----Person----| |
| |<---Person---| | |
|<---HTML---| | | |
| | | | |
Что здесь происходит?
Сначала пользователь печатает и нажимает в браузере.Когда они щелкают, объект PersonView, представляющий внешний вид человека в сети, перехватывает вызов.В псевдокоде:
onLinkClick() {
personView.FindPerson(id:3);
rendertoHtml();
}
PersonView теперь нужно найти человека, поэтому он запрашивает бизнес-уровень;он просит объект под названием «Организация» найти конкретного человека.Например,
PersonView.FindPerson(id) {
organization.FindPerson(id)
}
Обратите внимание, что он спрашивает, не зная о базах данных, XML или веб-сервисах;он просто спрашивает бизнес-уровень напрямую: «Вы можете найти человека № 3?».Таким образом, уровень пользовательского интерфейса изолирован от уровня данных.
Затем бизнес-уровень (Организация) переходит на уровень данных и просит его загрузить запись о человеке.
Organization.FindPerson(id) {
connection.LoadPerson(id);
}
Опять же, он не выполняет специфичные для данных запросы.Теперь мы получаем соединение, которое знает о конкретных деталях слоя данных;
Connection.LoadPerson(id) {
connectDb();
execute("SELECT name, dob FROM Person WHERE id =@id");
return new Person(name, dob);
}
Итак, соединение определенно знает о конкретном механизме хранения (SQL), но имеетнет знаний об уровне пользовательского интерфейса, который вызвал его.Он возвращает объект Person, и Organization передает его обратно в PersonView, который затем знает, как генерировать HTML.
Как эта структура помогает?Представьте, что вы хотите перейти с файлов SQL на XML для хранения ваших данных.Вы можете создать другую реализацию Connection, которая использует xpath, например, так:
Connection.LoadPerson(id) {
LoadXml();
SelectNode("//person[@id=$(ID)]");
return new Person(xml['name'], xml['dob']);
}
и вся система продолжит работу.Вы также можете изменить уровень пользовательского интерфейса (например, с веб-интерфейса на Windows), и не нужно переписывать ни бизнес-уровень, ни уровень данных.