Обратная связь
×

Обратная связь

Оптимизированное программирование

  • 1,7
  • 298
  • 2

Программистам в помощь,

чтобы программный код

разрабатывался быстрее и качественнее

Введение или программистская лень

Многие программисты по своему характеру очень ленивы, одни при появлении новой задачи от пользователей сообщают о невозможности ее решить или всячески оттягивают срок ее выполнения или опять же, выполняют, но очень некачественно, без должного внимания к деталям. Другая категория программистской лени, именно о ней мы и будем говорить, это лень делать одну и ту же вещь дважды, они вместо простого извлечения информации из таблицы базы данных с помощью запроса из двух строк за 2-3 минуты, стараются тратит времени в 5-6 раз больше — создают отдельный отчет и передают его пользователю, чтобы пользователь сам формировал этот отчет и программиста больше не отвлекал. И это правильно, ведь программисты для того и работают чтобы автоматизировать рутинные процессы. Но к сожалению, чаще программистов используют неправильно, равно как и программисты ведут себя не совсем как програмисты: позволяют затянуть себя в пучину: «вытащи данные», «поставь заплатку», «открой доступ» и так далее. Я отношу себя к ленивым программистам второй категории, и именно о своих подходах в автоматизации хочу вам рассказать.

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

Статья ориентирована не на широкий круг читателей, а на программистов, строящих бизнес ориентированное программное обеспечение.

Мета информация

«Метаинформация — знания о местонахождении информации,

рассредоточенной в распределенных БД, различные оценки этой

информации, описание источников и времени её формирования,

достоверности, регламента и процедур её получения пользователем»

Зачем же нам хранить лишнюю информацию, скажете вы, я и так знаю где и как хранятся данные в таблицах, зачем же их описывать, но все же давайте рассмотрим простой пример запроса пользователя: «Хочу вот такой и такой отчет». Чаще всего происходит следующим образом: программист получив запрос, сообщит о том что сделать это будет чертовски сложно, да и загружен он сильно, но в конечном итоге «нарисует» запрос, многократно обращаясь к пользователю за деталями, передаст итог пользователю, не сохранит запрос или в лучшем случае все же сохранит запрос, назовет его «отчет для …» и благополучно забудет про него и все! Следующий подобный запрос потребует точно таких же мучений, как пользователя, так и сильно занятого программиста. А ведь все можно было бы сделать совсем немного по другому, чтобы облегчить жизнь обоим мученикам. Достаточно было бы сохранить запрос в доступном для обоих месте в файловом хранилище вашей корпоративной сети, или в подобном месте, куда имеют доступ все, и это место никто не забудет, и придать сохраненному отчету понятное имя, чтоб его мог идентифицировать и пользователь и программист. Все! Далее пользователь перешлет программисту этот запрос по почте и попросит его запустить. И все счастливы. Вот таким образом мы уже храним мета информацию и она нам здорово помогает, т.е. как написано в определении, мы храним знания о местонахождении информации, рассредоточенной в БД. И это только начало. Поверьте мне.

Их же сотни, этих отчетов …

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

Создание формы, с помощью которой пользователь будет вводить входящие параметры, нажимать кнопку «Открыть», или «Сохранить в Excel» и т… д., на мой взгляд это самая не интересная и рутинная часть работы, и в то же время, такое получается чаще всего, самая долгая, поскольку большая часть отчетов сводится к запросу к 3-4 таблицам, ведь мы же знаем что, где и как хранится в наших таблицах.Создание выходной формы, описание столбцов, или прописывание их в каком-либо шаблоне, у всех все по разному, но смысл тот же, ведь нужно описать как будет выглядеть будущий отчет. Тоже достаточно скучная работа и лично для меня наиболее трудоемкая.И вот мы подошли именно к сути отчета: формирование запроса к базе данных, тут все понятно. Как мне кажется это наиболее интересная часть работы, поскольку в глубине душе после отображения правильных данных на экране, мы считаем что отчет готов.Далее нам необходимо «прикрутить» собранный отчет к нашей системе, вывести меню для него, для более сложных систем, прописать уровень доступа и т.д. Все это тоже занимает время.

А представьте, что нам нужно создать такой отчет не один, а десятки, а в крупных организациях — сотни, и что же мы получаем в итоге. Конечно, применив кучу усилий мы их создадим, но чаще всего у нас получается «зоопарк»: при таком объеме очень часто в построении этих отчетов учавствует не один программист, все пишут по разному, да и что говорить, один и тот же программист похожие участки порой программирует разными способами, мы же художники в своем роде, любим чтобы все было необычно. А как их потом сопровождать, эту кучу отчетов, только добавление нового параметра в отчет займет уйму времени. Не знаю как вам, но мне было бы лень идти этим путем.

