metaclass: (Default)
[personal profile] metaclass
А вот интересно, возможна ли такая концепция: писать не текстовый лог, а строго типизированный, чтобы в будущем можно было грузить сохраненные в него объекты и выполнять над ними какие-нибудь запросы?
Сейчас анализ логов сводится к grep, awk и прочей тексто-ориентированной линуксятине. Существует мнение, что это (текстово-ориентированный обмен данными между линуксовыми утилитами через |) хорошо, но у меня это усиленно ассоциируется с электронным прибором, у которого все платы соединены одинаковыми никак не различимыми разъемами, а плата сама решает, "что делать с входным сигналом", т.е. нет никакой защиты от обобщенного индуса-дяди-Васи-телемастера-из-соседнего-гаража.


Плохо то, что большинство интересующих объектов обычно содержат кучу пропертей-ссылок на всякие дебри, которые вне рабочего контекста смысла не имеют, а чтобы их исключить, нужно какой-то флаг на проперть типа атрибута/аннотации "NotLoggable". А это плохо тем, что логгинг не должен требовать лишнего от объектов, с которыми он работает.

Сейчас вывод в лог выглядит следующим образом:
  mLog.DebugFormat("OnAuthenticateRequest: {0} {1} {2}",
        httpApplication.Request.RawUrl,
        httpApplication.Request.UserAgent,
        httpApplication.Request.UserHostAddress); 


А желательно было бы так:
 
 mLog.Debug("some_user_comment",LogFlags.LocalVars | LogFlags.MethodName | LogFlags.This | LogFlags.Parameters);


А DebugAll был бы хитрым метапрограммным макросом, который бы доставал, в зависимости от флагов, имя метода, this, все локальные переменные и параметрами с именами и значениями, сериализовал бы это дело во что-то машинно-читабельное и писал бы в лог.

Date: 2009-04-26 05:11 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Ну замени его на mysql,postgresql или еще какую-нибудь трасцу.
Конечно, с ними xml не распарсишь, но достать его из базы для обработки каким-нибудь консольным xquery процессором - запросто.

Но я бы предпочел не xml, а автоматически сгенеренную при компиляции строго типизированную схему для логов, тогда чистым SQL можно будет анализировать все что в голову придет.

Date: 2009-04-26 05:15 pm (UTC)
From: [identity profile] madeveloper.livejournal.com
А что если "бросать" в качестве эксепшенов сами объекты или в объекте-эксепшене ссылку на них? И в обработчике раскладывать их по полям таблиц (на основе метаданных языка, хотя не со всеми прокатит)? Конечно матаданные в БД разрастутся, зато все под рукой...

Date: 2009-04-26 05:19 pm (UTC)
From: [identity profile] madeveloper.livejournal.com
Кстати, пишу сейчас "тул" для генерации языковых классов на базе метаданных исходной БД и хранением там же. Что бы к объектам обращаться не через SQL или даже LINQ, а банальным вызовом конструкторов и доступом к типизированным атрибутам и методам, включая форейн-референсы. Готово для Delphi, сейчас начинаю делать для C#. Конечно пока не все реализовано, но все зависит от спроса. Есть интерес?

Date: 2009-04-26 06:20 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Это ж ORM классический, типа NHibernate. Уже неоднократно обсуждали, пришли к выводу, что не для всех случаев пригодно.

Например, если через такой API делать редактирование базы для юзеров - придется еще и прикручивать генератор GUI из метаданных класса, если делать запросы - опять же придется LINQ или что-то похожее вызывать. У NHibernate для таких целей есть собственный язык запросов (кривоватый), из которого SQL генерируется.

В общем, вещь наиболее подходящая, если нужно бизнес-логику сложную считать, используя объекты, чтобы для каждого объекта загрузчик руками не писать. Или если изначально есть цель напрямую с базой не работать, а изолироваться от нее и работать с объектами. [livejournal.com profile] arbinada про кошмары такого подхода неоднократно писал.

А беда вся от того, что у разных СУБД даже SQL разный, не говоря уже о его процедурных расширениях, где кто во что горазд пляшет.

Date: 2009-04-26 06:32 pm (UTC)
From: [identity profile] madeveloper.livejournal.com
Не, ну это уже в практику вошло. Только что-нибудь дельное придумаешь, оказывается это придумали задолго до тебя. С другой стороны, существующие решения не подходят по многим причинам (контроль на стадии начала выполнения, языковая распространенность).

Генератор GUI прикручивать не обязательно, я реализую DataSource автоматически (для Delphi). Более того, уже автоматически реализуются и GUI, но не в виде отдельных класов, а в виде единственного класса формы для редактирования моих объектов.

Date: 2009-04-26 06:50 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Я такое тоже делал (автоматическая генерация GUI), но в итоге всегда упираюсь в то, что реализация некоторых вещей оказывается сложнее, чем их руками нарисовать в дизайнере.

