Здравствуйте yvb, Вы писали:
yvb>Вот говорят, что в C/C++ не настоящие модули, yvb>а просто включение текста. А что такое yvb>"настояшие" модули ? Вроде бы в ADA они и в yvb>Modula2.
Что такое в твоем понимании настояцие модули?
Модуль в C++ обычно состоит из 2 файлов
.h в котором находится описание для
компилятора(у какой функции сколько параметров
и какие) и файла в котором содержится сама
функция. Тот второй файл может быть cpp,
obj, или lib(lib это несколько obj склееные вместе).
если модуль в obj или lib то он не компилится
повторно т.к. уже компиленый что сильно сокращает
время сборки.
В таких языках как Delphi эти 2 файла склеены в 1.
(это на самом деле не всегда удобно) то что в Delphi
interface это как бы первый файл а implementation — второй
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Anatolix, Вы писали:
A>Модуль в C++ обычно состоит ....
Спасибо за ответ. Но это мне все известно.
Есть в программировании понятие
"модульное программирование". И вроде бы C++
такую технологию поддерживает. Но мне приходилось
не один раз слышать, что вот дескать в C++
"не настоящие" модули. Т.е. люди хотели сказать,
что C++ не на 100% поддерживает модульное программирование.
Например в форуме C/C++ в топике "Макрос, работающий только для данного класса"
не один раз высказывалось, что в C++ не хватает (настоящих) модулей.
Об этом был мой вопрос.
Здравствуйте yvb, Вы писали:
yvb>Здравствуйте Anatolix, Вы писали:
yvb>не один раз высказывалось, что в C++ не хватает (настоящих) модулей. yvb>Об этом был мой вопрос.
Это мнение классика(Бьерн страуструп). Да
действительно #define переходит границу модуля программирования.
Но это просто одно из средств, #define лучше вообще не использовать,
если не уверен. Их заменяют шаблоны и инлайновые функции.
Б.С. В следующей редакции C++ хочет чтобы #define не выходил
за пределы .h(из книжки дизайн и эволюция C++).
Но непонятно будет это сделано или нет. Слишком много
кода написано.
Что по поводу общего ответа C++ поддерживает модули
(не смотря на #define Его вконце концов можно
и отменить #undef в конце модуля.)
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте yvb, Вы писали:
yvb>Но мне приходилось не один раз слышать, что вот дескать в C++ "не настоящие" модули. yvb>Т.е. люди хотели сказать, что C++ не на 100% поддерживает модульное программирование. yvb>Например в форуме C/C++ в топике "Макрос, работающий только для данного класса" не один раз высказывалось, что в C++ не хватает (настоящих) модулей. yvb>Об этом был мой вопрос.
Модульное программирование — это принцип, технология, точно также, как и структурное программирование. То, что C/C++ поддерживает их, а не исповедует, известно. Кто-то считает это за благо, кто-то нет.
Однако эта поддержка помогает мне (и не только в работе программиста), и я опираюсь на эту поддержку в своей работе.
"Главное не в дорогах, которые мы выбираем, а в том в нас, что заставляет нас выбирать эту дорогу" (произвольно из О.Генри).
Здравствуйте yvb, Вы писали:
yvb>Вот говорят, что в C/C++ не настоящие модули, yvb>а просто включение текста. А что такое yvb>"настояшие" модули ? Вроде бы в ADA они и в yvb>Modula2.
Вообще говоря, модулями являются и класс, и процедура, и пространство имен.
Если не ошибаюсь, модуль — это сущность, к которой можно обращаться по имени, его семнтика не зависит от того, кем он используется, считается, что модуль инкапсулирует нечто и предоставляет клиентам интерфейс для доступа к этому нечто. модуль — механизм наведения структуры.
Понятие модуль очень широкое, и говорить, что есть ненастоящие модули, бессмысленно. Модули различаются размером, связностью, сцеплением с другими модулями, рутинностью и еще много чем.
Так же бессмысленно говорить о "настоящей" персистентности.
Имеет смысл лишь говорить о том, чем различаются средства поддержки модульности в различных языках.
В С++ основные средства поддержки модульности: классы, пространства имен.
IMHO .h и .cpp файлы — не предназначены для поддержки модульности (не являются именованной сущностью), а лишь срество декомпозиции программы. Другое дело, что многие придерживаются правила "один модуль (класс) — пара .h и .cpp файлов". Но в отличии от Java оно нигде не узаконено. IMHO это хорошо.
Здравствуйте Anton V. Kolotaev, Вы писали:
AVK>Здравствуйте yvb, Вы писали:
yvb>>Вот говорят, что в C/C++ не настоящие модули, yvb>>а просто включение текста. А что такое yvb>>"настояшие" модули ? Вроде бы в ADA они и в yvb>>Modula2.
AVK>Вообще говоря, модулями являются и класс, и процедура, и пространство имен. AVK>Если не ошибаюсь, модуль — это сущность, к которой можно обращаться по имени, его семнтика не зависит от того, кем он используется, считается, что модуль инкапсулирует нечто и предоставляет клиентам интерфейс для доступа к этому нечто. модуль — механизм наведения структуры.
Все-таки помоему модуль это единица трансляции. Т.е. если
ты поменял одну букву в программе и она вся перекомпилилась
сначит она не модульная. А если перекомпилилась часть то
модульная.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Anatolix, Вы писали:
A>Все-таки помоему модуль это единица трансляции. Т.е. если A>ты поменял одну букву в программе и она вся перекомпилилась A>сначит она не модульная. А если перекомпилилась часть то A>модульная.
Я могу изменить одну букву в foo.h, который используется во всем проекте, перекомпилится вся прога. Значит, это уже по определению не будет модульный проект?
Разбиение на файлы — это ведь физическое разбиение программы, а не логическое.
Здравствуйте Anatolix, Вы писали:
A>Все-таки помоему модуль это единица трансляции.
Сейчас нет со мной умной книжки (О. Одинцов "Профессиональное программирование"), но все-таки мне кажется, что единица трансляции в С++ — не модуль (в отличии от многих других языков). Если не ошибаюсь, есть такое понятие, как "аксиомы модульности Коуэна".
С другой стороны, мы ведем спор про то, что является модулем. Учитывая свободу в выборе определений, споры об определениях иногда бесплодны.
A> Т.е. если A>ты поменял одну букву в программе и она вся перекомпилилась A>сначит она не модульная. А если перекомпилилась часть то A>модульная.
Это одно из возможных свойств модульной архитектуры. Кстати, Др. Б.С. многое говорил о его важности в С++.