Любые предложения по разделению доступа к данным, бизнес-логики и графического интерфейса в Delphi - PullRequest
6 голосов
/ 08 мая 2009

Я хочу отделить слой данных от бизнес-логики и бизнес-логики от GUI. Погрузившись в сеть, я наткнулся на несколько ресурсов, но все еще не мог прояснить свой разум. Некоторые люди говорят о паттернах, другие указывают на различные рамки. Мои требования:

  • манипулировать данными из rdbms (в основном, mysql) операций CRUD
  • работа с генерацией идентификатора (должен ли я использовать автоинкремент или механизм обработки данных или сгенерированный код паскаля)
  • табличные отношения могут быть логическими (ссылочная целостность не используется) или нет
  • потребность в способности генерировать объектные отношения из модели данных
  • данные должны быть преобразованы в бизнес-объект, а бизнес-логикой манипулировать
  • должны использоваться существующие компоненты графического интерфейса или бесплатные

Что мне нужно, это:

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

Ответы [ 7 ]

11 голосов
/ 08 мая 2009

Поскольку вы используете Delphi, обязательно посмотрите на DataModules. Здесь вы размещаете компоненты доступа к базе данных и логику.

Поместите классы в простые файлы "Unit".

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

4 голосов
/ 08 мая 2009

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

Я пытаюсь (но не всегда удается) разделять детали уровня данных с помощью ClientDataSets независимо от того, что используется в серверной части (обычно DBExpress или DBISAM). Я также пытаюсь написать хотя бы несколько интеграционных тестов, чтобы убедиться, что уровень данных работает должным образом (отдельная тестовая база данных с известными значениями).

С бизнес-логикой и данными (даже частично) пользовательский интерфейс намного проще. И ремонтопригодны.

3 голосов
/ 10 мая 2009

Лично я использую tiopf для бизнес-модели. Tiopf предоставляет слой доступа к данным. Последний код из репозитория включает в себя среду-модель-GUI-посредник, аналогичную MVC для отображения модели. Это позволяет вам отображать ваши данные, используя стандартные компоненты Delphi.

Tiopf также включает в себя несколько генераторов идентификаторов (направляющие, 32-битные и 64-битные целые и т. Д.).

Если вы заинтересованы в tiopf, я предлагаю вам начать с просмотра моего обзора . Затем направляйте любые вопросы в группы новостей.

3 голосов
/ 09 мая 2009

Взгляните на tiOPF

2 голосов
/ 08 мая 2009

Метод, который я использую и который очень хорошо работает, состоит в том, чтобы попытаться взять на себя другие роли в вашем приложении, а затем программировать так, как если бы вы были в этой роли. Например, когда вы работаете с базой данных, даже не думайте о графическом интерфейсе. Вместо этого подумайте о предоставлении классов и методов, которые просто работают с данными. Если вы создадите свой собственный SDK, который позже будете использовать, вы обнаружите, что его обслуживание будет намного проще.

Разработка на основе тестов - ваш друг. Познакомьтесь с DUnit и создайте небольшие лаконичные тесты для выполнения любого нетривиального кода. Документируйте интерфейсы и все, что не видно, глядя на экран, полный кода.

2 голосов
/ 08 мая 2009

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

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

Просто попробуйте.

Что касается генерации идентификаторов, то доверие MySQL для генерации идентификатора автоинкремента для вашего. Не тратьте время на его кодирование.

1 голос
/ 10 мая 2009

Я бы взглянул на Model-View-Controller (который является расширением Observer / Observable Pattern). Это означает, что «представление» (то есть пользовательский интерфейс) знает только, как обновить данные, а затем ответить на данные, которые обновляются. Модель (или Observable) знает, как манипулировать данными и сообщать представлениям, что они были обновлены. Это означает, что вы можете заменить пользовательский интерфейс, не меняя поставщика данных, и наоборот.

Выполните поиск в Google, поскольку существует множество примеров этого для Delphi (но не так много для Java / C # и т. Д.)

...