Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

Ваше мнение на мой подход.   Найти похожие ветки 

 
karat ©   (2004-11-11 09:48) [0]

ВСе чаще приходится создавать приложения для БД. И выработал для себя такой подход. Хотел бы узнать ваше мнение, насколько это вообще правильно.
Для работы с БД я всегда создаю класс. Его методы выполняют обыкновенные стандартные операции типа добавить запись, удалить запись и т.д. (к примеру, TOperation.GetClientCard). Как правило, в конструктор я передаю наборы данных (ADOCommand, ADOQuery), где инициализируются внутренние переменные того же типа. И методы работают уже с ними. Так же есть поля класса, содержащие свойства, специфичные для БД (к примеру ServerName).
Выаше мнение на такой подход?


 
Nikolay M. ©   (2004-11-11 10:08) [1]

Видал такой кошмар в одном месте. Не исключаю, что если грамотно построить иерархию классов, оно будет работать красиво и быстро. Но мне пришлось некоторое время провести на поддержке такой программы, где список клиентов выводился не связкой ADODataSet-DataSource-DBGrid, а начитывался в ListView, причем для построения каждой записи делалось несколько запросов к базе! Имхо, автора этого ужаса замучала икота от мата в его адрес...


 
КаПиБаРа ©   (2004-11-11 10:23) [2]

karat ©   (11.11.04 9:48)
И выработал для себя такой подход


Между какими подходами вы выбирали и в чем преимущества именно этого подхода?


 
Dmitriy O. ©   (2004-11-11 10:34) [3]

Это извращение


 
karat ©   (2004-11-11 10:40) [4]


> Между какими подходами вы выбирали

К примеру, можно просто на обработку каждой кнопки или другого нужного события, вставлять код исполнения SQL запроса, а не метод класса. Или уйти от классов и создать отдельный модуль с процедурами и функциями.


> в чем преимущества именно этого подхода

- С преимуществом столкнулся при разработке MDI приложений. Где есть несколько основных дочерних окон, в которых отображается наиболее важная часть информации для пользователя и допускается возможность открывания сразу нескольких одинаковых окон. Тогда класс, при создании дочернего окна, "привязывается" к нему и работает именно с данными этого окна. При подходе с отдельным модулем функций и процедур (без класса), считаю сложнее осуществивым.
- Читабельность кода модуля форм. В этой ситуации, класс является неким "черным ящиком", от которого интересует только информация на выходе. А что творится внутри него, уже мало интересует (при этом важен проффесиализм программиста). Это как про то, что мы используем функции и процедуры OP, но редко кто(наверное большинство) заклядывает внутрь их.


 
karat ©   (2004-11-11 10:42) [5]


> Dmitriy O. ©   (11.11.04 10:34) [3]
> Это извращение

Что тогда не извращение?


 
КаПиБаРа ©   (2004-11-11 11:36) [6]

karat ©   (11.11.04 10:40) [4]
К примеру, можно просто на обработку каждой кнопки или другого нужного события

Можно все писать в DataModul.


> Тогда класс, при создании дочернего окна,
> "привязывается" к нему и работает именно с данными
> этого окна

Почему бы самому дочерниму окну не работать с данными минуя промежуточные классы? Причем можно создавать несколько дочерних привязаных к одному и тому же набору.


 
Игорь Шевченко ©   (2004-11-11 11:53) [7]


> Почему бы самому дочерниму окну не работать с данными минуя
> промежуточные классы?


В примитивных приложениях так и делается (и это именно то, что рекомендует Borland).


 
by ©   (2004-11-11 11:56) [8]

Игорь Шевченко ©   (11.11.04 11:53)
А что рекомендует Borland для не примитивных приложений?


 
inic ©   (2004-11-11 12:01) [9]

karat ©   (11.11.04 9:48)

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


 
blackman ©   (2004-11-11 12:02) [10]

>В примитивных приложениях так и делается (и это именно то, что рекомендует Borland).
Это рекомендует Шевченко противный и примитивный Borland :)


 
Rule ©   (2004-11-11 12:07) [11]

ну момоему все зависит от задач, если написать быстренько маленьку программку по учету чегото то думаю нецелесообразно пихать новые классы туда где они будут все равно использоваться единажды, а если есть много окон или приложений которые повторяют опроделенную бизнесс-логику, тот тут место трехзвенкам ...
ИМХО


 
Игорь Шевченко ©   (2004-11-11 12:08) [12]

