Глава 18. Базовые типовые решения 525
класса Reservation с конкретными методами и атрибутами, а извлечение сведений о
пассажире выполняется с помощью выражений типа aReservation. passenger.
Неявные интерфейсы обладают чрезвычайной гибкостью. Универсальное множест-
во записей может быть использовано для любых видов данных, что избавляет от необ-
ходимости написания нового класса при определении каждого нового типа множества
записей. Несмотря на подобные преимущества, я считаю неявные интерфейсы Очень
Плохим Решением. Как я узнаю, какое слово нужно использовать для того, чтобы доб-
раться к сведениям о пассажире, забронировавшем билет, — "passenger" ("пассажир"),
"guest" ("клиент") или, может быть, "flyer" ("летящий")? Единственное, что я могу сде-
лать, — это "прочесать" весь исходный код приложения в поисках мест, где создаются и
используются объекты бронирования. Если же у меня есть явный интерфейс, я могу от-
крыть определение класса Reservation и посмотреть, какое свойство мне нужно.
Данная проблема еще более критична для статически типизированных языков
программирования. Чтобы узнать фамилию пассажира, забронировавшего билет, мне
Придется Прибегнуть К Кошмарному выражению ВИДа ( (Person) aReservation
[ "passenger" ]) . lastName. Поскольку компилятор утрачивает всю информацию о ти-
пах, для извлечения нужных сведений тип данных приходится указывать вручную. В от-
личие от этого, явный интерфейс сохраняет информацию о типе, поэтому для извлече-
ния фамилии пассажира я могу воспользоваться гораздо более простым выражением
aReservation.passenger.lastName.
В связи с этим я предпочитаю избегать неявных интерфейсов (а также не менее ужас-
ного приема передачи данных с использованием словарей). Я не приветствую примене-
ние неявных интерфейсов и к множествам записей, однако в данном случае ситуация об-
легчается тем, что элементы множества записей обычно соответствуют существующим
столбцам таблицы базы данных. Более того, имена столбцов фигурируют в SQL-
выражениях, создающих множество записей, поэтому найти имя нужного свойства от-
нюдь не так сложно, как кажется на первый взгляд.
Как бы там ни было, явные интерфейсы все-таки предпочтительнее. В библиотеке
ADO.NET возможность применения явного интерфейса обеспечивают строго типизиро-
ванные объекты DataSet — сгенерированные классы, которые предоставляют явный и
полностью типизированный интерфейс к множеству записей. Поскольку объект DataSet
может содержать в себе множество таблиц и отношений, в которых они находятся, строго
типизированные объекты DataSet включают в себя свойства, использующие информа-
цию об отношениях между таблицами. Генерация классов DataSet выполняется на ос-
нове определений схем XML (XML Schema Definition — XSD).
В настоящее время более распространены неявные интерфейсы, поэтому в примерах
данной книги я использовал нетипизированные объекты DataSet. Несмотря на это, для
написания реальных приложений с использованием библиотеки ADO.NET я рекомен-
дую применять типизированные объекты DataSet. Если же используемая среда разра-
ботки не поддерживает ADO.NET, предлагаю воспользоваться генерацией кода для соз-
дания собственных множеств записей с явными интерфейсами.