Конечно, «это зависит» от ситуации. Иногда DataSets или DataTables больше подходят, например, если это действительно легкая бизнес-логика, плоская иерархия сущностей / записей или некоторые возможности управления версиями.
Пользовательские коллекции объектов светятся, когда вы хотите реализовать глубокую иерархию / график объектов, которые не могут быть эффективно представлены в плоских 2D таблицах. То, что вы можете продемонстрировать, - это большой граф объектов и заставление определенных событий распространяться по правильным ветвям, не вызывая неподходящие объекты в других ветвях. Таким образом, нет необходимости зацикливаться или выбирать все данные в DataTable только для того, чтобы получить дочерние записи.
Например, в проекте, в котором я участвовал два с половиной года назад, был модуль пользовательского интерфейса, который должен отображать вопросы и элементы управления ответами в единой сетке данных WinForms (точнее, это UltraGrid от Infragistics) , Еще несколько хитрых требований
- Элемент управления ответом на вопрос может быть что угодно - текстовое поле, параметры флажка, параметры переключателя, раскрывающиеся списки или даже всплывающее пользовательское диалоговое окно, которое может извлекать больше данных из веб-сервис.
- В зависимости от того, что ответил пользователь, он может вызвать появление дополнительных подвопросов непосредственно под родительским вопросом. Если другой ответ дается позже, он должен раскрыть другой набор подвопросов (если таковые имеются), связанных с этим ответом.
Первоначальная реализация была полностью написана в DataSets, DataTables и массивах. Количество циклов в сотнях строк для нескольких таблиц было просто изумительным. Это не помогло программисту, пришедшему из C ++, пытаясь ref все (привет, объекты, находящиеся в куче, используют ссылочные переменные , как указатели!). Никто, даже изначально программист, не мог объяснить, почему код делает то, что делает. Я появился на сцене более чем через шесть месяцев после этого, и он все еще был залит жуками. Неудивительно, что разработчик 2-го поколения, от которого я вступил во владение, решил уйти.
Два месяца работы по исправлению хаотического беспорядка, я взял на себя задачу перепроектировать весь модуль в объектно-ориентированный граф для решения этой проблемы . да, в комплекте с абстрактными классами (для визуализации различных элементов управления ответами в ячейке сетки в зависимости от типа вопроса), делегатами и событиями. Конечным результатом была двумерная сетка данных, связанная с глубокой иерархией вопросов, естественно отсортированных в соответствии с порядком родитель-потомок. Когда ответ родительского вопроса изменился, это вызвало бы событие у дочерних вопросов, и они автоматически отобразили / скрыли свои строки в сетке в соответствии с ответом родителя. Были затронуты только объекты вопроса, находящиеся на этом пути. Реагирование пользовательского интерфейса этого решения по сравнению со старым методом было на порядки.