blackman ©   (11.11.04 12:02) [10]

Ты когда-нибудь уймешься ?


 
msguns ©   (2004-11-11 12:13) [13]

Есть такой метод (на примере такого же MDI-решения):
1. Создается Датамодуль, в который вшивается то, что глобально для приложения: записи, типы, коннекты, транзакции (для ИБ), методы, применяемые большинством объектов (например, обработчики событий датасетов) и т.д.
2. Создается по одной базовой форме на каждый тип интерфейсного окна (окно справочников, окно документов, окно редактирования записей и т.д.), где максимально прописывается реализация (обработчики акций, поп-ап меню, связка с коннектом, транзакциями и т.д.)
3. Из базовых форм достаточно быстро мастерятся интерфейсные (пользовательские) формы, которые "наточены" на конкретные объекты БД или предмета (таблицы, отчеты). Большинство функций уже определены (отображение текущего состояния датасета, обработчики вставки-удаления-изменения, перечитка с позиционированием, всевозможные поиски-фильтры-сортировки и т.д.) в форме-папаньке, остается только "заточить".
4. Формы в ране создаются динамически и после закрытия уничтожаются. Наряду с минусами (многажды открытая одна и та же форма, что приводит к лишним транзакциям или загрузке кэша одной, потеря узером "фокуса" и т.д.) есть и плюсы (можно одну и ту же таблицу отсортировать неск.способами и сравнить результаты в неск.окнах)
5. Никаких коррекций в гридах ! Только через формочки, не связанные напрямую с данными. Все модификации через автономные запросы (TIBSQL). Все, что должно заключаться в одну логически целостную операцию (например, проводка документа), через ХП в отдельной транзакции.

Уф, увлекся ;)))


 
Игорь Шевченко ©   (2004-11-11 12:18) [14]

msguns ©   (11.11.04 12:13) [13]

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


 
КаПиБаРа ©   (2004-11-11 12:22) [15]

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


 
msguns ©   (2004-11-11 12:28) [16]

>Игорь Шевченко ©   (11.11.04 12:18) [14]

.. и напрашивающийся шаг: вынести классы в саму базу и написать средство их юзанья и апдэйта извне..
И получим образчик Объектной модели БД. Но это уже совсем другая песнь.


 
Rem ©   (2004-11-11 13:33) [17]

У меня сделано так:
1. Есть службы бизнеса (хотя, они интегрируют в себе частично службы данных) - компоненты для работы с конкретными сущностями БД. Они реализуют методы для открытия списков, редактирования элементов. Эти методы вызывают обработчики, привязанные к соответствующим событиям (OnExecuteList, OnOpenDocument, OnEditDocument, OnDeleteDocument, OnRestoreDocument). В этих обработчиках пользователь может подключать свои (внешние для набора компонентов) формы (например, форму для отображения списка клиентов или форму редактирования данных о клиенте) или выполнять любые другие действия. Кроме этого, служба бизнеса содержит закешированный список - грубо говоря, открытую таблицу БД (хотя, это чаще всего именно запрос к нескольким таблицам БД) - то-есть то, что пользователь должен видеть в списке (например, Фамилию, Имя, Отчество, Адрес клиента (из таблицы "Клиенты"), Электронную подпись автора записи (из таблицы "Пользователи") и пр). Для чего это нужно: Вновь открываемые представления списка (а они могут отличаться за счет установки фильтров) не должны делать запроса к БД, так как данные уже на клиентской машине, и их нужно только клонировать. Для того, чтобы обеспечить актуальность кешированных данных, центральная служба данных (она общая для всех бизнес-служб) занимается синхронизацией данных. В результате траффик практически на нуле, так как пользователи загружают список при запуске приложения, а после этого происходит только синхронизация единичных записей.

2. Есть набор компонентов для работы со списками - от простого клона в памяти - до табличного представления. Они подключаются к службам бизнеса. Эти списки открываются не путем запроса из БД, а путем простого клонировани НД. В результате - экономия памяти и синхронизация данных. То-есть, поьзователь может открыть множество списков (журналов), например, приходных накладных за разные диапазоны дат (с любым пересечением), а набор данных у этих списков будет один и тот же. Причем, в случае изменения записей одним ихз пользователей в сети, эти данные автоматически ихзменяются во всех списках у всех пользователей. Траффик в момент синхронизации - на уровне 0.1 - 0.2% от общей пропускной способности сети (локальная сеть 100 мбит, 8 одновременно работающих пользователей) по данным Диспетчера задач Windows XP.

