(Нет, на самом деле я в это не верю, но ведь неплохой заголовок получился, не так ли? DataSet’ы имеют право на существование, но только не в качестве внешних бизнес-объектов или контрактов Web-сервисов).
Бэрри Гервин (Barry Gervin) прокомментировал мой «наезд на DataSets» и то, что я не объяснил свою точку зрения. В своём посте Бэрри прокомментировал заявление Harry Pierson'а о том, что нельзя использовать DataSet’ы в Web-сервисах так как они несовместимы с платформами отличными от .NET. На это Бэрри ответил: «Это неправда. DataSet – это просто XML.» Что ж, конечно же – это XML, но с таким же успехом я могу сказать, что любое предложение – это набор ASCII-символов и все должны понять: Le «DataSet» n'est pas votre ami si vous faites des Services de Web. Ну, может быть, Бэрри и сможет понять, но лично я не знаток французского языка. ;)
DataSet’ы это ваза для фруктов, но не сами фрукты. Вы действительно хотите получить вазу вместо фруктов?
DataSet – это объект, не так ли? Но это не Domain-объект, это не «яблоко» или «апельсин» – это объект типа «DataSet». DataSet – это ваза (которая знает о том, что в ней лежит). DataSet – это объект, который знает, как хранить колонки и строки. Это объект, который много знает про базу данных. Но я не хочу получать вазы. Я хочу получать Domain-объекты, такие как «яблоки».
«Используй типизированные DataSet’ы», скажете вы. «Это то же самое, что и объекты и посмотрите – это как-то будет работать!»
Нет же! Типизированные DataSet’ы — это не Domain-объекты. Типизированные DataSet’ы – это всего лишь ваза с картинкой яблока на ней. «Смотрите, здесь ВНУТРИ яблоко – мы разбили его на колонки!» DataSet’ы (в том числе и типизированные) – очень плохая замена хорошей доменной модели.
Бэрри привёл очень хорошие аргументы в пользу DataSet’ов на своём сайте, но я не буду сейчас их все анализировать на предмет, согласен ли я с каждым из этих пунктов или нет. Я лишь отмечу, что все эти аргументы справедливы по отношению к DataSet’ам в Data Access Layer, но не в Business Object Layer. Кроме того, я понимаю полезность DataSet’ов в классическом (Intranet) клиент-серверном WinForms-приложении, с большим количеством DataBinding’ов.
Возвращать DataSet’ы в качестве результатов публичных Web-сервисов – ПЛОХО©.
Итак, почему бы нам не вернуть DataSet из Web-сервиса? DataSet’ы, а также XML их сериализации, включают в себя кучу информации, которая имеет очень слабое отношение к доменной модели. DataSet’ы могут быть дельтами (DiffGrams), они могут включать или не включать схему данных. В любом случае они представляют собой «набор данных». Это всегда объекты одного типа — DataSet. А ведь есть много языков программирования (та же Java, например) которые не поддерживают этот тип данных. DataSet’ы по своей природе – объект с поздней привязкой (late-bound). Даже типизированные DataSet’ы постоянно преобразуют типы значений между SqlDataTypes и обычными CLR-типами при вызове Rows[«Apple»]. DataSet’ы – это класс, эквивалентный классу Variant, объекты которого могут быть любого типа и сериализуемые в XML. Возврат объектов типа DataSet в публичном Web-сервисе скорее всего обескуражит и поставит в тупик Java-программиста и даст ему лишний аргумент против .NET.
Если быть до конца честным – я бы разрабатывал систему, где было бы место DataSet’ам, только в том случае, если бы был уверен в их исключительной ценности для моей архитектуры. Одним словом, ребята, всегда отдавайте отчёт о последствиях своих решений.
Это мой первый перевод, сделанный, в первую очередь, для «improving my English skills», так что с радостью приму все критические замечания по качеству перевода. Некоторые вещи переводил не буквально, но, надеюсь, суть передал верно.
Лично сам я не полностью разделяю мнение автора, поэтому было бы интересно услышать мнение других на эту тему.
Автор: LionSoft