Date: 2009-04-26 07:06 pm (UTC)
From: [identity profile] madeveloper.livejournal.com
У меня тоже GUI не было самоцелью, но 30% USER GUI оно, как ни странно, закрыло. Самоцелью был контроль соответствия структур, когда проверка идет на стадии компиляции и выполнения, а также способ доступа из языка без использования конструкций типа ('DEPT_ID').AsInteger, а нормального обращения к типизированным свойствам, включая ссылочные. А вопрос сложнее/проще решается по месту, одно другого у меня не исключает. Хотя после написания такого framework'а я стал больше обращать внимания на бизнес-логику на стороне сервера БД, когда процедуры компиляться в свойства объектов, или реализуют наборы данных (вместе со view), которые я раньше вытаскивал SQL запросами.

Date: 2009-04-26 11:26 pm (UTC)
From: [identity profile] theiced.livejournal.com
За бизнес логику на стороне БД сразу отрывать яйца и садить в бочку с жабами.

Date: 2009-04-27 12:27 am (UTC)
From: [identity profile] http://users.livejournal.com/_windwalker_/
гг. зависит от ситуации. иногда её так реализуют для того, что бы оные яйца не оторвали и в бочку с жабами - не посадили.

Date: 2009-04-27 01:40 pm (UTC)
From: [identity profile] theiced.livejournal.com
Ситуацию описываем, да.

Date: 2009-04-27 01:40 pm (UTC)
From: [identity profile] theiced.livejournal.com
Я не могу ответить на этот вопрос. Потому что или человек сам понимает, или его уже ничего не спасёт.

Date: 2009-04-27 05:22 pm (UTC)
From: [identity profile] madeveloper.livejournal.com
Спасет от чего? И в чем принципиальная разница кода выполняемого сервером БД "не отходя от кассы" и кода, гоняющего трафик по сети и выполняемого на клиентской машине? Она если и есть, то не в пользу последнего. При принятии правил именования пакетов и процедур, либо введения метаданнх в БД, я имею возможность автоматически генерировать структуры хранимых классов с методами для выбранного языка программирования. Я могу вносить изменения в БЛ без перекомпиляции настольных приложений. Имею возможность сделать БД более безопасной, более настраиваемой в плане прав доступа. При этом аналитические задачи требуют в разы меньшего сетевого трафика и нагрузки на клиента. Я минусов не вижу вообще.

Date: 2009-04-27 06:26 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Не, сейчас мода вообще на клиентской машине ничего кроме браузеров не держать, а весь код выполнять на веб-сервере/сервере-приложений.
Я нечто похожее сейчас проектирую/делаю, но клиент немного более интеллектуальный, и таки, скорее всего, придется логику из БД убирать - хочу сделать поддержку разнообразных баз.
Но тем не менее, логика в виде сложных запросов-отчетов в виде SQL останется в базе - если это писать на каком-нибудь c# (LINQ у меня нет - влом к 3.5 фреймворку привязываться и деплоить его) или дельфи - кода будет как бы не больше, чем SQL-запросов во всех возможных диалектах :)

Date: 2009-04-27 07:16 pm (UTC)
From: [identity profile] madeveloper.livejournal.com
Я на поддержку разнообразных баз забил. Слишком много "вкусностей" предлагает тот же оракл, чтобы отказываться от них в угоду переносимости. Помню как переводили одну из первых версий системы с Interbase на Oracle. Причем система использовала практически голый ANSI SQL. Главный разработчик сказал что перенесем за пару недель (вобщем в BDE только драйвер сменить, да данные смигрировать). В итоге через год получили совсем другую систему...

Date: 2009-04-27 08:53 pm (UTC)
From: [identity profile] theiced.livejournal.com
Оракель? Вкусностей? Не - ну если кучу говна называть вкусностями - то да, предлагает.

Date: 2009-04-27 02:24 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Есть два противоположных мнения на этот счет. Первое - использовать СУБД и ее возможности по полной программе. Второе - изолироваться от нее слоем абстракции, а логику всю писать единообразно для всех баз.
Оба мнения обоснованные, сознательно и аргументированно выбрать между ними при реализации системы с нуля невозможно без предварительных данных.
Я бы предпочел третий вариант - писать структуры данных и логику единую для всех баз, а затем компилировать их в конкретный диалект SQL и структуры данных конкретной СУБД, но это безумие и оверкилл для 99% моих проектов, т.к. сложность реализации такой вещи перекрывает все сложности с ручной реализацией достаточного для работы функционала на одной или даже нескольких реально нужных СУБД.

Date: 2009-04-27 03:25 pm (UTC)
From: [identity profile] theiced.livejournal.com
СУБД должна уметь сохранять данные отдавать их. Логика в СУБД нарушает KISS.

Date: 2009-04-27 04:41 pm (UTC)
From: [identity profile] metaclass.livejournal.com
В сложных системах часто бывает не один клиент к СУБД, и хотелось бы, чтобы бизнес-правила нельзя было нарушить, даже подключившись напрямую родной утилитой от СУБД к базе. И чтобы подобные действия писались в лог. А это без логики на стороне СУБД вообще не делается.

Date: 2009-04-27 08:51 pm (UTC)
From: [identity profile] theiced.livejournal.com
Ну - тогда мидлваре - хренотень которая принимает запросы (причём уже не говносикль запросы, а нечто более высокоуровневое, предметноориентированное) и отдаёт данные.

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 25th, 2025 09:45 am
Powered by Dreamwidth Studios