3. Есть набор компонентов (расширения DataSet"а) с методами управления документами (создать новый, открыть, записать), которые подключаются к службам бизнеса. Службы бизнеса запрашивают данные напрямую из БД и передают их в DataSet"ы. При записи службы бизнеса контролируют корректность записываемых даных и пишут напрямую в БД. После этого инициируют синхронизацию данных в кеше списков (для всех пользователей, подключенных к БД).

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

Уффффффф....
:)


 
Rule ©   (2004-11-11 14:07) [18]

ух ну вы тут навкладывали :)


 
Гавирла   (2004-11-11 14:12) [19]


> [1] Nikolay M. ©


тоак проблема наверно не в том, что через классы   в LIstView
а в том, что несколько запросов на одну запись ?


 
blackman ©   (2004-11-11 14:22) [20]

>Игорь Шевченко ©   (11.11.04 12:08) [12]
Ничего уж и сказать нельзя :)
Учебник: Создание приложений для работы с базами данных
http://articles.org.ru/lection/sozdbd.php
Не надо мудрствовать :)


 
DiamondShark ©   (2004-11-11 14:27) [21]


> blackman ©   (11.11.04 14:22) [20]

То, что там описано, и есть примитивное приложение.


 
Суслик ©   (2004-11-11 14:30) [22]

Советую почитать книгу
Мартин Фаулер
Архитектура корпоративных программных приложений.
Она есть на www.books.ru

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

Там и такой подход есть. Это либо паттерн аctive row, row data gateway,  table data gateway, table module (точно понять по приведенной инфе невозможно).


 
Rule ©   (2004-11-11 14:36) [23]

blackman ©   (11.11.04 14:22) [20]

БРРРРРРРРРРРРРРРРРРР, это БДЕ, вы что ... не нада даже напоминать  о нем.
С тех пор как с него ушел, я стал намного счастливее :)


 
by ©   (2004-11-11 14:40) [24]

Суслик ©   (11.11.04 14:30)
Читал я Фаулера. Он много расписывает подход для модели предметной области, все через классы, когда представление (форма) ничего не должна знать о том где класс берет данные, все в коллекциях. И очень мало он пишет о подходе для модуля таблицы, когда все основано на датасет. При это говорит, что для С# модуль таблицы может подходить больше, но равноценного с моделью предметной области примера и применения не приводит.
Много говорится что модель предметной области лучше, гибче, но чем конкретно она лучше не понятно. Особенно не понятно это для языков, которые имеют родные средства работы с модулем таблицы, для Delphi, для C#.
Может кто объяснит, в чем превосходство?


 
DiamondShark ©   (2004-11-11 14:41) [25]

Это верно. БзДЕ должно сдохнуть.
Обидно только, что другие технологии доступа, реализованные в Дельфи фактически копируют ублюдочную идеологию бзде.


 
Суслик ©   (2004-11-11 14:43) [26]


>  [24] by ©   (11.11.04 14:40)


> Много говорится что модель предметной области лучше


> Может кто объяснит, в чем превосходство?

Не знаю :))) Вернее мнение есть, но это не для форума - долго очень.

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


 
by ©   (2004-11-11 14:49) [27]

[26] Суслик ©   (11.11.04 14:43)
Жаль что мнение не для форума, очень хотелось услышать.
Я начинал в свое время, в первом проекте, как теперь понимаю с модели предметной области. Очень много текста приходилось писать.
Потом перешел на модель таблицы данных, с DBAware компонентами.
Теперь иду по пути отделения логики от предаставления, но без коллекций, а используя как основу класса датасет, и не отказываясь от гридов.

Вот здесь есть open-source проект, который использует только модель предметной области, все согластно паттернам проектирования. Как серьёзный пример, очень показательно.
TechInsite Object Persistence Framework
http://www.techinsite.com.au/tiOPF/ReleaseBuild

Вот бы такое увидеть и для модели таблицы.


 
Игорь Шевченко ©   (2004-11-11 14:49) [28]

DiamondShark ©   (11.11.04 14:41) [25]

А эта...если не секрет, в чем беда идеологии BDE ?


 
Суслик ©   (2004-11-11 14:51) [29]


>  [27] by ©   (11.11.04 14:49)


> Очень много текста приходилось писать.

Я не вижу в этом проблемы. Код, если он написан хорошо и един (а не разнесен по разным местам: pas и dfm) поддерживатся точно также как меньший код, но разнесенный.


 
by ©   (2004-11-11 14:57) [30]