Из всех вышеописанных шагов, только один требует большого внимания, это именно результат этого шага определяет судьбу отчета. А все остальное – рутина. Так давайте же эту рутину автоматизируем, и доведем процесс создания нового отчета до написания собственно запроса с описанием, не программированием, а именно описание всех остальных этапов.

Способов реализации этого подхода сотни, если не тысячи, опишу вам то, как сделал я.

Не зря в предыдущей главе мы говорили о метаданных, именно благодаря им, я все и построил.

Взгляните на структуру таблиц ниже. Хватает двух таблиц, чтобы хранить необходимую нам информацию. Для упрощения, несколько полей я удалил из схемы, чтобы вас не путать и не пугать, далее мы сможем усложнить, но для начала этого достаточно:

 

Давайте пойдем по тем же пунктам, которые необходимо пройти для построения отчета обычным способом, и найдем им соответствующее оптимизированное решение используя наши две таблицы:

1. Начнем с открытия формы или страницы, зависит от того, какую технологию вы используете, я использовал ASP.NET и соответственно конечный продукт у меня получился под ВЕБ. Для простоты давайте форму, как и страницу, будем называть формой. При открытии нашей формы в качестве параметра мы должны передать ей идентификатор отчета, который мы хотим открыть (таблица PROGRAMS, поле PROGRAM_ID).

И вот форма открывается, что же мы должны сделать?

  • Первое что мы должны сделать, так это нарисовать в заголовке наименование отчета. Заголовок мы можем извлечь из таблицы PROGRAMS, ведь у нас уже есть идентификатор отчета: select program_name from programs where program_id = 1Далее мы должны вывести входящие параметры. Информацию обо всех наших параметрах мы храним в таблице PROGRAM_FIELDS. Идентифицировать поля нашего отчета мы сможем по полю PROGRAM_ID:

 

 

select * from program_fields

where program_id = 1and visible=’yes’

and type_id = ‘param’ order by order_no

 

 

 

Результат от работы этого запроса поможет нам построить на форме элементы управления для ввода

входящих параметров отчета. Я предполагаю, что читатель знаком с программированием не понаслышке и имеет

представление о динамическом создании элементов управления. Мы получили следующие поля:

— field_name – ну тут все понятно, наименование поля

— mandatory определение, является ли поля обязательным для заполнения

— visible – определение, отображать ли поле или нет

— phys_field_name – в этом поле мы храним наименование параметра, который хранится в запросе

— type_id – это у нас тип, в нашем случае нам нужны записи с типом ‘param’, тип ‘output’ нам пригодится немного

позже

— order_no — в этом поле мы храним информацию о сортировке, т.е. определяем какое поле будет первым, и т.д.

У нас есть все исходные данные для построения элементов ввода параметров. Я думаю для опытного программиста не

составит труда написать код, который в цикле создаст все элементы управления нашего отчета.

 

  • Теперь необходимо «прикрутить кнопку «Запустить отчет». Кнопку можно и не «прикручивать», можно ее разместить заранее. Главное «прикрутить» к ней обработчик, который из динамически созданных элементов управления извлечет введенные значения, из таблицы PROGRAMS извлечет запрос (select report_sql from programs where program_id = 1) и подменит параметры на реальные значения. Второй задачей является уже отправка запроса на открытие отчета. У нас уже есть готовый запрос, с подмененными параметрами, это уже полдела, следующим этапом, описанным ниже, мы выведем результат работы запроса пользователю на экран.

2. Для конечного пользователя важно увидеть результат в удобочитаемом виде, именно созданием удобочитаемого вида мы сейчас и займемся. На этом этапе нам снова пригодится умение динамически создавать элементы управления, в данном случае это столбцы таблицы. Для получения списка полей нам достаточно выполнить следующий запрос:

 

 

select * from program_fields

where program_id = 1and visible=’yes’

and type_id = ‘output’ order by order_no

 

Полученный результат мы используем для построения столбцов, хотел бы обратить ваше внимание на поле phys_field_name, в нем хранится наименование поля из запроса. Далее создаем источник данных, передаем в него полученный на предыдущем этапе запрос и запускаем отчет!

3. Этот этап не меняется, но все также необходимо создать запрос, отладить его и все.

4. Механизм «прикручивания отчета» к вашей информационной системе заслуживает отдельного внимания и отдельной статьи. Тут я могу лишь сказать, если вы проектируете инфраструктуру вашей системы самостоятельно, имеет смысл применить точно такой же подход, хранить элементы меню в таблицах и динамически их создавать при запуске вашего приложения. В дальнейшем это вас избавит от необходимости написания многократно повторяющегося кода.

Выводы

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

 

Теги: технологии , программирование

2 комментария

2302 maximpassukhin
25 июня 2012, 14:10