|
||||||
|
||||||
|
В этом разделе собраны мои статьи, а также есть ссылки на чужое творчество. Статьи не отсортированы по темам, это просто моя записная книжка. Если найдёте в них для себя что-то полезное - буду только рад.
Использование препроцессора С при проектировании.
Нередко прикладная задача плохо формализуется. Как правило, это происходит тогда, когда изначально в проект не была заложена определённая идеология и его развитие "исторически" протекало спонтанно и бессистемно. Появилось требование заказчика - добавили новый тип данных. Для конкретных целей для реализации этого обычно появляются тучные стада операторов if или switch. В каждом отдельном случае это не тяжело и не страшно, но со временем код становится совершенно нечитаемым.
Также произошло и у меня - я столкнулся с системой, которая на тот момент существовала уже три года, состоявшей почти из одних if-ов. Пришлось разбираться, однако "наводить порядок" в идеологии я не мог т.к. часть системы уже была "в железе" и стояла у заказчиков. Мне пришлось приводить исходный код своей подсистемы в простой и удобочитаемый без изменения остальных компонентов комплекса. Для этого были выполнены следующие этапы:
#undef ADDUS_PM #define ADDUS_PM(c1k,typ,name,dim,dec,min,max,sign) \ case c1k: \ { \ CUSet uSet(iOffset+offsetof(GS_USETITEM,wValue), \ c1k,typ,name,dim,dec,min,max,sign); \ uSet.AddDesc(0,_T("ОТКЛ")); \ uSet.AddDesc(1,_T("БЛОК")); \ uSet.AddDesc(2,_T("АПВ")); \ m_arrUSet.Add(uSet); \ } \ break;Это позволило сделать вполне читаемыми блоки добавления и последующего анализа большого количества параметров, примерно такого вида:
ADDUS(wUv388,388,CUSet::E_NUM,_T("Время срабатывания РЛ1"),_T("с"),0,0,600,FALSE); ADDUS_PM(wUv514,514,CUSet::E_NUM,_T("Режим защиты Rиз"),_T(""),0,0,0xffff,FALSE); ADDUS(wUv390,390,CUSet::E_NUM,_T("Время срабатывания обрыв фаз"),_T("с"),0,0,9999,FALSE);
#define ADDDN(txtDesc,txtShot,txtDim,eGR,fmin,fmax,nam,clrRgb) \ m_arrColumnFN.Add(CRLogFN(txtDesc,txtShot,txtDim,eGR,fmin,fmax, \ UPI_STR_JEVENT_9::GetDbl_##nam##,UPI_STR_JEVENT_9::GetStr_##nam##, \ clrRgb));В результате описания информационных полей стали занимать одну строчку и могли уже не вызывали приступов головной боли и ночных кошмаров:
ADDDN(_T("Полная мощность"),_T("Pполн"),_T("кВт"),CG_POW,0.,1638.3,PowFull,RGB(140,70,210)); ADDDN(_T("Сигнал аналогового входа №1"),_T("Ан1"),_T(""),CG_AN,0.,1638.3,AnalogInp1,RGB(0,70,70)); ADDDN(_T("Сигнал аналогового входа №2"),_T("Ан2"),_T(""),CG_AN,0.,1638.3,AnalogInp2,RGB(70,0,70));
switch (refUsi.wCode1024) { #include "RLogFile09.inc" }При этом совсем макросы в любой момент можно отменить директивой #undef и определить другие, которые нужны в данный момент.
Про CUI и терминальные системы.
Некоторые склонны считать, что терминальные системы устарели много лет назад и что пользовательский интерфейс "зелёными буквами по чёрному фону" уже не способен удовлетворить никаких потребностей. Тех, кто так думает могу сразу огорчить - это заблуждение. Текстовый монохромный интерфейс является действительно самым старым, но задачи, для решения которых он возник, за 30-40 лет изменились ещё меньше. Перечислю некоторые из систем, действующих и сегодня:
На терминальных системах таких проблем нет - туда не поставить ворованный PhotoShop, не установить "Тетрис", нет опасности подцепить какую-нибудь заразу. Как правило, в них сразу после логина и пароля выходит рабочая программа и выход из неё означает закрытие сессии. Так "с какого перепуга" компании 1С, к примеру, понадобилось создавать свою "1С:Бухгалтерию" с графическим интерфейсом?! Там что, графика нужна? Это же не САПР, деньги цифрами всегда показывают.
Зачастую многие технологии являются сегодня забытыми совершенно незаслуженно. Текстовые терминальные системы имеют право на существование гораздо чаще, чем это происходит сейчас. Их проще разрабатывать и сопровождать, это безопаснее и это, наконец, дешевле. Причём, это совершенно не означает, что нужно обязательно строить их на базе одной из ветвей UNIX - необходимые средства есть под любой серьёзной ОС, даже win32.
Статьи других авторов.
http://www.joelonsoftware.com | Джоель Спольски (Joel Spolsky). Сборник великолепных статей о культуре программирования и о многом другом. Очень рекомендую прочитать. |
http://www.cfin.ru/ | Константин Берлинский. Как добиться успеха в безнадежных проектах. Хороший анализ и готовые советы для планирования, снабжённые фактическими данными и замерами времени. Особенно наглядны потери времени при неверной организации коммуникаций. |
http://itblogs.ru/blogs/itlife/ | Блог опытного программиста. Масса полезного опыта, который вдобавок просто интересно читать. |
http://proklondike.com/ | Статья о повадках и особенностях заказчиков. Очень хорошо описаны основные проблемы взаимодействия, остальные материалы сайта тоже очень даже интересные. |
http://www.proces.biz/Reingeneering/ | Хороший ресурс о реинжиниринге бизнес-процессов. Предназначено для руководителей предприятий. Остальным может быть полезно для подготовке к беседе с руководителем. |
http://forum.insidepro.com/ | С-шные трюки от "мыщъх'а". На первый взгляд, это не совсем имеет отношение к теме, но здесь приводятся очень интересные приёмы, некоторые из которых применять совсем не нужно! Эти приёмы часто способны сделать Ваш код менее читаемым и всё это со временем приведёт к... необходимости досрочно провести реинжиниринг. |
http://www.rsdn.ru/article/baseserv/apicallsintercepting.xml | Методы перехвата API-вызовов в Win32. Это должен знать каждый! |
http://www.edgeofnowhere.cc/viewtopic.php?p=2483118 | Ещё одна прекрасная статья по внедрению своего кода в чужой :-) |
http://www.codejock.com/support/articles/mfc/general/g_7.asp | Использование полноцветных (24 бита) икон в toolbar-ах при написании программ на MFC. Небольшая, но очень полезная статья, особенно для тех, кто продолжает использовать старые версии Visual C++. |
© Пчелинцев А.В. 2009-2011. Использование материалов допускается только с разрешения автора.