Использование Delphi-ориентированных на данные компонентов - плюсы и минусы

Я хочу узнать ваше мнение об использовании компонентов данных в проектах. Каковы сильные и слабые стороны разработки приложений (win32 и web) с использованием Delphi и компонентов, учитывающих данные (из стандартного пакета Delphi или стороннего производителя)?

Используя FireBird, я много работал с IBObjects, которые представляют собой зрелый набор компонентов и работали очень хорошо.

Но есть и много других СУБД (MySQL, MSSQL, DB2, Oracle, SQLite, Nexus, Paradox, Interbase, FireBird и т. Д.). Если вы разработали большие проекты, в которых вы использовали много компонентов, учитывающих данные, ответьте, указав тип базы данных и название набора компонентов, учитывающих данные.

Я также заинтересован в DB2 (AS400). Какие компоненты вы использовали с успехом, или с какими компонентами действительно трудно работать?

7 ответов

Решение

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

Это хорошо для небольших проектов, но с ростом их размера код становится все менее и менее обслуживаемым.

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

Неизменно в таких случаях я отказался от компонентов, учитывающих данные, и переключился на (кодированный вручную) дизайн MVC.

Это требует больших предварительных усилий по написанию кода, но приводит к результатам (IMHO) в проекте, который является обслуживаемым, расширяемым и отлаживаемым.

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

Вот несколько советов по использованию компонентов с учетом данных:

  • Не просто переписывайте FishFact в большем масштабе. Внесите некоторую мысль в свой дизайн.

  • Не используйте TDataModule, используйте много TDataModules, каждый из которых отвечает только за небольшой аспект данных ваших приложений.

  • TDatasets принадлежат TDataModules, в то время как TDataSources принадлежат TForms (если не используются для отношений master/detail).

  • Используйте наборы данных в памяти, такие как DataSnap TClientDataSet.

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

    • Объединение двух или более таблиц в один редактируемый набор данных

    • Денормализация основных таблиц структуры деталей может иногда упростить ваш код пользовательского интерфейса.

    • Создавайте поля только в памяти (например, вычисляемые поля, но вы также можете писать в них)

  • Вложенные таблицы TClientDataSet полезны, но не являются единственным способом выражения основных связей деталей. Иногда лучше сделать это старым способом с двумя независимыми TClientDataSets, соединенными через TDataSource.

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

Это не сложно, но вы должны знать, как вы можете это сделать.

Один из подходов состоит в том, чтобы ваши компоненты DataSet были включены в DataModule (или другой невизуальный контейнер).

Другой удобный трюк заключается в том, чтобы использовать TClientDataSet для записи в пользовательском интерфейсе и использовать его в качестве промежуточного буфера между пользовательским интерфейсом и бизнес-уровнем. Бизнес-уровень затем использует компоненты TDataSet, специфичные для вашего уровня данных.

--jeroen

Посмотрите на решения ORM.

Это хороший подход с многоуровневой архитектурой. Смотрите ORM для DELPHI win32

Компоненты, учитывающие данные, полезны с точки зрения RAD и прототипирования, особенно когда вы разрабатываете отчеты или таблицы, основанные на данных. т.е. вы можете повозиться во время разработки. Так что я их так использую. Но когда приходит время преобразовать его в код доставки, я почти всегда разрываю соединения, удаляю SQL из запросов и делаю все в коде. Это намного более предсказуемо и обслуживаемо, особенно в среде для нескольких разработчиков с контролем версий. Когда SQL-код где-то внедряется в форму, очень трудно попытаться выяснить, где на самом деле находится SQL. И особенно плохо иметь SQL в двух местах, а затем нужно выяснить, какой из них действует.

Компоненты Delphi с поддержкой данных не зависят от используемого вами механизма внутренней базы данных, поэтому использование Firebird, MS SQL Server, Oracle или других компонентов не имеет значения для ваших компонентов с поддержкой данных. Они знают только назначенный им компонент источника данных и через него делают все, что связано с БД.

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

Вы можете использовать Unidac, который поддерживает множество серверов баз данных, включая Firebird (который я использую) и имеет очень хорошие функции.

В сочетании с Remobject SDK у вас будет отличная комбинация n-уровневой архитектуры и абстракции базы данных.

Другие вопросы по тегам