В Советской Белоруссии SQL разжигает айседа
http://theiced.livejournal.com/238346.html
Собственно, про кобол я не знаю, на дельфи пишу уже 15 лет и никак избавится от него не могу (слишком много легаси кода), а вот про SQL я с ним не согласен.
Сам по себе SQL очень хорошо подходит для генерации отчетов. Если отчет сводится к фильтрации-сортировке-группировке множеств - идеально. С рекурсивными CTE - еще и деревья можно обрабатывать, не особо включая мозг. Всунув поверх этого минимальных размеров постобработку на какой-нибудь функциональщине, можно сделать почти любой отчет, пришедший в голову свихнувшимся на Excel выпускникам нархоза, работающим в минстате, минфине и МНС.
Но когда доходит до процедурных расширений, API между СУБД и клиентскими приложениями или каких-нибудь вещей, которые забыли вовремя добавить в стандарт - начинается полная, немыслимая жопа.
Например, проклятая тема - генерация автоинкрементных ключей и возвращение значений автоматически заполненных полей. Кто во что горазд - identity, генераторы, sequence, функции (в каждой СУБД названные по разному), returning, заебы на тему "вызывать в той же транзакции и сессии" и прочая и прочая. Про вариации на тему "вернуть поле, которое заполняется автоматически, но не является ключом/identity" лучше даже не думать.
Неудивительно, что люди при первой же возможности сбегают в ORM (которые являются уже второй производной от всего этого маразма и несут на себе его неизгладимый след).
Собственно, про кобол я не знаю, на дельфи пишу уже 15 лет и никак избавится от него не могу (слишком много легаси кода), а вот про SQL я с ним не согласен.
Сам по себе SQL очень хорошо подходит для генерации отчетов. Если отчет сводится к фильтрации-сортировке-группировке множеств - идеально. С рекурсивными CTE - еще и деревья можно обрабатывать, не особо включая мозг. Всунув поверх этого минимальных размеров постобработку на какой-нибудь функциональщине, можно сделать почти любой отчет, пришедший в голову свихнувшимся на Excel выпускникам нархоза, работающим в минстате, минфине и МНС.
Но когда доходит до процедурных расширений, API между СУБД и клиентскими приложениями или каких-нибудь вещей, которые забыли вовремя добавить в стандарт - начинается полная, немыслимая жопа.
Например, проклятая тема - генерация автоинкрементных ключей и возвращение значений автоматически заполненных полей. Кто во что горазд - identity, генераторы, sequence, функции (в каждой СУБД названные по разному), returning, заебы на тему "вызывать в той же транзакции и сессии" и прочая и прочая. Про вариации на тему "вернуть поле, которое заполняется автоматически, но не является ключом/identity" лучше даже не думать.
Неудивительно, что люди при первой же возможности сбегают в ORM (которые являются уже второй производной от всего этого маразма и несут на себе его неизгладимый след).
no subject
no subject
Даже начиная новую программу, прочитать/записать данные по полям - занимает достаточно мало времени, работа обезъянья, не затрагивает мозга. А мозг я потрачу на более нужные вещи вместо того что бы тратить его на еще один уровень абстракции и держать в уме как оно на самом деле будет работать.
Для справки - работая на Delphi я давным-давно не использую DB_Aware контролы и компоненты. Вообще. Это тоже такой дополнительный и лишний уровень борьба с которым занимает гораздо больше времени чем получается от него пользы. Особенно в плане предсказуемости поведения. Вместо этого всего у меня один самопальный типа датасетик, похож на ClientDataSet но только он не датасет а просто буфер, поля которого объявляются динамически. У этому датасетику есть компонент который цепляет к себе этот датасет, грид, статус-бар и контекстное меню грида.
Для работы с БД используется FIBQuery, который без буфера, выдает только одну запись.
Если грида не требуется - то вообще кроме переменных ничего не юзаю.
А если поле строковое - то сую прямо в контрол и из него обратно в параметр FIBQuery который Update;
Т.е. написан свой маленький велосипедик который позволяет обходиться минимумом лишних абстракций.
no subject
Мне как-то не приходится добавлять десятки и сотни полей ежедневно в программу. А 10 полдей в месяц я добавлю без всяких проблем и без всяких ОРМ. Для того что бы внедрить ОРМ надо сделать кучу телодвижений а что поимею в итоге?
Это вам не приходится. А когда придется горя вы хлебнете.
Вместо этого всего у меня один самопальный типа датасетик, похож на ClientDataSet но только он не датасет а просто буфер, поля которого объявляются динамически. У этому датасетику есть компонент который цепляет к себе этот датасет, грид, статус-бар и контекстное меню грида.
Для работы с БД используется FIBQuery, который без буфера, выдает только одну запись.
Ничего что это такой маленький свой ORM для решения локальных задач? Фактически если вы дальше Delphi вылезете то увидите что люди к примеру в MVC вполне себе спокойно используют ORM c Model и добавляют любую сложную форму левой ногой. А у вас придется еще и пачку SQL писать. А зачем?
no subject
Один select и один update.
no subject
no subject
Форма в которой редактируются поля записи - для каждого типа объектов обычно одна.
Запросы тогда лежат на этой форме.
Если образуются запросы которые могут быть использованы из нескольких форм или запросу не нужна форма - то они выносятся в общий датамодуль или в отдельный специализированный юнит.
У меня нет нигде редактирование в гриде. Редактирование только в отдельной форме которая раскрывает эту запись по полям. И такая форма в которой реализуется редактирование - одна на каждый тип объекта.
А вот запрашивать данные используя много типов объектов - это как правило на каждой форме свой запрос. Но для таких форм не надо ничего объявлять, просто пишется запрос который автоматом создаст потребные поля в датасетике. Вызываем метод в датасетике подсовывая ему объект Query - оно и выполняется и отображается.
no subject
no subject
Дальнейшая работа с этими классами подразумевает что они имеют заполненные поля. А заполнятся они могут как все сразу (это неэффективно) так и по одному полю (тоже неэффективно, но уже по другому). В итоге для работы с объектами в ОРМ либо тянется куча по большей части ненужных данных либо генерится туча запросов на каждый чих.
Далее, если мы работаем с выборками по сложным запросам - тут мы или лепим в ОРМ левые классы не имеющие реального отражения в БД либо тянем коллекции классов с опять же нахрена не нужными полями.
Для того что бы работать полностью через ОРМ надо грубо говоря вытащить всю базу на клиента и распихать по объектам, что с одной стороны совершенно бессмысленно нагрузит клиента а с другой - низведет сервер до тупого хранилища. Т.е. мы проиграли с обоих сторон. Выиграли в процессе накидывания формочек, но это тоже не бесплатно и не факт что оно того стоило...
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
procedure TFrmAgent.F5;
begin
CDV.RowSavePosition; {сохраним текущую позицию}
{}
CDS.ExecSelect(QSel);
CDV.Sync;
{}
CDV.RowRestorePositionID; {восстановим позицию курсора если она была}
end;
А вот процедура чтения данных по одному региональному агенту, для редактирования.
Справочник элементарный, типа id, name, поэтому даже форму ему для редактирования делать не стал.
procedure TFrmAgent.F2; {редактирование элемента справочника}
var
id: integer;
sname: string;
iRow: cardinal; {текущая выбранная строка в дереве}
begin
if not CDV.RowSelected(iRow) then Exit; {если ни одна строка не выбрана}
{на CDS.Count > 0 можно уже не анализировать, иначе бы ничего не было выбрано}
id := CDS.ReadIntegerFN(iRow, 'ID');
QS.ParamByName('id').AsInteger := id;
QS.ExecQuery;
if QS.EOF then Exit;
sname := QS.FieldByName('name').AsString;
TransRC.Commit;
{}
if not InputQuery(Caption, 'Редактирование регионального агента', sname) then Exit;
{}
QU.ParamByName('id' ).AsInteger := id;
QU.ParamByName('name').AsString := sname;
Open_Query(QU);
TransRC.Commit;
F5; {позиционирование на старый ID - внутри}
end;
no subject
Щас позову Айсда, не уходи..
:)
no subject
Если логика работы используется более чем в одном месте - то я выношу это в отдельное место. Если эта форма - единственное место где у меня работа с этим объектом - нахрена мне это разделять? Что бы каноны соблюсти?
(no subject)
no subject
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
Они никак не отражают сути того, что делают эти методы.
далее, в методе F2 у вас несколько раз используются одни и те же строковые константы: 'id', 'name'. Положено такие вещи выносить хотя бы константы на уровне класса.
Комментарии в конце строки, заключенные в {} - неоправданы. 100 лет как для этой цели используется синтаксис комментариев с //
Конструкция if .. then Exit в одну строку. Правильный формат - Exit переносится на следующую строку с отступом как на следующий блок кода.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
no subject
Т.е. ОРМ тянет объекты на клиента, а если у объекта много больших полей которые нужны раз в год - тут с
ОРМ будет сильное падение эффективности.
Вы сами поняли что сказали? На чем будет падение эффективности? На выборке или передаче данных по сети?
Я же храню и имею ввиду объекты только в базе, на клиента вытаскиваю только то что нужно в конкретном месте. Если нужно разные поля объектов завязать друг с другом - использую логику на сервере.
Вы не поверите, но ОRM такое позволяет без всяких проблем. И да если уж внезапно у меня есть толстый объект я могу указать ORM как дернуть в этом случае. И объем кода с ORM и без ORM в этом случае будет сравним. Вы бы сначала посмотрели что такое ORM более детально и как он работает, а уже потом что-то про него говорили.
no subject
Потом для Delphi сделали аналогичную фигню, был на форуме фанат этой штуки, типа программу накидать за пару дней можно. Но потом он столкнулся с минусами - с поддержкой, модифицированием формы объектов в базе и необходимости синхронизации изменений в ОРМ - и энтузазизм его угас, вроде даже до нуля, ибо тему ту больше никто не поднимал да и упоминания того продукта я не слышал больше. Хотя он от Борланд/Эмбаркалеро был, а не левый.
no subject
Потом для Delphi сделали аналогичную фигню, был на форуме фанат этой штуки, типа программу накидать за пару дней можно. Но потом он столкнулся с минусами - с поддержкой, модифицированием формы объектов в базе и необходимости синхронизации изменений в ОРМ
С указанными минусами вы и со своим велосипедом столкнетесь. И да SQLAlchemy не самый худший вариант, но конечно JPA и ORM который есть в yii все же лучше. Фишка в том что ORM ни в коем случае не надо тащить самому, иначе эта овчинка не стоит выделки. Разрабатывать и сопровождать ORM должны отдельные люди.
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
Может оно еще и Windows Forms контролы генерить умеет, и модель содержит не то, что пауки микрософту приказали, а нужную информацию о типах и полях?
no subject
И много других полезных автоматизаций.
no subject
no subject
no subject
ЖАБАЙ
АВТОМАТИЗИРУЙ
no subject
а ведь есть еще и Vaadin...(no subject)
(no subject)
no subject