Как убедить моих коллег не использовать datasets для корпоративной разработки (.NET 2.0+)

StackOverflow https://stackoverflow.com/questions/37378

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Если вы работаете над устаревшим кодом (например, приложениями, портированными с .NET 1.x на 2.0 или 3.5), то было бы плохой идеей отказываться от наборов данных.Зачем менять то, что уже работает?

Однако, если вы создаете новые приложения, есть несколько вещей, на которые вы можете сослаться:

  • Обращение к переживающему боль при обслуживании приложений, работающих с наборами данных
  • Укажите преимущества вашего нового подхода в производительности
  • Приманите их хорошей промежуточной приманкой.Перейдите на .NET 3.5 и продвигайте LINQ на SQL, например:несмотря на то, что он по-прежнему придерживается архитектуры, управляемой данными, это огромный отход к наборам данных, индексируемым строками, и обеспечивает их соблюдение...вуаля!Пользовательские коллекции - способом, который скрыт от них.

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

Если все остальное терпит неудачу (например, у вас есть команда разработчиков, которая категорически отказывается отходить от старых практик и скептически относится к изучению новых вещей), это очень, очень четкий знак что вы переросли свою команду, пришло время покинуть вашу компанию!

Другие советы

Сделайте это на примере и действуйте легко. Все, что сильнее, просто оттолкнет вас от остальной части команды.

Не забудьте учесть вероятность того, что они попадают в то, что вы пропустили. Быть частью команды - значит по очереди учиться и обучение.

Ни у одного человека нет ответов на все вопросы.

Не забудьте рассмотреть возможность того, что они наткнулись на что-то, что вы упустили.Быть частью команды - значит по очереди учиться и преподавать.

Поддержан.Сама идея о том, что "развитие предприятия" каким-то образом отличается от нормального развития (и обычно подразумевается "важнее"), действительно раздражает меня.

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

Вы должны быть реалистами при составлении этого списка.Вы не можете просто сказать: "Это экономит нам уйму времени!!!ПОБЕЖДАЙ !!", не обращая внимания на тот факт, что иногда это займет БОЛЬШЕ времени, потребуется X месяцев, чтобы освоить новые технологии и т.д.Вы должны показать конкретные примеры, где это сэкономит время и как именно.

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

Кстати.Обратите внимание на эту конкретную аферу.Это превзойдет все, если только у вас нет лот надежных кейсов для всех ваших других вещей:

  • Требуется более 12 месяцев работы над портированием нашего существующего кода.Ты проиграл.

Конечно, "это зависит" от ситуации.Иногда наборы данных или таблицы данных более подходят, например, если это действительно довольно простая бизнес-логика, плоская иерархия сущностей / записей или некоторые возможности управления версиями.

Коллекции пользовательских объектов сияют, когда вы хотите реализовать глубокая иерархия/граф объектов, которые не могут быть эффективно представлены в плоских 2D-таблицах.Что вы можете продемонстрировать, так это большой график объектов и получение определенных событий для распространения по правильным ветвям без вызова неподходящих объектов в других ветвях.Таким образом, нет необходимости выполнять цикл или выбирать по каждому DataTable только для того, чтобы получить дочерние записи.

Например, в проекте, в котором я участвовал два с половиной года назад, был модуль пользовательского интерфейса, который должен был отображать вопросы и элементы управления ответами в единой сетке данных WinForms (если быть более конкретным, это была UltraGrid от Infragistics).Еще несколько сложных требований

  • Контрольный ответ на вопрос может быть что угодно - текстовое поле, параметры флажков, параметры переключателей, выпадающие списки или даже для открытия пользовательского диалогового окна, которое может извлекать дополнительные данные из веб-службы.
  • В зависимости от того, на что ответил пользователь, это может привести к появлению дополнительных вложенных вопросов непосредственно под родительским вопросом.Если позже будет дан другой ответ, он должен содержать другой набор подвопросов (если таковые имеются), связанных с этим ответом.

Первоначальная реализация была полностью написана в виде наборов данных, таблиц данных и массивов.Количество циклов по сотням строк для нескольких таблиц было просто ошеломляющим.Это не помогло программисту, пришедшему с опытом работы на C ++, пытающемуся ссылка все (привет, объекты, живущие в куче, используют ссылочные переменные, как указатели!).Никто, даже начинающий программист, не мог объяснить, почему код делает то, что он делает.Я появился на сцене более чем через шесть месяцев после этого, и она все еще была наводнена ошибками.Неудивительно, что разработчик 2-го поколения, которого я сменил, решил уволиться.

После двух месяцев попыток исправить хаотичный беспорядок я взял на себя смелость переделать весь модуль в объектно-ориентированный граф для решения этой проблемы.да, в комплекте с абстрактными классами (для отображения различных элементов управления ответами в ячейке сетки в зависимости от типа вопроса), делегатами и обработкой событий.Конечным результатом стала 2D-сетка данных, привязанная к глубокой иерархии вопросов, естественно отсортированных в соответствии с порядком "родитель-потомок".Когда ответ на родительский вопрос менялся, это вызывало событие для дочерних вопросов, и они автоматически показывали / скрывали свои строки в таблице в соответствии с ответом родителя.Были затронуты только вопросительные объекты на этом пути.Отзывчивость пользовательского интерфейса этого решения по сравнению со старым методом была на порядки выше.

