Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, AK1801, Вы писали:
AK>>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")
A>"" — убрать, '/' заменить на ',' , использовать boost.preprocessor A>возможно удастся переопределить '/' и использовать его вместо запятой
Спасибо за дельный совет. Но завязывать такой простецкий декор на
целый буст — это, мне кажется, оверхед.
Здравствуйте, AK1801, Вы писали:
AK>Хочется, чтобы: AK>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent") AK>во время компиляции, а наверно в то же самое время, когда отрабатывает препроцессор, развернулось фактически в:
А не проще ли разворачивать в:
Здравствуйте, Vain, Вы писали:
AK>>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent") AK>>во время компиляции, а наверно в то же самое время, когда отрабатывает препроцессор, развернулось фактически в: V>А не проще ли разворачивать в: V>
V>К тому же проблема со скобками решиться сама собой.
V>ЗЫ: Навига это надо?
Судя по этому вопросу вы не поняли, зачем все это. Однако вам это не помешало предложить свой ответ.
Ваше предложение практически сводит в ноль идею пространств имен. Если мы будем иметь такие имена, то на что будет похож код.
Ибо вы предлагаете всю иерархию объектов, систем, подсистем, модулей — развернуть в плоский
список длинных уникальных имен. Тогда останавливаться нет смысла, и надо сделать еще один, уже
последний, шаг:
MP>оно неплохо обламывало то ли интеллисенс то ли вижуал асист, в общем что-то обламывало.
Спасибо! На самом деле да, это интересное соображение. Правда, в половине случаев интелисэнс и без этого тупит безнадежно. Всегда казалось странным: уметь код компилировать, но не уметь показать определение метода по его объявлению — это ломается крайне часто (хотя и многое другое тоже).
Здравствуйте, AK1801, Вы писали:
AK>>>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent") AK>>>во время компиляции, а наверно в то же самое время, когда отрабатывает препроцессор, развернулось фактически в: V>>А не проще ли разворачивать в: V>>
V>>К тому же проблема со скобками решиться сама собой. V>>ЗЫ: Навига это надо? AK>Судя по этому вопросу вы не поняли, зачем все это. Однако вам это не помешало предложить свой ответ. AK>Ваше предложение практически сводит в ноль идею пространств имен. Если мы будем иметь такие имена, то на что будет похож код. AK>Ибо вы предлагаете всю иерархию объектов, систем, подсистем, модулей — развернуть в плоский AK>список длинных уникальных имен. Тогда останавливаться нет смысла, и надо сделать еще один, уже AK>последний, шаг: AK>С_company_dept_project_subsystem_subSubSystem_component_subcomponent_Sender AK>То есть мы совсем избавляемся от пространств имен и для класса CSender получаем такое вот имечко. AK>Так надо?
Ну так вы объясните для чего это надо или будем играть в угадалки?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Ну так вы объясните для чего это надо или будем играть в угадалки?
Объяснить, зачем нужны пространства имен?
Или зачем я их хочу записывать более компактно и рефактороПригодно?
Условия задачи были вполне исчерпывающие: кодогенерация на этапе препроцессинга. Одну строку трансформируем в другую. Вроде для того, чтобы решить задачу — больше ничего знать и не надо.
Здравствуйте, AK1801, Вы писали:
V>>Ну так вы объясните для чего это надо или будем играть в угадалки? AK>Объяснить, зачем нужны пространства имен?
Объяснить саму задачу, которую бросились так решать.
AK>Или зачем я их хочу записывать более компактно и рефактороПригодно?
Стоило бы ещё добавить и не человекоПоддерживаемо.
AK>Условия задачи были вполне исчерпывающие: кодогенерация на этапе препроцессинга. Одну строку трансформируем в другую. Вроде для того, чтобы решить задачу — больше ничего знать и не надо.
Решить задачу путём чесания левой ногой правого уха.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Аноним, Вы писали:
AK>>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent"
А>Может так: А>NSDCL(company,dept,project,subsystem,subSubSystem,component,subcomponent) А>Насколько кавычки принципиальны? А>В моем варианте делаем, скажем 20 макросов NSDCL(Arg0), NSDCL(Arg0, Arg1) и т.д. А>С закрыванием namespace и using — тоже нечто подобное.
Спасибо! Безусловно, с перебором вар-тов макросами все работать будет.
Было интересно узнать, может есть какие-то еще средства/возможности более сложной и
гибкой кодогенерации.
Правда, выше уже намекнули, что на всех этих фокусах у интэлисэнса скорее всего случится истерика. А он и без того часто впадает в ступор.
Re[3]: Кодогенерация нэймспейсов в MSVS2K8
От:
Аноним
Дата:
03.07.11 23:22
Оценка:
Здравствуйте, AK1801, Вы писали:
AK>Ваше предложение практически сводит в ноль идею пространств имен. Если мы будем иметь такие имена, то на что будет похож код. AK>Ибо вы предлагаете всю иерархию объектов, систем, подсистем, модулей — развернуть в плоский AK>список длинных уникальных имен.
Вы, возможно, удивитесь, но в дотнете пространства имен фактически именно такие "плоские". И им это не помешало написать огромный фреймворк.
Здравствуйте, AK1801, Вы писали:
AK>Хочется, чтобы:
AK>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")
AK>во время компиляции, а наверно в то же самое время, когда отрабатывает препроцессор, развернулось фактически в:
AK>
1. За дикую вложенность пространств имён.
2. За очередную прививку Java-smell.
3. За аббревиатуры (не надо экономить символы на ровном месте).
4. За магическую константу не пойми, какого назначения в NSCLS(3) с чёрт знает каким сообщением об ошибке в случае несовпадения этой константы с количество слэшей (!) в симметричном NSDCL.
AK>Это все в хидере. А в реализации, например, так:
AK>NSUSE("company/dept/project/subsystem/subSubSystem/component/subcomponent")
AK>в
AK>
5. За издевательство над здравым смыслом: с точки зрения сложности сопровождения кода ты не выигрываешь ровным счётом ничего, но городишь новую структуру сверху, притом очень сложную и с неочевидными свойствами.
В общем, такой рецепт тут уже был, но тем не менее:
#define MYNAMESPACE_BEGIN() namespace A { namespace B { namespace C {
#define MYNAMESPACE_END() } } }
#define MYNAMESPACE A::B::C
...
MYNAMESPACE_BEGIN()
void foo();
MYNAMESPACE_END()
...
MYNAMESPACE::foo();
AK>Что можете посоветовать, кроме как выкинуть эту дурь из головы?
Идею оставить в голове, как образец того, что не нужно делать в C++. Ну или если делать, то на очень веских основаниях и имея в виду то, что я перечислил, как основания для отлучения от клавиатуры. Пожалуй, единственный сценарий, где такие выкрутасы могут на самом деле понадобиться (да и то, в сильно упрощённом виде) — это что-то вроде поддержки различных конфигураций продукта, когда в одних случаях нужно одно пространство имён, в других — другое, в третьих вообще никакого пространства имён не требуется. Например, такой подход применяется в Qt, но их можно понять — богатая история, куча платформ и т.п. А ради одного лишь рефакторинга усложнять себе (и всем окружающим) жизнь дополнительными магическими фразами не стоит.
Единственно, я бы посоветовал закрывающие скобки для namespace снабжать дополнительными комментариями:
namespace A {
namespace B {
...
} // namespace B
} // namespace A
Тогда обычный find/replace справится с рефакторингом без проблем. А то, что пытаешься сделать ты — это быстрый и надёжный способ получить язык в языке, в языке... До полной потери читабельности.
P.S.: Точка с запятой после закрывающей скобки namespace не нужна.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, AK1801, Вы писали:
AK>Объяснить, зачем нужны пространства имен? AK>Или зачем я их хочу записывать более компактно и рефактороПригодно?
Чем же это вот такая запись:
NSUSE("A/B/C")
рефактороПригоднй, чем такая:
using namespace A::B::C;
Сможешь изложить?
AK>Условия задачи были вполне исчерпывающие: кодогенерация на этапе препроцессинга. Одну строку трансформируем в другую. Вроде для того, чтобы решить задачу — больше ничего знать и не надо.
Надо. Чтобы понять, надо ли решать именно такую задачу, поставленную именно таким образом.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, AK1801, Вы писали:
AK>Правда, выше уже намекнули, что на всех этих фокусах у интэлисэнса скорее всего случится истерика. А он и без того часто впадает в ступор.
На всех этих фокусах случится истерика у твоих коллег. По сравнению с ней, полагаю, истерика интеллисенса гроша ломаного не стоит. Живо представляю себе:
using namespace std;
NSUSE(org, dept, system, component);
using namespace otherLibrary;
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Abyx, Вы писали:
A>возможно удастся переопределить '/' и использовать его вместо запятой
А-а-а-а-а-а-а-а!!!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, AK1801, Вы писали:
AK>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")
Ну и + ко всему сказаному — зачем ковычки? Вижуал ассист сам предложит нужный вариант для автозаполнения. А тут можно написать subSystem вместо subsystem и получить ошибку только на этапе компиляции.
К тому же придется писать каждую букву самостоятельно, вместо первых 1-2 букв каждого неймспейса.