четверг, 24 июля 2008 г.

Многоблирование информации...

Копипастинг зло... все это знают. Грамотные программисты никогда не копируют код просто так. Но даже без явного копипастинга нас окружают многочисленные дублирования информации.

Где-то у меня была прикольная закладочка.. а, вот она - Copy/Paste detector. Но я хотел написать немного о другом.

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

Но даже если инклюдить сишники достаточно бессмысленно, то можно генерировать инклюды на основе сишников. :) Логика генерации нужна конечно достаточно наворочанная, но ведь компьютеры и должны работать. Вообще при постановке задачи не стоит думать о технических сложностях с реализацией. Это мешает и ограничивает воображение.

Когда-то файлы библиотек создавались с таким расчетом, чтобы в одном объектном модуле была одна функция. При связывании выполняемого модуля из библиотеки извлекается исключительно то, что необходимо. Но ведь никому не охота для каждой мизерной функции писать отдельный си-файл. Да и не удобно это. Поэтому библиотеки стали набиваться гигазами объектников, неоптимально это. Я тут вынашиваю мысли на тему делить большие сишники на маленькие, компилировать и пихать в библиотеку. Естественно все это должно производиться в автоматическом режиме в процессе сборки. И тестировать модули индивидуально удобнее. Глобальное тестирование неизбежно натыкается на ограничения областей видимости и тд. Но я хотел написать не об этом...

Ковыряюсь тут с одним старым проектом, ошибки исправляю. Хотя весь этот проект представляет из себя одну большую ошибку, которая собирается полтора часа, а функциональности в ней и на 5 минут не наберется. Хотя то, о чем я хочу написать свойственно многим проектам MSVC. Одна из ошибок очень явно это высветила - в одном месте указан старый телефон компании. Начал выяснять где... Для этого пришлось поставить InstallShield, ибо данная информация хранилась в инсталляторе. Телефон больше нигде не хранился, а вот название компании, версия продукта помимо инсталлятора хранится еще и в ресурсах каждого модуля (как я не люблю ресурсы), в диалогах в виде статического текста, иногда в самом тексте программ. Не удивительно что версии везде указаны разные, а название компании в разных формах.

Любую информацию необходимо указывать единожды. Правда я с трудом представляю как это можно сделать в условиях MSVC.

Вот собственно и все, о чем хотел написать.

1 коммент.:

coff комментирует...

Идея генерировать заголовочный файл на основе C-кода хороша. Можно пойти еще дальше - генерировать сразу прекомпилированные заголовки. Только вот что с макросами и константами делать, не понятно. Причем я не думаю, что логика генерации очень навороченная... парсер, пропускающий тела функций и обращающий внимание на заголовки. Работа на день, нет? Надо как-нибудь будет это сделать ради интереса.

Хотя то, о чем я хочу написать свойственно многим проектам MSVC
То, что ты написал - это проблема невнимательности человека и/или нежелания нормально делать свою работу. Проблемы собственно MSVC совсем в другом :-)

а вот название компании, версия продукта помимо инсталлятора хранится еще и в ресурсах каждого модуля
Да, version info. А ты как хотел? Инсталлятор должен обладать информацией о версии продукта, копирайте и пр.

как я не люблю ресурсы
Да, ресурсы - не всегда удобная весчь, это да. Альтернативы?

в диалогах в виде статического текста, иногда в самом тексте программ
:-D да да дело в MSVC ))) Или в человеке? Строки в тексте проги при наличии ресурсов - это явная ошибка. Кто-то спустя рукава сделал работу, другой его не проверил, и все... виноват кто-то третий?