|
|
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Коллеги, использовал в своих программах бизнес-сущности, типа Код: c# 1. 2. 3. 4. В итоге поняв, что это ни что иное как DataSet, сделал: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. Вопрос - как мне в моем коде применить Dictionary? Я с ними не сильно знаком, по смыслу можно объявив наверное Код: c# 1. Например как с помощью них реализовать поиск по имени? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 19:25 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Какую задачу вы пытаетесь решить? Чем не устроил вариант wsnet Код: pascal 1. 2. 3. 4. ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 19:34 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetНапример как с помощью них реализовать поиск по имени? contains key ? А вообще жесть, конечно. Бизнес-сущности... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 19:39 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Да слишком много этих классов, это же неудобно каждый раз описывать ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 19:53 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
jmp_original, На примере моем как-то можете показать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 19:54 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetДа слишком много этих классов, это же неудобно каждый раз описывать ... Во-первых, их не больше, чем бизнес-сущностей. Во-вторых, каждый раз описывать и не надо, есть наследование. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 19:56 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
jmp_original, А почему не TryGetValue? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 19:57 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Я их не наследую, слишком они разные эти сущности, общего ничего нет у них, как быть тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 19:59 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetЯ их не наследую, слишком они разные эти сущности, общего ничего нет у них, как быть тогда? Тогда надо проводить анализ глубже, ибо общего у них как минимум ID. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 20:04 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Это называется шаблоном Active Record . Если внутри будет буфер с полным списком объектов (например, по ID), то остальной поиск делается через обычные циклы for item in itemsList. И возвращает обычный список со ссылками TList<Object> (Т.е. меняя их меняется и "база"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 20:20 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetjmp_original, А почему не TryGetValue? Не знаю. У тебя надо спросить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 20:23 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDi, можно на моем примере показать ActiveRecord ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 20:24 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Но неужели мой подход плох ? Он не имеет право на жизнь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 20:26 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDi, скажи в моем коде чтобы ты дополнил, полагаю может какие-то проверки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 20:28 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnet, варианты чего? Если нужен поиск, то делается банальный цикл по всем записям с проверкой по нужному полю. Если нужны данные по ID, то через TryGetValue (если там где-то внутри будет храниться Dictionary). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 20:36 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDi, Тот же Dictionary сделать полем моего класса TBase ? А где его создавать в конструкторе TBase? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 20:47 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetНо неужели мой подход плох ? Он не имеет право на жизнь ? Имеет, почему нет. Забавное извращение. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 21:04 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Почему извращение ?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 21:17 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnet, для чего он нужен? Обычно, когда что-то сложное -- весь код для работы с базой вообще в отдельном объекте/объектах хранят, чтобы не перемешивать бизнес-логику с логикой работы с базой. Т.е. типа TPerson и TPersonsTable(TBaseTable). И вот уже в TBaseTable можно и Dictionary применить для подгрузки туда данных из базы, и всё остальное типа обновления/удаления (TBaseTable.Update(ARecord: TBase)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 21:23 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDi, я в этом подходе не очень понимаю, как реализовать механизм блокировки записей, ведь если мы загрузим весь набор в класс personstable, а затем по ID подгрузим из этого списка нужную запись, то нет никакой вероятности что на момент получения записи по ID список personstable не измениться и мы получим грязную запись ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 21:29 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetJaDi, я в этом подходе не очень понимаю, как реализовать механизм блокировки записей, ведь если мы загрузим весь набор в класс personstable, а затем по ID подгрузим из этого списка нужную запись, то нет никакой вероятности что на момент получения записи по ID список personstable не измениться и мы получим грязную запись ? Используй механизм транзакций. Запусти транзакцию с уровнем изоляции "repeatable read", и в ее контексте формируй клиентский набор данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 21:36 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetПочему извращение ?) 1) Потому что TDataset уже есть и твоему велосипеду ещё до него расти и расти; 2) В процессе этого роста ты откроешь для себя забавные возможности автоформирования UI (которые в TDataset тоже уже есть); 3) Кодировать придётся на порядок больше, чем в тривиальном первом способе. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 21:44 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetJaDi, я в этом подходе не очень понимаю, как реализовать механизм блокировки записей, ведь если мы загрузим весь набор в класс personstable, а затем по ID подгрузим из этого списка нужную запись, то нет никакой вероятности что на момент получения записи по ID список personstable не измениться и мы получим грязную запись ? Списки на стороне клиента. Это НЕ реальные данные с базой, а фактически их слепок на какой-то момент времени (чисто для удобства, чтобы по каждому чиху не лазить в базу). Контроль целостности реализуется миллионом способов, начиная от базы данных (блочить таблицу или запись в самой базе при начале редактирования, такое позволяет тот же оракл) и заканчивая самим приложением (хранить сведения о последних изменениях в базе, после их обновлять на клиенте, если что-то меняется). Например, мне нравится такое решение: - в базе у объектов есть время последнего изменения; - при начале редактирования все данные по объекту подгружаются на форму; - после чего пользователь их изменяет; - при сохранении происходит проверка текущих данных в базе; - если их дата изменилась, то пользователь видит предупреждение об изменении и предложении подумать, действительно ли он хочет переписать их своими, тем самым затерев чужие изменения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 21:54 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Котовасия, а Read Commited не хватит ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 21:59 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetКотовасия, а Read Commited не хватит ? Ну, если ты уверен, что в поцессе формировпния клиентского датасета никто другой не закоммитит изменения - хватит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 22:02 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDi, а можете коротенький пример кода как у вас это реализовано ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 22:07 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
КотовасияwsnetКотовасия, а Read Commited не хватит ? Ну, если ты уверен, что в поцессе формировпния клиентского датасета никто другой не закоммитит изменения - хватит. Жадачи могут быть разными. Представь, что ты для формирования отчеты часть данных загрузил позавчера, а часть - сегодня. Наверное, такое допустимо в период новогодних праздников, когда никто больше не работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 22:09 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnet, неа, нельзя коротенько... Если на словах: подгружается объект, передается на форму, на форме данные из объекта грузятся в контролы, пользователь редактирует, при сохранении данные из контролов сохраняются в объект, проверяется корректность, подгружается текущая версия объекта и проверяется, были ли изменени, сохраняется объект в базу. Форма закрывается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2018, 22:25 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDi, а если за это время были изменения? Пользователь видит изменения или просто ему уведомление мол данные были изменены ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 06:50 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetJaDi, а если за это время были изменения? Пользователь видит изменения или просто ему уведомление мол данные были изменены ? В это время стоит таймер, который проверяет изменения и подгружает их в открытые журналы/справочники, если что-то поменялось (например, оставил программу на пол дня, а потом решил поработать). В карточках для редактирования ничего не подгружается, только предупреждение -- данные на момент открытия. Кроме того для важных данных есть еще всплывающие уведомления пользователей, мол их задача или заказ был изменен, кликните сюда для перехода. Короче, стандартный функционал, который есть во многих CRM/ERP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 09:25 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetJaDi, а если за это время были изменения? Пользователь видит изменения или просто ему уведомление мол данные были изменены ? Вообще, часто ничего такого и не нужно. Ну, прикинь, тётя Маша редактировала полдня документ, а потом, при попытке нажать "Сохранить" вдруг узнала, что дядя Петя что-то поменял раньше нее. И что ей делать - принять к сведению, идти ругаться с Петром или забить на свою работу? Пустой гемор на ровном месте. ... При создании документа ничего не нужно делать, ибо документ существует только на клиенте, никто его не сможет испортить. При редактировании - скорее всего, документ принадлежит его создателю, то есть - "кто создал, тот и правит", то есть, все кто не лень не смогут влезть. Т.обр., вопрос чисто организационный, и "проблемы" нет. А если нужно все же дать возможность что-то менять нескольким юзерам - тут варианты разные. Например: 1. "Кто последний нажал Сохранить - тот и прав". Совершенно ничего страшного в этом нет, главное - предупредить людей об этом. 2. Автоматически выставляется флажок "документ редактируется Марией Ивановной", все остальные могут только смотреть. Если МарьИванна ушла на обед и не вернулась (а работать с документом нужно"), флажок можно сбросить (с регистрацией сего непотребства в логе, если очень хочется). Флажок может сбросить либо админ, либо кто-нибудь из группы юзеров, допущенных до редактирования документа. 3. и т.п. Мы и так, и сяк, и эдак делали. Никакой разницы с т.зр. эксплуатации, но чаще всего "вариант 1". Если документ - сложная структура, то, возможно, "вариант 2": юзеру проще принять, что документ в его монопольном доступе. Юзеры - они народ терпеливый. Что им подсунешь, то они и съедят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 09:49 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
чччД__, Jadi спасибо, что делитель опытом! чччД__, если я реализовать хочу второй вариант - то кто первый открыл документ для правки - того и тапки? То есть нужно хранить с документом поле статус и ФИО редактора формы? А ежели я хочу реализовать права работы с документом - то понадобится реализовать еще и группу для редактирования? А как организовать группу - это лучше делать на уровне СУБД или на клиентском уровне? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 10:36 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Ну не буквально я имею ввиду ФИО редактора формы, а его ID конечно же! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 10:37 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
чччД__2. Автоматически выставляется флажок "документ редактируется Марией Ивановной", все остальные могут только смотреть. Если МарьИванна ушла на обед и не вернулась (а работать с документом нужно"), флажок можно сбросить (с регистрацией сего непотребства в логе, если очень хочется). Флажок может сбросить либо админ, либо кто-нибудь из группы юзеров, допущенных до редактирования документа. Идея мне нравится, только, ИМХО, лучше сделать что если документ не правится в течении X минут (выбирается админом системы), то сохраняется в черновик и статус "редактируется" сбрасывается сам. А при открытии черновика проверяется, были ли изменения исходного документа, и если были то открывается и новая версия и черновик в отдельном окне, с возможностью переноса выбранных изменений в основной документ. Да, так сложнее, зато удобнее пользователю НМВ :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 10:48 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Пишу файловую базу данных. Объясните, что такое файлы Программерский фольклор wsnet... пример кода как у вас это реализовано ? Позвольте вмешаться... wsnet, судя по вопросам опыт в Delphi у Вас не большой. По этой причине сильно рекомендую, сосредоточится на изучении стандартных подходов с использованием TDataModule-TDataSet-TDataSource и не придумывать свой неповторимый стиль (пока во всяком случае). Всегда найдется задача которую лучше решить иными способами, но для 90% случаев стандартный подход вполне годен. Кроме того это сильно упрощает жизнь последователям, которые будут поддерживать и развивать Ваш код (людей, которые знают про TDataSet много, а про вашу объектную модель бизнес сущностный знает ровно 1). Кроме того вопросы общего характера, типа как бы мне организовать архитектуру заранее обречены на флуд и холивары, т. к. чтобы дать более мене вменяемый ответ нужно очень хорошо разбираться в предметной области, организации вашей компании и прочей куче вещей о которой ни кто не знает. В результате все будут заниматься домыслами и выдавать рекомендации на основе своего личного опыта/задачи/конторы. То, что для одного будет вполне верно и очевидно, для другого буде абсолютным бредом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 11:00 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetКоллеги, использовал в своих программах бизнес-сущности, типа Код: c# 1. 2. 3. 4. В итоге поняв, что это ни что иное как DataSet, сделал: ... Например как с помощью них реализовать поиск по имени? Если уж действительно хочется "бизнес-сущности" с преферансом и томными барышнями, то можно начать пользоваться каким-нибудь ORM. Например Aurelius или от DevEx. Первый мне прям очень нравится. Не без недостатков, но очень такоой рабочий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 12:27 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
roschinspb, опыт есть, но он таки связан с формошлепством, вот и ищу другие подходы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 13:50 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
по сабжу: полнейший бред и тупосць. Не нужно тулить ООП туда, для чего оно не предназначено. зы: афтар конеш мой совет не послушает. Но это уже его буратинские проблемы. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 14:07 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetroschinspb, опыт есть, но он таки связан с формошлепством, вот и ищу другие подходы. Переходите к даташлёпству :o) Писать свою компонентную модель, фреймворк и т.д. в реальном проекте можно только когда есть четкое понимание, того как должно быть и что своя модель будет радикально лучше стандартной, т.е. на столько лучше, что сферический Вася Пупкин предпочтет тратить своё время на её изучение, а не накидает DataSet-ов которые он и так знает. Обычно такое понимание приходит когда уже много что сделано на стандартных компонентах. Смотрите исходники TPersistent, TCollection, TStrings, TActionList. Подумайте почему, зачем сделано так а не иначе, может какие идеи для себя почерпнете. Это как бы совет от человека, который программировал когда небо над Невой еще чернело от птеродактелей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 14:20 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
L_argoпо сабжу: полнейший бред и тупосць. Не нужно тулить ООП туда, для чего оно не предназначено. зы: афтар конеш мой совет не послушает. Но это уже его буратинские проблемы. :) Да вроде бы не тупость и не бред, не ? http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=919104&msg=12104238 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 15:50 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetL_argoпо сабжу: полнейший бред и тупосць. Не нужно тулить ООП туда, для чего оно не предназначено. зы: афтар конеш мой совет не послушает. Но это уже его буратинские проблемы. :) Да вроде бы не тупость и не бред, не ? http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=919104&msg=12104238 А, так ты не просто из тех, кто скл осилить не в состоянии, а особо упоротый... Ну, феллируй. В энтерпрайз попадешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 17:58 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
чччД__, ни о чем! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2018, 19:01 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetL_argoпо сабжу: полнейший бред и тупосць. Не нужно тулить ООП туда, для чего оно не предназначено. зы: афтар конеш мой совет не послушает. Но это уже его буратинские проблемы. :) Да вроде бы не тупость и не бред, не ? http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=919104&msg=12104238 Там же русским по белому написано "для этой задачи это не нужно". Так что все таки "НЕ". :) Хотите научиться удалять гланды автогеном ? ОК, бро... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 09:22 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
L_argowsnetпропущено... Да вроде бы не тупость и не бред, не ? http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=919104&msg=12104238 Там же русским по белому написано "для этой задачи это не нужно". Так что все таки "НЕ". :) Хотите научиться удалять гланды автогеном ? ОК, бро... Ага. Если ООП не нужно, тогда и Delphi нафик не нужён. Пущай автор голым SQL-ом обойдётся. Декларативненько так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 14:16 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Банальная пустая форма уже ООП ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 17:05 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
эндиБанальная пустая форма уже ООП не обязательно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 17:08 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
DimonkaАга. Если ООП не нужно, тогда и Delphi нафик не нужён.Не ага. Речь не шла про ненужность ООП как такового. Речь шла про использование ООП по назначению . Попытка притянуть за уши ООП в описание бизнес-сущностей - тупосць. В любом случае это будет не ООП, а фарс и посмешище. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 09:20 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
"ОО-языки упрощают абстракцию, возможно, даже слишком ее упрощают. Они поддерживают создание структур с большим количеством связующего кода и сложными уровнями. Это может оказаться полезным в случае, если предметная область является действительно сложной и требует множества абстракций, и вместе с тем такой подход может обернуться неприятностями, если программисты реализуют простые вещи сложными способами, просто потому что им известны эти способы и они умеют ими пользоваться. Все ОО-языки несколько склонны "втягивать" программистов в ловушку избыточной иерархии. Чрезмерное количество уровней разрушает прозрачность: крайне затрудняется их просмотр и анализ ментальной модели, которую по существу реализует код. Всецело нарушаются правила простоты, ясности и прозрачности, а в результате код наполняется скрытыми ошибкми и создает постоянные проблемы при сопровождении. Данная тенденция, вероятно, усугубляется тем, что множество курсов по программированию преподают громоздкую иерархию как способ удовлетворения правила представления. С этой точки зрения множество классов приравнивается к внедрению знаний в данные. Проблема данного подхода заключается в том, что слишком часто "развитые данные" в связующих уровнях фактически не относятся у какому-либо естественному объекту в области действия программы - они предназначены только для связующего уровня. Одной из причин того, что ОО-языки преуспели в большинстве характерных для них предметных областей (GUI-интерфейсы, моделирование, графические средства), возможно, является то, что в этих областях относительно трудно неправильно определить онтологию типов. Например, в GUI-интерфейсах и графических средствах присутствует довольно естественное соотвествие между манипулируемыми визуальными объектами и классами. Если выясняется, что создается большое количество классов, которые не имеют очевидного соответствия с тем, что происходит на экране, то, соотвественно, легко заметить, что связующий уровень стал слишком большим. " Эрик Реймонд, Искусство программирования для Unix ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 10:12 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Обсуждение перешло в курилку :o) Слышал еще такую аналогию: SQL работает со множествами, а ООП с объектами. Объекты и множества отдаленно похожи, как например стая селедки похожа на кита, если смотреть через эхолот. Но вот не стоит селедку ловить с использованием гарпуна, а кита ловить используя сеть, или удочку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 10:30 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
L_argoDimonkaАга. Если ООП не нужно, тогда и Delphi нафик не нужён.Не ага. Речь не шла про ненужность ООП как такового. Речь шла про использование ООП по назначению . Попытка притянуть за уши ООП в описание бизнес-сущностей - тупосць. В любом случае это будет не ООП, а фарс и посмешище. Ну давай рассмотрим гипотетический пример. У тебя есть: Пользователи, Клиенты, Заказы, Элементы заказа, Товары на складе итд. Используя ORM и ООП ты пишешь примерно следующий код: Код: pascal 1. 2. 3. 4. 5. А теперь напиши всё тоже самое "без ООП". :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 12:47 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
DimonkaА теперь напиши всё тоже самое "без ООП". :-)Что это за адовая дичь ? Я запросто напишу на SQL в 100 раз сложнее задачу. С подзапросами, функциями со сложными расчетами, курсорами и т.д. Оно предельно быстро выполнится на нативном языке СУБД. Не создавая ни байта лишнего сетевого трафика. И это будет компактный читабельный код, который понимают миллионы разработчиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 13:30 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
L_argoDimonkaА теперь напиши всё тоже самое "без ООП". :-)Что это за адовая дичь ? Я запросто напишу на SQL в 100 раз сложнее задачу. С подзапросами, функциями со сложными расчетами, курсорами и т.д. Оно предельно быстро выполнится на нативном языке СУБД. Не создавая ни байта лишнего сетевого трафика. И это будет компактный читабельный код, который понимают миллионы разработчиков. Видел я и такой ад конечно, когда половина логики была размазана по тысяче серверных процедур. Оно может и выполняется немного быстрее, но это реальный ад разбираться, отлаживать, а самое главное изменять под новые требования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 14:13 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Dimonka... Используя ORM и ООП ты пишешь примерно следующий код: Код: pascal 1. 2. 3. 4. 5. А теперь напиши всё тоже самое "без ООП". :-) Мы как-то занимались интеграцией с одной конторой, они именно так, в цикле-перебором данные доставали... ЭсКуЭль они знали, но очень слабо, про джойны (например) не знали уже ничего ("А зачем? Можно ведь цикл в цикле, не зная sql вообще")... да, калеки, конечно, но вот как-то живут они с этим, и даже считают это преимуществом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 14:42 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
DimonkaL_argoпропущено... Что это за адовая дичь ? Я запросто напишу на SQL в 100 раз сложнее задачу. С подзапросами, функциями со сложными расчетами, курсорами и т.д. Оно предельно быстро выполнится на нативном языке СУБД. Не создавая ни байта лишнего сетевого трафика. И это будет компактный читабельный код, который понимают миллионы разработчиков. Видел я и такой ад конечно, когда половина логики была размазана по тысяче серверных процедур. Оно может и выполняется немного быстрее, но это реальный ад разбираться, отлаживать, а самое главное изменять под новые требования. То же самое можно сказать не только про SQL. Всё зависит от разработчика. Мне вот, лично мне, не нравится бизнес-логика в триггерах. Код в этом случае реально размазывается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 14:56 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
без хранимок любой sql сервер превращается лишь хранилище dbf для 1C :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:37 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
чччД__, а причем здесь знания SQL? Концепция предполагает, что я использую 1. Data Transfer Object 2. business object 3. data access object И поддерживать эту модель будет легче на самом деле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:47 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
энди, но ведь никто не отвергает их применение, хранимки нужны! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:48 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetчччД__, а причем здесь знания SQL? Концепция предполагает, что я использую 1. Data Transfer Object 2. business object 3. data access object И поддерживать эту модель будет легче на самом деле. "Легче, чем другую", конечно. На 200%. На самом деле. Главное - велосипед свой запилить. И вовремя всплыть в разделе "работа". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:57 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnet, Крайне рекомендую к прочтению http://www.ooart.ru/uploads/book/arhitektura_korporativnyh_programmnyh_prilozhenij_fauler_m.pdf ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 16:26 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
schiwsnet, Крайне рекомендую к прочтению http://www.ooart.ru/uploads/book/arhitektura_korporativnyh_programmnyh_prilozhenij_fauler_m.pdf Товарищ Фаулер Многие разработчики просто не владеют SQL и потому, пытаясь сформулировать эффективные запросы и команды, сталкиваются с проблемами. Помимо того, все без исключения технологии внедрения предложений SQL в код на языке программирования общего назначения страдают теми или иными изъянами. (Безусловно, было бы лучше осуществлять доступ к содержимому базы данных с помощью неких механизмов уровня языка разработки приложения.) А администраторы баз данных хотели бы уяснить нюансы обработки SQL-выражений, чтобы иметь возможность их оптимизировать. По этим причинам разумнее обособить код SQL от бизнес - логики, разместив его в специальных классах. Лютый п....ц, чтд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 16:34 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
чччД__Dimonka... Используя ORM и ООП ты пишешь примерно следующий код: Код: pascal 1. 2. 3. 4. 5. А теперь напиши всё тоже самое "без ООП". :-) Мы как-то занимались интеграцией с одной конторой, они именно так, в цикле-перебором данные доставали... ЭсКуЭль они знали, но очень слабо, про джойны (например) не знали уже ничего ("А зачем? Можно ведь цикл в цикле, не зная sql вообще")... да, калеки, конечно, но вот как-то живут они с этим, и даже считают это преимуществом... По такой логике, если делать "много чего" на хранимках, всё должно будет летать. Но вот как-то нет. Не летает нифига. Зааттачил примерчик :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 17:56 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Сам никогда не использовал ORM и не планирую пока. Даже в небольших проектах мне проще написать несколько хранимок. Утверждение о том, что серверную логику поддерживать сложнее - довольно спорное. Например, чтобы изменить логику сохранения данных в базу мне достаточно будет поменять хранимку, а не пересобирать приложение. А про отчетность я вообще молчу. Если тащить данные из таблиц, в которых хранятся миллионы записей, через ORM, который вообще ничего не знает про индексы, то это может очень плохо закончится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 20:23 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
DimonkaчччД__пропущено... Мы как-то занимались интеграцией с одной конторой, они именно так, в цикле-перебором данные доставали... ЭсКуЭль они знали, но очень слабо, про джойны (например) не знали уже ничего ("А зачем? Можно ведь цикл в цикле, не зная sql вообще")... да, калеки, конечно, но вот как-то живут они с этим, и даже считают это преимуществом... По такой логике, если делать "много чего" на хранимках, всё должно будет летать. Но вот как-то нет. Не летает нифига. Зааттачил примерчик :-) никто не говорил, что если использовать хранимки, то всё будет прямо летать. Хранимки работают там, где лежат данные, и вот это их преимущество перед всеми вашими ОРМ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 20:26 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
AJiЕсли тащить данные из таблиц, в которых хранятся миллионы записей, через ORM, который вообще ничего не знает про индексы, то это может очень плохо закончится. Это не так. Во всех ОРМ адекватные запросы генерируются с коректными соединениями и условиями. В отличие от SQL ошибиться тяжело и покроет 90% задач с гаранией работоспособности. Кроме того во всех этих орм всегда есть возможность выполнить собственные запросы и получить результат в удобном видео. Более того, благодаря кешированию данных орм иногда может работать даже быстрее обычных sql. Вот такой вот парадокс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 20:40 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDiБолее того, благодаря кешированию данных орм иногда может работать даже быстрее обычных sql. Вот такой вот парадокс. а как ОРМ отслеживает, что данные в кеше устарели ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 20:49 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
defecator, так же, как и любые другие технологии доступа -- никак. Программист сам решает, как должен работать кеш. Например, сбросив кеш перед важным запросом, чтобы гарантировать актуальность данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 21:10 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDidefecator, так же, как и любые другие технологии доступа -- никак. Программист сам решает, как должен работать кеш. Например, сбросив кеш перед важным запросом, чтобы гарантировать актуальность данных. то есть кеш - фикция ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 21:50 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
defecator, Нет, не фикция, довольно полезная штука (точнее, жизненно необходимая из-за работы с объектами по каждому чиху, когда пинг до сервера уже становится серьезной проблемой для производительности). Модификация данных -- жалкие проценты от операций чтения. Более того, бОльшая часть данных -- "статические", после создания не меняются очень долго (читай, никогда). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 22:00 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDiAJiЕсли тащить данные из таблиц, в которых хранятся миллионы записей, через ORM, который вообще ничего не знает про индексы, то это может очень плохо закончится. Это не так. Во всех ОРМ адекватные запросы генерируются с коректными соединениями и условиями. В отличие от SQL ошибиться тяжело и покроет 90% задач с гаранией работоспособности. Кроме того во всех этих орм всегда есть возможность выполнить собственные запросы и получить результат в удобном видео. Прям таки адекватные запросы? Насколько я знаю там нельзя указывать список полей, которые отбираются из таблицы. Он же всегда выполняет Код: sql 1. Разве нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 22:03 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
AJi, нет конечно... отбираются только те поля, которые требуются объекту... более того, если объект сложный и содержит вложенные сущности (например, ссылка на другой документ), то их можно как сразу загрузить, так и отложить на потом (когда к ним будет первый доступ в коде, то они автоматом подгрузятся). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 22:15 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDiAJi, нет конечно... отбираются только те поля, которые требуются объекту... более того, если объект сложный и содержит вложенные сущности (например, ссылка на другой документ), то их можно как сразу загрузить, так и отложить на потом (когда к ним будет первый доступ в коде, то они автоматом подгрузятся). А ну да, mORMot так умеет. Может быть я старенький уже, но я привык запросы сам писать:)) Так хоть точно знаешь куда копать если тупить начинает. А все эти ORM черти как генерят запросы. Возможно, вы правы и они покрывают 90% задач, но мне все равно лень пересобирать приложение, когда поменялась логика сохранения или удаления записи и достаточно лишь процедуру на сервере поменять:) И если я все правильно понимаю, то ORM работает напрямую с таблицами. Лично я не люблю, когда у пользователей есть права на изменение данных в таблицах. Это не есть безопасно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 22:30 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
AJi, Например, вспоминаю интересное решение в одном из таких фреймворков: генерится обычный запрос на селект из таблицы, а к нему добавляется джойн с подгрузкой данных внутреннего объекта, после чего результат разбирается и получается, что за раз сразу несколько объектов вытащилось из базы, и в дальнейшем они могут использоваться независимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 22:30 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
AJiИ если я все правильно понимаю, то ORM работает напрямую с таблицами. Лично я не люблю, когда у пользователей есть права на изменение данных в таблицах. Это не есть безопасно. Не только. Это может быть любой источник данных -- хоть вьюхи, хоть собственный запрос, а иногда и вовсе какая-то внешняя функция для каких-то спец полей. Вся фишка лишь в том, чтобы правильно связать поля класса с полями датасета/результата. Но да, не все фреймворки такое могут. Тут уже доки надо читать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 22:35 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDiAJiИ если я все правильно понимаю, то ORM работает напрямую с таблицами. Лично я не люблю, когда у пользователей есть права на изменение данных в таблицах. Это не есть безопасно. Не только. Это может быть любой источник данных -- хоть вьюхи, хоть собственный запрос, а иногда и вовсе какая-то внешняя функция для каких-то спец полей. Вся фишка лишь в том, чтобы правильно связать поля класса с полями датасета/результата. Но да, не все фреймворки такое могут. Тут уже доки надо читать. При собственных запросах вообще теряется всякий интерес использовать ORM. Если бы можно было использовать процедуры сервера... Я поверхностно посмотрел несколько ORM, но там ничего подобного не увидел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 22:47 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
defecatorDimonkaпропущено... По такой логике, если делать "много чего" на хранимках, всё должно будет летать. Но вот как-то нет. Не летает нифига. Зааттачил примерчик :-) никто не говорил, что если использовать хранимки, то всё будет прямо летать. Хранимки работают там, где лежат данные, и вот это их преимущество перед всеми вашими ОРМ А что, только два варианта: ОРМ либо хранимки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2018, 00:50 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
Котовасияdefecatorпропущено... никто не говорил, что если использовать хранимки, то всё будет прямо летать. Хранимки работают там, где лежат данные, и вот это их преимущество перед всеми вашими ОРМ А что, только два варианта: ОРМ либо хранимки? Ну почему же. Можно еще TQuery использовать и писать запросы прям там. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2018, 01:04 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDi, а Connection держали постоянно или по мере подгрузки данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2018, 06:45 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnet, соединения включены всегда. С автовосстановлением связи в случаи ее потери. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2018, 07:39 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
А что, только два варианта: ОРМ либо хранимки? Правильно так: Есть 2 варианта: 1. прямой запрос (написанный статически или сгенеренный ORM-ом) 2. ХП. Других вариантов нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2018, 09:01 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
L_argo, ну почему в своей SQLite я использую Object Model. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2018, 09:35 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
schiwsnet, Крайне рекомендую к прочтению http://www.ooart.ru/uploads/book/arhitektura_korporativnyh_programmnyh_prilozhenij_fauler_m.pdf Спасибо, вопрос интересующий - там рассказывается о модели MVC ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2018, 11:08 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
JaDi, У меня есть филиалы с нестабильным каналом, вот и думаю, не проще ли мне открывать, получать данные и закрывать соединение, конечно с pooling, как здесь поступить лучше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2018, 11:10 |
|
||
|
Базовый класс для бизнес-сущностей
|
|||
|---|---|---|---|
|
#18+
wsnetJaDi, У меня есть филиалы с нестабильным каналом, вот и думаю, не проще ли мне открывать, получать данные и закрывать соединение, конечно с pooling, как здесь поступить лучше? По сути это одно и то же (кстати, в том же ODAC'е включается одной настройкой в сессии). "Постоянное соединение" -- на самом деле не постоянное и тупо отправляет "пинг" на сервер, например, раз в 30 секунд для проверки связи. И в случае проблемы -- переподключается. Есть другие, более радикальные подходы, которые решают не разовые ошибки связи, а когда такие ошибки -- норма: - удаленный рабочий стол или веб, приложение работает стабильно, при проблемах связи ничего не пропадает и ошибок не появляется, все данные остаются на сервере (если у клиента пропала связь, то он тупо переподключается и дальше работает); - оффлайновые клиенты с синхронизацией данных (т.е. клиенты работают с внутренней базой, а потом через какие-то периоды времени новые пакеты данных отправляют на сервер). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2018, 11:40 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2040386]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
206ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
112ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 610ms |

| 0 / 0 |
