Кодогенерация нэймспейсов в MSVS2K8
От: AK1801 Россия  
Дата: 01.07.11 11:27
Оценка: :))) :))
Доброго дня сообществу!

Хочется, чтобы:

NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")

во время компиляции, а наверно в то же самое время, когда отрабатывает препроцессор, развернулось фактически в:

namespace company
{
namespace dept
{
namespace project
{
namespace subsystem
{
namespace subSubSystem
{
namespace component
{
namespace subcomponent
{


А нечто типа:

NSCLS(3)

в

};
};
};


Это все в хидере. А в реализации, например, так:

NSUSE("company/dept/project/subsystem/subSubSystem/component/subcomponent")

в

using namespace company::dept::project::subsystem::subSubSystem::component::subcomponent;



То есть в общем случае имеем преобразование вида:

KEYWORD("some_string") ---> "some_another_string_made_up_at_pre_compile_time"

Что можете посоветовать, кроме как выкинуть эту дурь из головы?

Студия 2К8, Win7.

За идеи/ссылки/критику — заранее Спасибо!!!
msvs2k8 codegen
Re: Кодогенерация нэймспейсов в MSVS2K8
От: Abyx Россия  
Дата: 01.07.11 17:36
Оценка:
Здравствуйте, AK1801, Вы писали:

AK>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")


"" — убрать, '/' заменить на ',' , использовать boost.preprocessor
возможно удастся переопределить '/' и использовать его вместо запятой
In Zen We Trust
Re: Кодогенерация нэймспейсов в MSVS2K8
От: uzhas Ниоткуда  
Дата: 01.07.11 18:53
Оценка: 3 (1) :))
Здравствуйте, AK1801, Вы писали:

AK>Хочется, чтобы:


AK>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")


альтернативный вариант
NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent/username/hobby/city/date_of_birth/current_date")
Re: Кодогенерация нэймспейсов в MSVS2K8
От: MescalitoPeyot Украина  
Дата: 01.07.11 19:02
Оценка:
Когда я последний раз видел подобное в сорцах:
#define COOL_BEGIN_COOL_NAMESPACE namespace Cool {
#define COOL_END_COOL_NAMESPACE }


оно неплохо обламывало то ли интеллисенс то ли вижуал асист, в общем что-то обламывало.
... << RSDN@Home 1.2.0 alpha 4 rev. 1138>>
Re[2]: Кодогенерация нэймспейсов в MSVS2K8
От: AK1801 Россия  
Дата: 01.07.11 19:18
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, AK1801, Вы писали:


AK>>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")


A>"" — убрать, '/' заменить на ',' , использовать boost.preprocessor

A>возможно удастся переопределить '/' и использовать его вместо запятой

Спасибо за дельный совет. Но завязывать такой простецкий декор на
целый буст — это, мне кажется, оверхед.
Re: Кодогенерация нэймспейсов в MSVS2K8
От: Vain Россия google.ru
Дата: 01.07.11 19:18
Оценка:
Здравствуйте, AK1801, Вы писали:

AK>Хочется, чтобы:

AK>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")
AK>во время компиляции, а наверно в то же самое время, когда отрабатывает препроцессор, развернулось фактически в:
А не проще ли разворачивать в:
namespace company_dept_project_subsystem_subSubSystem_component_subcomponent

К тому же проблема со скобками решиться сама собой.

ЗЫ: Навига это надо?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Кодогенерация нэймспейсов в MSVS2K8
От: AK1801 Россия  
Дата: 01.07.11 19:34
Оценка:
Здравствуйте, Vain, Вы писали:

AK>>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")

AK>>во время компиляции, а наверно в то же самое время, когда отрабатывает препроцессор, развернулось фактически в:
V>А не проще ли разворачивать в:
V>
V>namespace company_dept_project_subsystem_subSubSystem_component_subcomponent
V>

V>К тому же проблема со скобками решиться сама собой.

V>ЗЫ: Навига это надо?


Судя по этому вопросу вы не поняли, зачем все это. Однако вам это не помешало предложить свой ответ.

Ваше предложение практически сводит в ноль идею пространств имен. Если мы будем иметь такие имена, то на что будет похож код.
Ибо вы предлагаете всю иерархию объектов, систем, подсистем, модулей — развернуть в плоский
список длинных уникальных имен. Тогда останавливаться нет смысла, и надо сделать еще один, уже
последний, шаг:

С_company_dept_project_subsystem_subSubSystem_component_subcomponent_Sender

То есть мы совсем избавляемся от пространств имен и для класса CSender получаем такое вот имечко.
Так надо?
Re[2]: Кодогенерация нэймспейсов в MSVS2K8
От: AK1801 Россия  
Дата: 01.07.11 19:43
Оценка:
Здравствуйте, MescalitoPeyot, Вы писали:

MP>Когда я последний раз видел подобное в сорцах:

MP>
MP>#define COOL_BEGIN_COOL_NAMESPACE namespace Cool {
MP>#define COOL_END_COOL_NAMESPACE }
MP>


MP>оно неплохо обламывало то ли интеллисенс то ли вижуал асист, в общем что-то обламывало.


Спасибо! На самом деле да, это интересное соображение. Правда, в половине случаев интелисэнс и без этого тупит безнадежно. Всегда казалось странным: уметь код компилировать, но не уметь показать определение метода по его объявлению — это ломается крайне часто (хотя и многое другое тоже).
Re[3]: Кодогенерация нэймспейсов в MSVS2K8
От: Vain Россия google.ru
Дата: 01.07.11 19:46
Оценка:
Здравствуйте, AK1801, Вы писали:

AK>>>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")

AK>>>во время компиляции, а наверно в то же самое время, когда отрабатывает препроцессор, развернулось фактически в:
V>>А не проще ли разворачивать в:
V>>
V>>namespace company_dept_project_subsystem_subSubSystem_component_subcomponent
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.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: Кодогенерация нэймспейсов в MSVS2K8
От: AK1801 Россия  
Дата: 01.07.11 19:53
Оценка:
Здравствуйте, Vain, Вы писали:

V>Ну так вы объясните для чего это надо или будем играть в угадалки?


Объяснить, зачем нужны пространства имен?
Или зачем я их хочу записывать более компактно и рефактороПригодно?
Условия задачи были вполне исчерпывающие: кодогенерация на этапе препроцессинга. Одну строку трансформируем в другую. Вроде для того, чтобы решить задачу — больше ничего знать и не надо.
Re: Кодогенерация нэймспейсов в MSVS2K8
От: uzhas Ниоткуда  
Дата: 01.07.11 20:03
Оценка: +2 :)
Здравствуйте, AK1801, Вы писали:

AK>Что можете посоветовать, кроме как выкинуть эту дурь из головы?

ничего
Re[5]: Кодогенерация нэймспейсов в MSVS2K8
От: Vain Россия google.ru
Дата: 01.07.11 21:22
Оценка: +2
Здравствуйте, AK1801, Вы писали:

V>>Ну так вы объясните для чего это надо или будем играть в угадалки?

AK>Объяснить, зачем нужны пространства имен?
Объяснить саму задачу, которую бросились так решать.

AK>Или зачем я их хочу записывать более компактно и рефактороПригодно?

Стоило бы ещё добавить и не человекоПоддерживаемо.

AK>Условия задачи были вполне исчерпывающие: кодогенерация на этапе препроцессинга. Одну строку трансформируем в другую. Вроде для того, чтобы решить задачу — больше ничего знать и не надо.

Решить задачу путём чесания левой ногой правого уха.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Кодогенерация нэймспейсов в MSVS2K8
От: Аноним  
Дата: 03.07.11 13:08
Оценка: -1
Здравствуйте, AK1801, Вы писали:

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[2]: Кодогенерация нэймспейсов в MSVS2K8
От: AK1801 Россия  
Дата: 03.07.11 19:18
Оценка:
Здравствуйте, Аноним, Вы писали:

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>список длинных уникальных имен.

Вы, возможно, удивитесь, но в дотнете пространства имен фактически именно такие "плоские". И им это не помешало написать огромный фреймворк.
Re: Кодогенерация нэймспейсов в MSVS2K8
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 04.07.11 06:26
Оценка: 1 (1)
Здравствуйте, AK1801, Вы писали:

AK>Хочется, чтобы:


AK>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")


AK>во время компиляции, а наверно в то же самое время, когда отрабатывает препроцессор, развернулось фактически в:


AK>
AK>namespace company
AK>{
AK>namespace dept
AK>{
AK>namespace project
AK>{
AK>namespace subsystem
AK>{
AK>namespace subSubSystem
AK>{
AK>namespace component
AK>{
AK>namespace subcomponent
AK>{
AK>


AK>А нечто типа:


AK>NSCLS(3)


AK>в


AK>
AK>};
AK>};
AK>};
AK>


За это нужно отлучать от клавиатуры.

1. За дикую вложенность пространств имён.
2. За очередную прививку Java-smell.
3. За аббревиатуры (не надо экономить символы на ровном месте).
4. За магическую константу не пойми, какого назначения в NSCLS(3) с чёрт знает каким сообщением об ошибке в случае несовпадения этой константы с количество слэшей (!) в симметричном NSDCL.

AK>Это все в хидере. А в реализации, например, так:


AK>NSUSE("company/dept/project/subsystem/subSubSystem/component/subcomponent")


AK>в


AK>
AK>using namespace company::dept::project::subsystem::subSubSystem::component::subcomponent;
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.: Винодельческие провинции — это есть рулез!
Re[5]: Кодогенерация нэймспейсов в MSVS2K8
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 04.07.11 06:36
Оценка:
Здравствуйте, AK1801, Вы писали:

AK>Объяснить, зачем нужны пространства имен?

AK>Или зачем я их хочу записывать более компактно и рефактороПригодно?

Чем же это вот такая запись:

NSUSE("A/B/C")


рефактороПригоднй, чем такая:

using namespace A::B::C;


Сможешь изложить?

AK>Условия задачи были вполне исчерпывающие: кодогенерация на этапе препроцессинга. Одну строку трансформируем в другую. Вроде для того, чтобы решить задачу — больше ничего знать и не надо.


Надо. Чтобы понять, надо ли решать именно такую задачу, поставленную именно таким образом.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: Кодогенерация нэймспейсов в MSVS2K8
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 04.07.11 06:48
Оценка: +1
Здравствуйте, AK1801, Вы писали:

AK>Правда, выше уже намекнули, что на всех этих фокусах у интэлисэнса скорее всего случится истерика. А он и без того часто впадает в ступор.


На всех этих фокусах случится истерика у твоих коллег. По сравнению с ней, полагаю, истерика интеллисенса гроша ломаного не стоит. Живо представляю себе:

using namespace std;
NSUSE(org, dept, system, component);
using namespace otherLibrary;


или ещё краше:

NSUSE(std);
NSUSE(org, dept, system, component);
NSUSE(otherLibrary);

Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[2]: Кодогенерация нэймспейсов в MSVS2K8
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 04.07.11 06:56
Оценка:
Здравствуйте, Abyx, Вы писали:

A>возможно удастся переопределить '/' и использовать его вместо запятой


А-а-а-а-а-а-а-а!!!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: Кодогенерация нэймспейсов в MSVS2K8
От: sidorov18 США  
Дата: 04.07.11 07:16
Оценка:
Здравствуйте, AK1801, Вы писали:

AK>NSDCL("company/dept/project/subsystem/subSubSystem/component/subcomponent")


Ну и + ко всему сказаному — зачем ковычки? Вижуал ассист сам предложит нужный вариант для автозаполнения. А тут можно написать subSystem вместо subsystem и получить ошибку только на этапе компиляции.
К тому же придется писать каждую букву самостоятельно, вместо первых 1-2 букв каждого неймспейса.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.