|
|
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Всем привет. Интересует ваше мнение о двух разных подходах. Сейчас одной ногой сижу на поддержке двух разных проектов (Delphi+firebird) для конторы (написаны не мной и писались двумя разными людьми), время от времени у бизнеса возникают хотелки которые я реализовываю. В одном проекте компоненты для работы с базой "накиданы" дизайнере. В другом проекте (использются классы, методы итд.) компоненты для работы с базой создаються динамиччески. При запросе в базу, метод создает транзакцию кверю и отдает данные, после компоненты удаляются. И в некоторых местах где например в интерфейсе есть набор фильтров и баттон "Применить" (по которому дергается какойто из методов) пользователь может выбирать разные фыльтры и сколько угодно раз жмякать "Применить" есть проверка, если компонент уже создан то он уничтожается и все пересоздается, и все поехало по новой. Интересует мнение насколько этот подход оправдан. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 15:04 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Sashaua, Во втором подходе, похоже, была попытка отделить логику от интерфейса. Это хорошо и так и надо. Т.к. интерфейсы могут быть разными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 15:16 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Я бы ради интереса поставил логирование. Сколько раз пользователь(ли) меняет набор фильтров. Может те, кто это умел уже ушли, а новые не в зуб ногой и функция устарела ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 15:53 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
SashauaИнтересует мнение насколько этот подход оправдан. Скажем так, он оправдан, когда программисту нехрен делать, всё слишком хорошо и безошибочно работает и сложно чувствовать себя крутым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 15:58 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
авторИ в некоторых местах где например в интерфейсе есть набор фильтров и баттон "Применить" (по которому дергается какойто из методов) пользователь может выбирать разные фыльтры и сколько угодно раз жмякать "Применить" есть проверка, если компонент уже создан то он уничтожается и все пересоздается, и все поехало по новой. Считаю, что подход плохой. 1. Трата времени и ресурсов на пересоздание. 2. Если переоткрываются транзакции - дополнительно увеличивается их счетчик идентификаторов, что при большом количестве транзакций может со временем создать проблемы. Плюс (и то не всегда) только в том, что проще перейти на другую технологию работы с БД - меньше кода переписывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 16:22 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Любезныйменьше кода переписывать. Экстремально странное утверждение. Максимум, чего можно достичь - "не слишком больше кода переписывать", и то только в тех проектах, в которых код хорошо написан (чего на практике при таком подходе никогда не бывает). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 16:25 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
авторМаксимум, чего можно достичь - "не слишком больше кода переписывать", и то только в тех проектах, в которых код хорошо написан (чего на практике при таком подходе никогда не бывает). Если при нажатии кнопки дергается метод, реализация которого физически находится в другом модуле - переписывать нужно только код этого другого модуля. Во всяком случае, это проще, нежели чем рисковать портить еще и интерфейс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 16:33 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Блин, что-то я туплю. Конечно, отрыв кода интерфейса от логики и пересоздание компонентов - совершенно разные вещи. Выделение логики отдельно от интерфейса - необходимость для проектов, которым нужно развиваться. Пересоздание компонентов с реинициализацией всего и вся - на мой взгляд, плохой подход. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 16:40 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Любезныйпереписывать нужно только код этого другого модуля. От этого переписываемого кода не становится меньше. ЛюбезныйВо всяком случае, это проще, нежели чем рисковать портить еще и интерфейс. Новое странное утверждение про "ещё и". При этом Вы вообще позабыли про рассмотрение в разрезе "дизайненные vs создаваемые на ходу компоненты" и почему-то перешли к рассмотрению совершенно перпендикулярного разреза "один файл или разные". Такое ощущение, что Вы почему-то считаете, что "дизайненные" - это "один файл", а "создаваемые на ходу" - это разные, хотя с вероятностью в 50% будет строго наоборот. Ну а в целом - накидывать хренову уйму ненужного тупого кода это да, проще. Поэтому многие так и делают. Вот только "проще" - не значит "лучше". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 16:42 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Sashaua, ваш вопрос из серии религиозных - каждый будет защищать свой любимый подход. Вам в некотором смысле повезло - вы занимаетесь поддержкой и того, и другого. Через некоторое время вы сами сможете ответить на вопрос "какой из подходов лучше с точки зрения поддержки?" (При первоначальной разработке (касательно её простоты и скорости) ответ может оказаться другим, но обычно считают, что удобство поддержки важнее, т.к. обычно в конечном счете на неё уходит больше ресурсов.) С точки зрения автоматизированного тестирования, например, второй подход лучше, хотя и он недостаточен: бизнес-логика должна быть отделена как от интерфейса, так и от логики хранения данных. (Но кого это волнует, если тестирование ручное или вообще его делает заказчик/пользователь?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 18:31 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
L1GС точки зрения автоматизированного тестирования, например, второй подход лучше, хотя и он недостаточен: бизнес-логика должна быть отделена как от интерфейса, так и от логики хранения данных. В этих словах Вы ухитрились допустить сразу две ошибки. Во-первых, как уже обсудили выше, отделение бизнес-логики либо чего-то другого никак не зависит от сравниваемых подходов и равно может присутствовать либо отсутствовать в любом из них. Во-вторых же, у Вас ложные представления об автоматизированном тестировании. Судя по тому, что Вы сказали, Вы имели в виду юнит-тестирование. Однако, юнит-тестирование приложений работы с БД нерационально, в то время как автоматизированное тестирование куда шире, применимо для подобных приложений и равно способно тестировать как "отделённые", так и "совмещённые" приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 18:44 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Любезныйотрыв кода интерфейса от логики и пересоздание компонентов - совершенно разные вещи. Выделение логики отдельно от интерфейса - необходимость для проектов, которым нужно развиваться. Пересоздание компонентов с реинициализацией всего и вся - на мой взгляд, плохой подход. Поэтому уже лет 20 как придумали TDataModule, которые сочетают инкапсуляцию методов доступа к базе и "накидывание компонентов мышкой". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 18:56 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
softwarerL1GС точки зрения автоматизированного тестирования, например, второй подход лучше, хотя и он недостаточен: бизнес-логика должна быть отделена как от интерфейса, так и от логики хранения данных. В этих словах Вы ухитрились допустить сразу две ошибки. Во-первых, как уже обсудили выше, отделение бизнес-логики либо чего-то другого никак не зависит от сравниваемых подходов и равно может присутствовать либо отсутствовать в любом из них. Во-вторых же, у Вас ложные представления об автоматизированном тестировании. Судя по тому, что Вы сказали, Вы имели в виду юнит-тестирование. Однако, юнит-тестирование приложений работы с БД нерационально, в то время как автоматизированное тестирование куда шире, применимо для подобных приложений и равно способно тестировать как "отделённые", так и "совмещённые" приложения. "Во-вторых", я имел в виду вовсе не юнит-тестирование, а тестирование более крупных функциональных блоков (хотя не уверен, можно ли его считать интеграционным). Конкретнее - такое, при котором для скорости реальную СУБД приходится подменять тестовым хранилищем данных в ОЗУ. Насчет "во-первых" - действительно, автор говорил только про использование визуального дизайнера для БД-компонент. То, что при этом использовались еще и db-aware controls с заданной в их свойствах привязкой к БД-компонентам - это уже моё предположение. Верное или нет - пока неизвестно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 20:10 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
L1G"Во-вторых", я имел в виду вовсе не юнит-тестирование, а тестирование более крупных функциональных блоков (хотя не уверен, можно ли его считать интеграционным). Для тестирования "более крупных функциональных блоков" разделение некритично. Там, где тестируется блок - он может состоять из нескольких функций в разных файлах, он может состоять из нескольких функций в одном файле, он может состоять из одного ужасного обработчика Button1Click - код тестирования и не заметит разницы, он в любом случае "просто что-то вызывает". L1GКонкретнее - такое, при котором для скорости реальную СУБД приходится подменять тестовым хранилищем данных в ОЗУ. Кошмар. Скажу деликатно: ценность такого тестирования нулевая. Точнее - отрицательная, поскольку на него тратятся вполне конкретные время и деньги. L1GНасчет "во-первых" - действительно, автор говорил только про использование визуального дизайнера для БД-компонент. То, что при этом использовались еще и db-aware controls с заданной в их свойствах привязкой к БД-компонентам - это уже моё предположение. Верное или нет - пока неизвестно. Независимо от того, верно оно или нет, это не имеет никакого отношения к возможности автоматизированного тестирования. Используются dbaware - значит, авторы проекта ещё более недураки, вот и всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 20:22 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
SashauaПри запросе в базу, метод создает транзакцию кверю весь вопрос - как создаёт. если в каждом классе по разному - то ой. а если там создание в одном месте (например в общем классе-предке, типа Active Record), то при изменении, например, библиотеки доступа к БД - потребуется только это место переписать (я говорю именно про создание, время жизни и т.д. Конкретные методы и свойства тип prepare запросов в разных библиотеках называются по разному, но и это можно в общий предка метод вынести). Sashauaнапример в интерфейсе есть набор фильтров и баттон "Применить" ....то для всех возможных комбинаций всхе возможных фильтров по отдельному TQuery на форму не кинешь все равно. И придётся либо на клиенте накладывать фильтр поверх "select * from table;" - Briefcase, TClientDataset, etc. Либо таки генерить SQL. В последнем случае создавать ли компонент или бросить его на форма, настроить ему все свойства и менять только SQL - какая разница? ЛюбезныйТрата времени и ресурсов на пересоздание. ОТОЖ! ведь пока Pentium мучается, создавая объект TQuery - пользователи уже по 100 раз поменяют наборы и значения фильтров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 20:48 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Для себя выработал такое правило. Если требуется отобразить данные в dbgrid, то проще кинуть на форму датасет и датасоурс. Именно на форму, а не на модуль данных. В модуле данных только общие для приложения ресурсы, например подключение к бд. Но в основном работа с бд выполняется динамически. Использую ibxFbUtils, что делает код весьма компактным. При этом учитываю, что prepare - это очень медленный этап при плохой сетке. Также стараюсь по возможности разрабатывать классы, например TUser, TContragent, и т.п. и в их методах реализовать всю работу с бд. В этом случае сложность программы уменьшается на порядки и никакой ORM не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2019, 23:37 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Для небольших задач (или подзадач) часто удобно всю работу с базой выносить в отдельный модуль(ли) с классом(ми), при создании которого ничего не происходит, а при обращении к свойствам/методам - создается что надо, если еще не создано. В деструкторе же все освобождается. Очень удобно потом в разных потоках создавать этот класс, не нужно никакой синхронизации. Ну и поменять субд просто, понятное дело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2019, 01:20 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
DmSerTContragent, и т.п. и в их методах реализовать всю работу с бд .... Ariochнапример в общем классе-предке, типа Active Record Насколько понимаю, тот же mORMot построен на этом принципе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2019, 11:48 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
AriochЛибо таки генерить SQL. В последнем случае создавать ли компонент или бросить его на форма, настроить ему все свойства и менять только SQL - какая разница? Менять SQL не надо. Достаточно одной строки наподобие Код: pascal 1. И какая разница... да, в общем, такая же, как и в других случаях. Фильтры здесь ничего не меняют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2019, 12:09 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
softwarer Код: pascal 1. в каком SQL-сервере есть в запросах макросы, изменение которых не потребует unprepare/prepare запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2019, 12:15 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
softwarerФильтры здесь ничего не меняют. меняют две вещи. 1) снимают требования к скорости - человек все равно медленнее 2) делают запросы не предсказуемыми (полный комбинаторный перебор всех варинантов всех фильтров) - их нельзя захардкодить и заранее создать по компоненту на каждый из всех возможных запросов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2019, 12:17 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Ariochв каком SQL-сервере есть в запросах макросы, изменение которых не потребует unprepare/prepare запроса? Меня удивляет постановка вопроса. Я не вижу в ней смысла. Есть ощущение, что Вы исходите из какого-то загадочного постулата, который я то ли пропустил, читая топик, то ли существует исключительно в Вашей голове. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2019, 12:19 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
Arioch1) снимают требования к скорости - человек все равно медленнее К скорости чего? Кроме того, я не понимаю, какое отношение скорость непонятночего имеет к теме топика. Тема топика - сравнение двух подходов. А по смыслу этих подходов они сравниваются с точки зрения качества/скорости/надёжности разработки и последующего сопровождения в таком стиле. Ariochих нельзя захардкодить и заранее создать по компоненту на каждый из всех возможных запросов А с какой стати вообще в голову приходит такой бред? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2019, 12:23 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
DmSerТакже стараюсь по возможности разрабатывать классы, например TUser, TContragent, и т.п. и в их методах реализовать всю работу с бд. В этом случае сложность программы уменьшается на порядки и никакой ORM не нужно.Уточняя терминологию: считывание объектов из БД и их сохранение обратно и есть O bject- R elational M apping. То, что в данном случае ненужно - это сторонний ORM- Framework . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2019, 14:01 |
|
||
|
Интересует ваше мнение о двух разных подходах
|
|||
|---|---|---|---|
|
#18+
softwarerAriochв каком SQL-сервере есть в запросах макросы, изменение которых не потребует unprepare/prepare запроса? Меня удивляет постановка вопроса. Я не вижу в ней смысла. Есть ощущение, что Вы исходите из какого-то загадочного постулата, который я то ли пропустил, читая топик, то ли существует исключительно в Вашей голове. Вы высказали тезис, что изменение SQL запроса с помощью StringReplace (или как угодно иначе реализованной макро-замены) не создаёт нового SQL запроса. Но если он не создает нового запроса - значит ему не надо снова Prepare делать. Если даже после макро-замены у нас все тот же старый SQL-запрос, то можно его запускать со старыми Prepare-данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2019, 14:42 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39793257&tid=2039633]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
178ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 485ms |

| 0 / 0 |