[29] Суслик ©   (11.11.04 14:51)
Насчет того что легче поддерживать код в pas это да. Я и начичинаю потому отделять форму от логики, так как запарился в дизайн тайме искать где изменилась длина поля и пр.


 
Игорь Шевченко ©   (2004-11-11 14:58) [31]

by ©   (11.11.04 14:49) [27]

Tiopf-то ? Любопытно, но уж больно громоздко, на мой взгляд.


 
panov ©   (2004-11-11 14:59) [32]

Присоединяюсь к вопросу от Игорь Шевченко ©   (11.11.04 14:49) [28].


 
Суслик ©   (2004-11-11 15:00) [33]


> Насчет того что легче поддерживать код в pas это да. Я и
> начичинаю потому отделять форму от логики, так как запарился
> в дизайн тайме искать где изменилась длина поля и пр.

Скажу больше, что я давно (еще года 3 назад) запарился вообще компоненты кидать. Кидаешь быстро, медленно правишь (все бывает, иногда и это нужно). Код + заточенная на мои проблемы оболочка (в основном, в виде внешних методов) над vcl мне нравятся больше.

Конечно, это все мое личное мнение.


 
by ©   (2004-11-11 15:02) [34]

Игорь Шевченко ©   (11.11.04 14:58)
Да вот и меня масштаб этого framework слегка озадачил. Да и не готов я отказаться от грида как представления набора данных. Может еще и по потому что мне приходится писать приложения, которые оперируют буольшими наборами данных (биллинг), и загонять это в коллекции как то не хочется. Хотя может я и не прав. Уже пол года на распутье, как писать следующий проект.


 
Суслик ©   (2004-11-11 15:06) [35]


> [34] by ©   (11.11.04 15:02)

Биллинг?
Это особая статья. Это систему вряд ли можно отнести к тем системам, про которые говорит Фаулер.

Думаю, что для биллинга такой подход вряд ли подойдет.


 
Игорь Шевченко ©   (2004-11-11 15:15) [36]

by ©   (11.11.04 15:02) [34]


> Да и не готов я отказаться от грида как представления набора
> данных


Так вот и я не готов. Ни от грида, ни от прочих Data-aware controls, так как во-первых, удобно, во-вторых - уже написано, отлажено и, главное, протестировано многими пользователями.
Я вот до сих пор не могу себе ясно представить, как можно opf совместить с привычной идеологией разработки приложений в Delphi, так, чтобы при этом еще и не писать код в объеме, подобном tiopf.


 
msguns ©   (2004-11-11 15:21) [37]

>DiamondShark ©   (11.11.04 14:41) [25]
>Обидно только, что другие технологии доступа, реализованные в Дельфи фактически копируют ублюдочную идеологию бзде.

Нельзя ли для особо бестолковых прокомментировать:
1. Какие технологии копируют ?
2. Что именно копируют ?
3. В чем "ублюдочность" биде ?


 
DiamondShark ©   (2004-11-11 15:24) [38]


> Игорь Шевченко ©   (11.11.04 14:49) [28]
> DiamondShark ©   (11.11.04 14:41) [25]
>
> А эта...если не секрет, в чем беда идеологии BDE ?

А в ней от десктопных и файл-серверных БД рудиментов много.

Впрочем, я попутал. Не в самой БзДЕ, конечно, а в БД-компонентах.


 
vuk ©   (2004-11-11 15:26) [39]

to DiamondShark ©   (11.11.04 15:24) [38]:
>Не в самой БзДЕ, конечно, а в БД-компонентах.
О как! А в компонентах-то где?


 
Rule ©   (2004-11-11 15:30) [40]

Если бы существовало однозначное решени для всех авриантов, оно бы уже было бы реализовано, а так имеет то что имеем :)



Страницы: 1 2 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.045 c
14-1100249758
Holy
2004-11-12 11:55
2004.11.28
Терминал сервер


14-1100203491
_Ariadna_
2004-11-11 23:04
2004.11.28
Эту задачку дают дошкольникам при приеме в школу


1-1100472002
Кто---то
2004-11-15 01:40
2004.11.28
Как вставить элемент внутрь массива рекордов ?


14-1100314605
Думкин
2004-11-13 05:56
2004.11.28
С днем рождения! 13 ноября


11-1083348519
4kusNick
2004-04-30 22:08
2004.11.28
Помогите с Undo в RichEdit