Совмещение библиотеки WTL с БД
Пожалуйста, поделитесь опытом, я думаю, всем будет интересно.
Я еще ни на одном форуме не видел обсуждения больших проектов. Мне (да и не только мне) было бы интересно узнать у специалистов (и не только), как строятся большие проекты (которые работают с базами данных (access например), Интернетом, имеют многоязычный интерфейс…). Меня интересует именно организация классов, функций в этих классах, глобальных функций и переменных, макросов, dll, ресурсов наконец (например, в проекте много битмапов, как их лучше хранить в длл или …?).
Пожалуйста, поделитесь опытом, я думаю, всем будет интересно.
Если большой проект работает с access - это плохой проект. Как ты себе представляешь организацию классов, универсальную для всех больших проектов? Любой ресурс можно хранить в dll, но для этого не надо быть профессионалом. Многоязыковая поддержка также осуществляется с помощью dll.
Если большой проект работает с access - это плохой проект. Как ты себе представляешь организацию классов, универсальную для всех больших проектов? Любой ресурс можно хранить в dll, но для этого не надо быть профессионалом. Многоязыковая поддержка также осуществляется с помощью dll.
Хорошо, а в какой базе данных лучше организовать хранение информации????? (если это mysql – то для ее работы необходима дополнительная dll, да и вообще эта БД больше подходит для web).
А что касается универсальности, так это я про глобальные функции и переменные, например мой друг, вообще не признает глобальных переменных, а в место них использует макросы (хорошо это или плохо?). А с функциями он вообще круто разделался, они все у него в dll запрятаны (хорошо это или плохо?).
Да, и на счет контролов, я хотел узнать, что лучше контрол в ocx или как отдельный класс?
Хорошо, а в какой базе данных лучше организовать хранение информации????? (если это mysql – то для ее работы необходима дополнительная dll, да и вообще эта БД больше подходит для web).
А что касается универсальности, так это я про глобальные функции и переменные, например мой друг, вообще не признает глобальных переменных, а в место них использует макросы (хорошо это или плохо?). А с функциями он вообще круто разделался, они все у него в dll запрятаны (хорошо это или плохо?).
Да, и на счет контролов, я хотел узнать, что лучше контрол в ocx или как отдельный класс?
Я что-то не понял связи с первым твоим вопросом.
Ты хочешь узнать, как управляются большие проекты?
Так это вопрос по управлению (смотри MSF, XP, RUP).
Ты хочешь узнать построение и архитектуру больших проектов?
Так это вопрос по архитектуре (смотри OOA&D, в т.ч. шаблоны проектирования).
Если же тебя интересуют большие проекты с точки зрения программиста, то это не сильно отличается от программирования любых других проектов.
Что ты подразумеваешь под "большим проектом"? Как ты разделяешь проекты на "большие" и "небольшие"? По каким критериям?
На счет баз данных. Серьезный проект не должен быть жестко привязан к использованию конкретной СУБД. Иначе это показатель плохой проектировки. Т.о. это вопрос архитектуры.
По поводу глобальных переменных и функций. Глобальность относительное понятие. Глобальный относительно всего проекта или отдельно взятого модуля?
Глобальность относительно всего проекта может осуществлятся только с помощью глобальных объектов-одиночек (singletone). Это так же вопрос архитектуры.
Глобальные объекты внутри модуля - это плохой стиль программирования. Т.о. это вопрос программирования.
Глобальные функции в действительности необходимы лишь изредка для каких-то обобщенных операций, например, вычисление синуса, получение типа ОС и т.п. В большинстве же случаев глобальные функции на самом деле тесно связаны с определенным классом данных и т.о. должны быть методами соотв. классов.
По поводу использования макросов как глобальных переменных, я что-то не представляю, как макрос может испеользоваться как переменная... :)
Избыточное использование макросов - это тоже плохой стиль. Они оправданы в основном при написании многоплатформенных приложений, когда необходимо подключать различные участки кода и использовать различные типы для различных платформ.
По поводу DLL. Их применение может быть обосновано повышением гибкости конфигурации уже готовой системы (например для введения плагинов, поддержки многоязычных интерфейсов или же для возможности усовершенствования системы по-модульно в будущем), при использовании сторонних библиотек (например win32, DirectX и т.п.).
Просто же прятать же функции в dll - это не круто. :)
Это усложняет и замедляет процесс загрузки приложения, усложняет процесс обращения к этим функциям в программе, усложняет код для понимания и рефакторинга.
Я что-то не понял связи с первым твоим вопросом.
Ты хочешь узнать, как управляются большие проекты?
Так это вопрос по управлению (смотри MSF, XP, RUP).
Ты хочешь узнать построение и архитектуру больших проектов?
Так это вопрос по архитектуре (смотри OOA&D, в т.ч. шаблоны проектирования).
Если же тебя интересуют большие проекты с точки зрения программиста, то это не сильно отличается от программирования любых других проектов.
Что ты подразумеваешь под "большим проектом"? Как ты разделяешь проекты на "большие" и "небольшие"? По каким критериям?
На счет баз данных. Серьезный проект не должен быть жестко привязан к использованию конкретной СУБД. Иначе это показатель плохой проектировки. Т.о. это вопрос архитектуры.
По поводу глобальных переменных и функций. Глобальность относительное понятие. Глобальный относительно всего проекта или отдельно взятого модуля?
Глобальность относительно всего проекта может осуществлятся только с помощью глобальных объектов-одиночек (singletone). Это так же вопрос архитектуры.
Глобальные объекты внутри модуля - это плохой стиль программирования. Т.о. это вопрос программирования.
Глобальные функции в действительности необходимы лишь изредка для каких-то обобщенных операций, например, вычисление синуса, получение типа ОС и т.п. В большинстве же случаев глобальные функции на самом деле тесно связаны с определенным классом данных и т.о. должны быть методами соотв. классов.
По поводу использования макросов как глобальных переменных, я что-то не представляю, как макрос может испеользоваться как переменная... :)
Избыточное использование макросов - это тоже плохой стиль. Они оправданы в основном при написании многоплатформенных приложений, когда необходимо подключать различные участки кода и использовать различные типы для различных платформ.
По поводу DLL. Их применение может быть обосновано повышением гибкости конфигурации уже готовой системы (например для введения плагинов, поддержки многоязычных интерфейсов или же для возможности усовершенствования системы по-модульно в будущем), при использовании сторонних библиотек (например win32, DirectX и т.п.).
Просто же прятать же функции в dll - это не круто. :)
Это усложняет и замедляет процесс загрузки приложения, усложняет процесс обращения к этим функциям в программе, усложняет код для понимания и рефакторинга.
Вместо макросов лучше использовать inline функции, если только это не контроль версий.
SQL на то и создавался, чтобы не привязываться к определенной БД с ее собственным языком.
Насчет глобальных переменных - можно хранить например hInstance в глобальной переменной, ну еще карту ресурсов для программы, например, в общем все, что гарантировано будет только одно в программе.
offtopic
Green
Насколько хорошо портируются программы, написанные с использованием WTL? То есть не глючат ли они под эмулятором винды в linux? Нет ли проблем с портированием под win64?
SQL на то и создавался, чтобы не привязываться к определенной БД с ее собственным языком.
В принципе верно, как вариант. Я же имел в виду, что непосредственное обращение к СУБД должно быть вынесено в отдельный модуль с однотипным интерфейсом для всех остальных модулей программы.
Насчет глобальных переменных - можно хранить например hInstance в глобальной переменной, ну еще карту ресурсов для программы, например, в общем все, что гарантировано будет только одно в программе.
Именно для того, что бы гарантировать единственность и вводится паттерн Singleton.
offtopic
Green
Насколько хорошо портируются программы, написанные с использованием WTL? То есть не глючат ли они под эмулятором винды в linux? Нет ли проблем с портированием под win64?
Я не знаю портируется WTL под Линукс вообще. Не встречал подобных портов. С эмуляцией могут быть проблемы, т.к. WTL завязан на небольшом хакерстве под названием Thunk. Это как раз то о чем мы с тобой общались в этом топике:
http://forum.codenet.ru/showthread.php?s=&threadid=18954
Все зависит от реализации эмуляции.
Находится это тонкое место WTL в файле atlbase.h класс _stdcallthunk. Посмотри, как он реализован для различных платформ.
Под win64 проблем быть не должно (опять же как это видно из реализации класса).
В принципе верно, как вариант. Я же имел в виду, что непосредственное обращение к СУБД должно быть вынесено в отдельный модуль с однотипным интерфейсом для всех остальных модулей программы.
Именно для того, что бы гарантировать единственность и вводится паттерн Singleton.
Я не знаю портируется WTL под Линукс вообще. Не встречал подобных портов. С эмуляцией могут быть проблемы, т.к. WTL завязан на небольшом хакерстве под названием Thunk. Это как раз то о чем мы с тобой общались в этом топике:
http://forum.codenet.ru/showthread.php?s=&threadid=18954
Все зависит от реализации эмуляции.
Находится это тонкое место WTL в файле atlbase.h класс _stdcallthunk. Посмотри, как он реализован для различных платформ.
Под win64 проблем быть не должно (опять же как это видно из реализации класса).
у меня так же вопрос по WTL, а именно - есть ли в этой библиотеке класс для работы с базами данных (типа CRecordset and CDatabase in MFC)? (вообще-то я не программист, я продавец ПО (но жизнь сами понимаете, заставляет, вот и кручусь с этими базами данных и клиентами под них (по крайней мере, самый востребованный продукт в средних слоях)))
у меня так же вопрос по WTL, а именно - есть ли в этой библиотеке класс для работы с базами данных (типа CRecordset and CDatabase in MFC)? (вообще-то я не программист, я продавец ПО (но жизнь сами понимаете, заставляет, вот и кручусь с этими базами данных и клиентами под них (по крайней мере, самый востребованный продукт в средних слоях)))
Исходя из названия "Windows Template Library", WTL не служит для обеспечения работы с СУБД.
Исходя из названия "Windows Template Library", WTL не служит для обеспечения работы с СУБД.
Да????????? А я в RSDN читал, что это супер-пупур библиотека для создания супер навороченных приложений (что это тогда за библиотека, если в ней нет даже поддержки работы с БД?????????).
Ладно, проехали, допустим все таки я хочу использовать ее в качестве обертки над API, как тогда быть с БД, ведь в API есть средства для работы с ними? (ну конечно есть, просто я про них ничего не знаю). Может подкинешь идейку?
На счет глобальных переменных и макросов так это я имел в виду следующее:
#define PI 3.14
or
const int pi = 3.14
что на твой взгляд правильнее?
Еще мне очень интересно, что такое singletone?
И как его использовать, если мне надо чтобы число пи можно было бы использовать во всем проекте?
А самый большой интерес у меня вызвали твои слова: - “Я же имел в виду, что непосредственное обращение к СУБД должно быть вынесено в отдельный модуль с однотипным интерфейсом для всех остальных модулей программы”.
Что именно ты имел в виду под словом модуль, dll или …? И каким образом это можно реализовать? (если тебе не трудно)
Ну и конечно же по архитектуре проектов – где можно почитать?
Да????????? А я в RSDN читал, что это супер-пупур библиотека для создания супер навороченных приложений (что это тогда за библиотека, если в ней нет даже поддержки работы с БД?????????).
:D
Знаешь, даже самые супер-пупер телефоны, к примеру, не варят кофе и не пылесосят. Что это тогда за телефоны?
WTL - оконная библиотека, она служит для удобного создания оконных интерфейсов и только.
Для БД есть специальные библиотеки. Не спрашивай у меня какие, я давно этим не занимался.
Ладно, проехали, допустим все таки я хочу использовать ее в качестве обертки над API, как тогда быть с БД, ведь в API есть средства для работы с ними? (ну конечно есть, просто я про них ничего не знаю). Может подкинешь идейку?
В Win32 API нет средств для работы с БД.
Тебе надо найти специальные библиотеки для работы с СУБД.
На счет глобальных переменных и макросов так это я имел в виду следующее:
#define PI 3.14
or
const int pi = 3.14
что на твой взгляд правильнее?
Это не переменные, а числовой литерал и константа. Переменными их никак не назовешь потому, что они совсем непеременные, т.е. неизменяемые.
Использование в данном случае констант в С++ более предпочтительно.
Но в твоем примере константа pi определена неверно.
Еще мне очень интересно, что такое singletone?
И как его использовать, если мне надо чтобы число пи можно было бы использовать во всем проекте?
Пи - это константа, вот и используй константу.
Паттерн "одиночка" служит для создания глобальных ОБЪЕКТОВ в единственном экземпляре. Подробнее здесь:
http://ooad.asf.ru/patterns/patterninfo.asp?id=13
А самый большой интерес у меня вызвали твои слова: - “Я же имел в виду, что непосредственное обращение к СУБД должно быть вынесено в отдельный модуль с однотипным интерфейсом для всех остальных модулей программы”.
Что именно ты имел в виду под словом модуль, dll или …? И каким образом это можно реализовать? (если тебе не трудно)
Модуль в данном случае может быть чем угодно от DLL и COM(OLE) до объектного файла (OBJ) или просто класса.
Главное это инкапсуляция всей работы с СУБД внутри и абстрагирование остальной части проекта от конкретной СУБД путем предоставления типизированного интерфейса.
Ну и конечно же по архитектуре проектов – где можно почитать?
Можно почитать про паттерны "Приемы объектно-ориентированного проектирования. Паттерны проектирования" от "банды четырех" (Гамма, Хелм, Джонсон, Влиссидес).
Почитать статьи и описания паттернов на этом сайте:
http://ooad.asf.ru
Да????????? А я в RSDN читал, что это супер-пупур библиотека для создания супер навороченных приложений (что это тогда за библиотека, если в ней нет даже поддержки работы с БД?????????).
Ладно, проехали, допустим все таки я хочу использовать ее в качестве обертки над API, как тогда быть с БД, ведь в API есть средства для работы с ними? (ну конечно есть, просто я про них ничего не знаю). Может подкинешь идейку?
На счет глобальных переменных и макросов так это я имел в виду следующее:
#define PI 3.14
or
const int pi = 3.14
что на твой взгляд правильнее?
Еще мне очень интересно, что такое singletone?
И как его использовать, если мне надо чтобы число пи можно было бы использовать во всем проекте?
А самый большой интерес у меня вызвали твои слова: - “Я же имел в виду, что непосредственное обращение к СУБД должно быть вынесено в отдельный модуль с однотипным интерфейсом для всех остальных модулей программы”.
Что именно ты имел в виду под словом модуль, dll или …? И каким образом это можно реализовать? (если тебе не трудно)
Ну и конечно же по архитектуре проектов – где можно почитать?
Обычно для работы с СУБД используются COM/OLE объекты. Там указывается провайдер и строка соединения и дальше отправляются запросы SQL. То есть все это и так уже выполнено на самом абстрактном уровне. Остается только создать свой класс для своей БД.
Какая разница какую базу использовать ????
Это все мелочи и решения могут быть совсем разными.
Я бы вот начал с изучения UML и ERD и DFD (диаграммы сущности-связи и потоков данных)
Могу ошибаться в терминах, у меня смутные воспоминания :) Но вообще вещь. Крупный проект надо начинать именно с этого.
Посмотрите Rational Rose
Что то у вас совсем не о том пошел разговор. Какая разница, WTL, не WTL ?
Какая разница какую базу использовать ????
Это все мелочи и решения могут быть совсем разными.
Я бы вот начал с изучения UML и ERD и DFD (диаграммы сущности-связи и потоков данных)
Могу ошибаться в терминах, у меня смутные воспоминания :) Но вообще вещь. Крупный проект надо начинать именно с этого.
Посмотрите Rational Rose
Человек просто спрашивает сразу несколько вопросов: про WTL, про СУБД и про проект.
Я рассматривал эти вопросы как самостоятельные.
Что касается крупного проекта, то это вопрос слишком обширный, от управления до архитектуры и её реализации. Это не тема для данного форума.
Изучение UML для общего развития полезно, но на практике слабо применимо.
И вообще все эти диаграммы и т.п. общирная проектная документация - это пустая трата времени.
Я бы рекомендовал смотреть в сторону XP и ограничится использованием Class Diagram и Sequence Diagram в пределах листка бумаги и карандаша, ну и написанием требований и прецедентов (Use Case) одним-двумя предложениями.
Что касается Rose, то как и большинство продуктов Rational можно охарактеризовать одной фразой: "сапожник без сапог".
Задумка грандиозная, исполнение поганое, применительность нулевая.
Данный продукт, как и вся концепция UML, не для команды разработчиков, а для штата бюрократов.
Задумка грандиозная, исполнение поганое, применительность нулевая.
То-то IBM купил рейшнл, и встроил роус в свой всад :)
:D
Можно почитать про паттерны "Приемы объектно-ориентированного проектирования. Паттерны проектирования" от "банды четырех" (Гамма, Хелм, Джонсон, Влиссидес).
Почитать статьи и описания паттернов на этом сайте:
http://ooad.asf.ru
А можно каким ни будь способом совместить библиотеку WTL с БД? Я тут про нее много интересного в инете нарыл (в общем мне она понравилась больше чем MFC), было бы неплохо ее попользоваться. А за ссылку на сайт, спасибо!
Обычно для работы с СУБД используются COM/OLE объекты. Там указывается провайдер и строка соединения и дальше отправляются запросы SQL. То есть все это и так уже выполнено на самом абстрактном уровне. Остается только создать свой класс для своей БД.
Слушай, а как ты реализуешь свои средства работы с БД? (просто интересен подход опытного человека)
То-то IBM купил рейшнл, и встроил роус в свой всад :)
Вижу, не согласен ты с моим высказыванием. :)
Давай пройдемся по пунктам:
1. Грандиозность. Думаю спорить не будешь, что по-началу выглядит грандиозным идея нарисовать диаграммы и получить программный код (хотя бы структуру классов).
2. Исполнение. Ну глючная она, эта роза. Многое в GUI неудобно, многое запутанно. Про реверс-анализ (диаграммы из программного кода) я вообще молчу. Система с лицензиями тоже г. какое-то, хотя для пиратов удобное.
3. Применительность. Может, для таких фирм, как IBM, MS в применении Розы есть какой-то смысл из-за их огромного штата сотрудников, огромного документооборота, где не жалко времени на рисование и перерисовывание документации, которая к началу реализации будет уже устаревшей.
Но для большинства остальных фирм достаточно какого-нибудь Visio. А для небольших фирм, где не надо "гнуть пальцы" перед руководством и клиентами, вполе можно обойтись листком бумаги и карандашем, да парой строк в Change Request.