Как ни странно, я хотел опубликовать вопрос, который был полной противоположностью этому. Большинство программистов, с которыми я работал, использовали подход пользовательских объектов / коллекций данных. Мне больно смотреть, как кто-то с открытым определением таблицы SQL Server на одном мониторе, медленно набирает соответствующий класс-оболочку строки в Visual Studio на другом мониторе (в комплекте с закрытыми свойствами и установщиками-получателями для каждого столбца). Это особенно больно, если они также склонны создавать таблицы из 60 столбцов. Я знаю, что есть системы ORM, которые могут создавать эти классы автоматически, но я видел, что ручной подход используется гораздо чаще.

Инженерные решения всегда включают компромиссы между плюсами и минусами доступных вариантов. Подход, ориентированный на DataSet, имеет свои преимущества (представление в реальном времени данных в формате db в виде таблиц в памяти, классы, написанные людьми, которые знают, что они делают, знакомы большому кругу разработчиков и т. Д.), Как и пользовательские объекты данных. (проверка типа компиляции, пользователям не нужно изучать SQL и т. д.). Если все в вашей компании идут по пути DataSet, технически возможно, что DataSets - лучший выбор для того, что они делают.

Наборы данных / таблицы не так уж и плохи, не так ли?

Лучший совет, который я могу дать, - это использовать его как можно чаще в своем собственном коде, и, надеюсь, с помощью экспертных обзоров и исправлений другие разработчики увидят, как код становится более читабельным. (убедитесь, что вы указали точку, когда происходят эти события).

В конечном счете, если код работает, остальное - семантика, на мой взгляд.

Я думаю, вы можете попытаться продать идею O / R mapping и mapper tools. Преимущество обработки строк как объектов довольно мощное.

Я думаю, вы должны сосредоточиться на производительности. Если вы можете создать приложение, которое показывает разницу в производительности при использовании DataSets против пользовательских объектов. Кроме того, попробуйте показать им принципы доменного дизайна и его соответствие структурам сущностей.

Не делайте это обсуждением религии или веры. Это трудно победить (и это не то, что вы хотите в любом случае)

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

У меня были разработчики, использующие dataTables для хранения данных, которые они выбирали из базы данных, а затем код бизнес-логики, использующий этот dataTable ... И я показал им, как я сократил время загрузки страницы с 7 секунд загрузки 100% CPU ( на веб-сервере), чтобы вообще не видеть движения ЦП .. путем изменения объекта памяти с dataTable на хэш-таблицу.

Итак, возьмите пример или случай, когда ваша задача лучше реализована по-другому, и выиграйте эту битву. Не боритесь в войне высокого уровня ...

Если совместимость является / будет проблемой в будущем, DataSet определенно не является правильным направлением. Вы МОЖЕТЕ выставлять DataSets / DataTables через службу, но независимо от того, ДОЛЖНЫ ли вы или должны обсуждать это. Если вы говорите .NET-> .NET, вы, вероятно, в порядке, в противном случае у вас будет очень несчастный клиент-разработчик с другой стороны забора, потребляющий ваш сервис

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

Если вы можете профиль, просто сделайте это и профиль. Наборы данных тяжелее простого Collection < T >

DataReaders быстрее, чем с помощью адаптеров ...

Изменить поведение объектов гораздо проще, чем массировать набор данных

В любом случае: просто сделай это, попроси прощения, а не разрешения.

Большинство программистов не любят выходить из своей зоны комфорта (обратите внимание, что пересечение набора "большинство программистов" и набора "Переполнение стека", вероятно, является пустым набором)."Если это сработало раньше (или даже просто сработало), то продолжайте это делать".Проекту, над которым я сейчас работаю, потребовалось много аргументов, чтобы заставить старых программистов использовать XML / схемы / наборы данных вместо просто CSV-файлов (предыдущая версия программного обеспечения использовала CSV-файлы).Это не идеально, схемы недостаточно надежны для проверки данных.Но это шаг в правильном направлении.Код, который я разрабатываю, использует абстракции OO в наборах данных, а не передает объекты наборов данных по кругу.Как правило, лучше всего учить на собственном примере, шаг за шагом.

Здесь уже есть несколько очень хороших советов, но у вас все равно будет работа, чтобы убедить своих коллег, если все, что вам нужно, чтобы поддержать вас, - это несколько поддерживающих комментариев по поводу переполнения стека. И, если они настолько скептичны, как звучат, вам понадобится больше патронов. Во-первых, получите копию «Шаблонов корпоративной архитектуры» Мартина Фаулера. который содержит подробный анализ различных методов доступа к данным. Прочитайте это. Затем заставьте их всех прочитать это.

Работа выполнена.

ориентированный на данные означает меньшую сложность кода.

Пользовательские объекты - это потенциально сотни дополнительных объектов, с которыми можно организовывать, поддерживать и вообще жить. Это также будет немного быстрее.

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

Начните с малого. Есть ли служебное приложение, которое вы можете использовать, чтобы проиллюстрировать свою точку зрения?

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

Поэтому я написал приложение для автоматизации процесса сборки. У него был элементарный пользовательский интерфейс WinForms. Но так как мы переходили на WPF, я изменил его на интерфейс WPF, сохранив при этом интерфейс WinForms, благодаря Model-View-Presenter. Для тех, кто не был знаком с Model-View-Presenter, это был легко понятный пример, на который они могли ссылаться.

Точно так же найдите что-то маленькое, где вы можете показать им, как будет выглядеть приложение, не относящееся к DataSet, без необходимости крупных капиталовложений в разработку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top