Re[8]: В чем прелесть замаскированного goto?
От: Erop Россия  
Дата: 11.09.10 16:25
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>
CC>#define SIZE_CHECK(type,bits)    static_assert (sizeof(type) == bits/8, #type " != " #bits " bit")
CC>#define foreach(it,cont)            for (auto it = (cont).begin (), foreach_end_##it = (cont).end ();it != foreach_end_##it;++it)
CC>#define countof(array)                (sizeof (array)/sizeof (array[0]))
CC>

CC>пролезли бы?

Первый -- нет, static_assert ничем не хуже. Только у нас static_saaert без текстового сообщения.
Кроме того у тебя в макросе предполагается, что CHAR_BIT равно 8, что не обязательно.
Второй -- нет. Во-первых, есть такая стандартная функция. Во-вторых, он вводит в заблуждение. Если внутри цикла cont.end() поменяется, то всё гавкнется. Кроме того если вызвать что-то типа foreach( i, *++vectors ), то будет а-та-та...

Для третьего в нашей библиотеке уже есть похожий макрос, ну и вообще он обычно уже есть => не надо вводить свой, надо юзать стандартный.

Так что нет все три раза.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: объект-механизм
От: Erop Россия  
Дата: 11.09.10 16:26
Оценка:
Здравствуйте, fk0, Вы писали:

E>>Да ладно уж прямо вот и никак
Автор: Erop
Дата: 26.08.05
?..


fk0> Костыли и подпорки! Попытка через ()() сделать то, что в других языках делается просто и непосредственно!


Через какое такое ()()? Просто метод Process зовёшь и радуешься!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: В чем прелесть замаскированного goto?
От: Erop Россия  
Дата: 11.09.10 16:30
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>/нервно оглядываюсь, ища куда бы заныкаться от неотвратимого гнева гуру/


Я не гуру, но этот код в упор непроцедурный и такой же неэффективный...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: В чем прелесть замаскированного goto?
От: Erop Россия  
Дата: 11.09.10 16:34
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>Просто потому что до прочтения той темы мне эта конструкция в Сях нигде не попадалась.


Ну это и обозначает её полную необщепринятость

А вообще вопрос неважный. Но лично я бы с очень большим подозрением относился к коду коллеги, кому такой приём нравится.
Ну просто я это воспринимаю, так, что если есть дубовое решение и есть трюк, то человек выбирает трюк. А я предпочёл бы дубовое, конечно. Так как оно стандартное.

Ну в целом, я думаю, можно уже расслабиться на тему...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: В чем прелесть замаскированного goto?
От: Erop Россия  
Дата: 11.09.10 16:38
Оценка:
Здравствуйте, Nik_1, Вы писали:

N_>Если они далеко не "в каждой строчке" будут использоваться, всеравно замаишься согласовывать. Я б такого начальника отдела с его заморочками послалбы куда подальше.

Организуешь свой бизнес -- пошлёшь
Но я тебе советую ориентироваться не на такие вещи, а на производительность и качество работы в отделе твоих будущих начальниуов отделов в твоём будущем бизнесе

E>>Соответсвенно, если у тебя эти сомнительные конструкции не используются то и согласовывать ничего не надо

N_>Ну так скажи что такого плохо в макросах?
Ну это скучно. Обилием тркднодетектируемых ошибок не угодили.
Есть куча примеров описанных в литературе...
#drfine MAX( A, B ) ((A) > (B) ? (A) : (B))
char* q = "12";
int mx = MAX( *q++. *q++ );
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: В чем прелесть замаскированного goto?
От: Erop Россия  
Дата: 11.09.10 16:40
Оценка:
Здравствуйте, Nik_1, Вы писали:

E>>Что касается goto, то по нему нельзя обрулить создание объекта, доступного в точке, куда осуществляется переход...

N_>Вот и говорю что не нужен , потому что слишком много всяких таких "но" и подводных камней в его использовании.

Каких таких камней? Тебе компилятор не даст сделать так:
    goto afterA;
    std::string A;
afterA: ;
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: В чем прелесть замаскированного goto?
От: Erop Россия  
Дата: 11.09.10 16:42
Оценка:
Здравствуйте, Nik_1, Вы писали:

N_>Вот ненадо тока переиначивать. Ты говорил что вообще макросы не разрешаешь, причем тут в каждой строчке


Тут сообщения вроде как не исчезают никуда в основном. Перечитай внимательно что я там говорил, и подумай, как из того, что я говорил, следует необходимость согласования каждой строчки...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: В чем прелесть замаскированного goto?
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 11.09.10 20:04
Оценка: +1
Здравствуйте, Erop, Вы писали:

CF>>Просто потому что до прочтения той темы мне эта конструкция в Сях нигде не попадалась.


E>Ну это и обозначает её полную необщепринятость


Эм… Ну, скажем, я не настолько высокого о себе мнения, чтобы полагать, что знаю абсолютно все общепринятые конструкции и паттерны.

E>А вообще вопрос неважный. Но лично я бы с очень большим подозрением относился к коду коллеги, кому такой приём нравится.

E>Ну просто я это воспринимаю, так, что если есть дубовое решение и есть трюк, то человек выбирает трюк. А я предпочёл бы дубовое, конечно. Так как оно стандартное.

E>Ну в целом, я думаю, можно уже расслабиться на тему...


Ну, я как-то особо и не напрягался.
Хоть во мнениях и не сошлись, но всё же лично мне было интересно и полезно узнать альтернативную точку зрения (да и вообще о слабых сторонах разных подходов). Надеюсь, взаимно.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[9]: В чем прелесть замаскированного goto?
От: fk0 Россия https://fk0.name
Дата: 12.09.10 09:16
Оценка:
Здравствуйте, dilmah, Вы писали:

D>Но я не понимаю о чем спор вообще? В С++ есть красивый способ кодирования: допустим тебе нужно написать мощную функцию/метод (которая делает что-то нетривиальное). Тогда внутри этой функции ты определяешь локальную структуру, которая будет "движком" этой функции, локальные переменные этой функции ты обычно затягиваешь внутрь этой структуры, чтобы методы структуры могли с ней работать. Ну и заодно десторуктор этой струткуры занимается освобождением ресурсов. В С такого стиля нет.


Говнокод. Костыли и подпорки. В GCC есть локальные функции.
Re[7]: объект-механизм
От: fk0 Россия https://fk0.name
Дата: 12.09.10 09:17
Оценка: -1
Здравствуйте, Erop, Вы писали:

E>>>Да ладно уж прямо вот и никак
Автор: Erop
Дата: 26.08.05
?..

fk0>> Костыли и подпорки! Попытка через ()() сделать то, что в других языках делается просто и непосредственно!
E>Через какое такое ()()?

По буквам Ж О П А.
Re[9]: В чем прелесть замаскированного goto?
От: CreatorCray  
Дата: 12.09.10 12:12
Оценка:
Здравствуйте, Erop, Вы писали:

CC>>
CC>>#define SIZE_CHECK(type,bits) static_assert (sizeof(type) == bits/8, #type " != " #bits " bit")
CC>>#define foreach(it,cont)      for (auto it = (cont).begin (), foreach_end_##it = (cont).end ();it != foreach_end_##it;++it)
CC>>#define countof(array)        (sizeof (array)/sizeof (array[0]))
CC>>

CC>>пролезли бы?

E>Первый -- нет, static_assert ничем не хуже. Только у нас static_saaert без текстового сообщения.

Первый нужен чтоб быстро написать что то подобное:
SIZE_CHECK(char,  8);
SIZE_CHECK(BYTE,  8);
SIZE_CHECK(short, 16);
SIZE_CHECK(WORD,  16);
SIZE_CHECK(int,   32);
SIZE_CHECK(DWORD, 32);
SIZE_CHECK(float, 32);
SIZE_CHECK(void*, 32);
SIZE_CHECK(size_t,32);
SIZE_CHECK(double,64);
SIZE_CHECK(int64, 64);
...


E>Кроме того у тебя в макросе предполагается, что CHAR_BIT равно 8, что не обязательно.

Это мелочь. Можно заменить на константу.
Но блин покажите мне промышленную систему где это не так, и для которой С++ компилятор поддерживает static_assert.

E>Второй -- нет. Во-первых, есть такая стандартная функция.

Это которая std::for_each? Сие есть редкостное говно, ибо не позволяет писать в виде:
foreach (it, cont)
{
    foo (*it);
}


E>Во-вторых, он вводит в заблуждение. Если внутри цикла cont.end() поменяется, то всё гавкнется.

Есть такой гипотетический минус, правда легко исправляемый:
#define foreach(it,cont)   for (auto it = (cont).begin ();it != (cont).end ();++it)

Правда почему то за пяток лет активного использования на практике никто на это так и не напоролся.

Кстати std::for_each также подвержен этой "беде".
template<class _InIt, class _Fn1> inline _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
    {    // perform function for each element
    _DEBUG_RANGE(_First, _Last);
    _DEBUG_POINTER(_Func);
    _CHECKED_BASE_TYPE(_InIt) _ChkFirst(_CHECKED_BASE(_First));
    _CHECKED_BASE_TYPE(_InIt) _ChkLast(_CHECKED_BASE(_Last));
    for (; _ChkFirst != _ChkLast; ++_ChkFirst)
        _Func(*_ChkFirst);
    return (_Func);
    }


E> Кроме того если вызвать что-то типа foreach( i, *++vectors ), то будет а-та-та...

— Доктор, у меня болит когда я делаю вот так.
— Не делайте так (С)


E>Для третьего в нашей библиотеке уже есть похожий макрос, ну и вообще он обычно уже есть => не надо вводить свой, надо юзать стандартный.

Т.е. по сути это уже принято.

E>Так что нет все три раза.

Ясно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[13]: В чем прелесть замаскированного goto?
От: CreatorCray  
Дата: 12.09.10 12:17
Оценка:
Здравствуйте, Erop, Вы писали:

E>Ну это скучно. Обилием тркднодетектируемых ошибок не угодили.

E>Есть куча примеров описанных в литературе...
#drfine MAX( A, B ) ((A) > (B) ? (A) : (B))
E>char* q = "12";
E>int mx = MAX( *q++. *q++ );


Гм. У вас до сих пор работают люди, которые допускают такие детские ошибки?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: В чем прелесть замаскированного goto?
От: CreatorCray  
Дата: 12.09.10 12:17
Оценка:
Здравствуйте, fk0, Вы писали:

fk0> Говнокод. Костыли и подпорки. В GCC есть локальные функции.

А в стандарте они есть?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: В чем прелесть замаскированного goto?
От: Erop Россия  
Дата: 13.09.10 04:00
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Первый нужен чтоб быстро написать что то подобное:

CC>
CC>SIZE_CHECK(char,  8);
CC>SIZE_CHECK(BYTE,  8);
CC>SIZE_CHECK(short, 16);
CC>SIZE_CHECK(WORD,  16);
CC>SIZE_CHECK(int,   32);
CC>SIZE_CHECK(DWORD, 32);
CC>SIZE_CHECK(float, 32);
CC>SIZE_CHECK(void*, 32);
CC>SIZE_CHECK(size_t,32);
CC>SIZE_CHECK(double,64);
CC>SIZE_CHECK(int64, 64);
CC>...
CC>

А зачем это писать *быстро*? Да и вообще, зачем это писать?.. Особенно про WORD и DWORD...

E>>Кроме того у тебя в макросе предполагается, что CHAR_BIT равно 8, что не обязательно.

CC>Это мелочь. Можно заменить на константу.
Это ошибка, а не мелочь...

CC>Но блин покажите мне промышленную систему где это не так, и для которой С++ компилятор поддерживает static_assert.

В чём проблема, написать свой переносимый аналог static_assert'а?..


E>>Для третьего в нашей библиотеке уже есть похожий макрос, ну и вообще он обычно уже есть очень во многих библиотеках => не надо вводить свой, надо юзать стандартный.
CC>Т.е. по сути это уже принято.

Ну это много где принято. Но сами по себе программисты всё равно не должны писать свой макрос, но могут использовать библиотечный.


E>>Второй -- нет. Во-первых, есть такая стандартная функция.
CC>Это которая std::for_each? Сие есть редкостное говно, ибо не позволяет писать в виде:
Я от STL тоже сильно не в восторге. Но это не значит, что надо вводить макросы с именами очень похожими на стандартные функции...

E>>Во-вторых, он вводит в заблуждение. Если внутри цикла cont.end() поменяется, то всё гавкнется.

CC>Правда почему то за пяток лет активного использования на практике никто на это так и не напоролся.
Ну, наверное, на практике, все знают, какие циклы так можно писать, а какие нет. То есть мысленно подставляют этот макрос в код и проверяют

CC>Кстати std::for_each также подвержен этой "беде".

Мы вроде как сошлись на том, что он ниже плинтуса? Или нет?

CC>- Не делайте так (С)

Дык это опять надо нигде не наколоться. То есть знать, что на самом деле этот макрос раскрывается в то-то... Например, так:
foreach( it, readVectorFromFile() );
тоже гавкнется...

В общем идея такая, что не так важна скорость набора кода, как скорость чтения/понимания/внесения правок.
Так что чем плодить макрос foreach берёшь да и пишешь всюду
for( auto it = cont.begin(), it != cont.end(); ++it ) {
}

А программист, который слишком медленно набирает тескт, берёт "соло" или другую такую же прогу и осваивает таки слепой десятипальцевый метод хотя бы на уровне 200 символов в минуту.

Ну а инвалид, который не может освоить 200 ударов в минуту, и мегамозг, из которого льётся С++ код с большей скоростью мне в подчинённые не нужны

Кстати, если бы внутри foreach сидела какая-то нетривиальная очень итерация и назывался бы он как-то forEachTreeNode, то можно было бы и посмотреть...


E>>Так что нет все три раза.

CC>Ясно.
Ну и хорошо, что ясно.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[14]: В чем прелесть замаскированного goto?
От: Erop Россия  
Дата: 13.09.10 04:01
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Гм. У вас до сих пор работают люди, которые допускают такие детские ошибки?

Такие -- это какие?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: В чем прелесть замаскированного goto?
От: Erop Россия  
Дата: 13.09.10 04:18
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Писать нужно так, чтобы неправильное употребление было невозможно или сильно затруднено:


C>
C>#include <iostream>
C>#include <ostream>

C>template <typename T, size_t N>
C>size_t countof(T (&)[N])
C>{
C>    return N;
C>}

C>int main()
C>{
C>    int array[3];
C>    int* ptr = array;
C>    std::cout << "array: " << countof(array) // 3
C>              << " ptr: " << countof(ptr) // compile-time error
C>              << "\n";
C>    return 0;
C>}
C>



Всё хорошо, но есть проблема: это не константа времени компиляции и вообще не константа!

Один из путей исправления:
template<int N> struct N2Type { 
    char body[N]; 
    operator int() const { return N; } 
};
template <typename T, size_t N>
N2Type<N> countof(T (&)[N])
{
    return N2Type<N>();
}

#define COUNTOF( array ) sizeof countof( array )
В общем лучше пользоваться библиотечным макросом...

C>Заодно не засоряем пространство имён.

Тогда надо без макроса как-то делать!
Как ты думаешь, читабелен ли такой синтаксис:
sizeof in_items( arr )

Мне лично, кажется извратом...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[15]: В чем прелесть замаскированного goto?
От: CreatorCray  
Дата: 13.09.10 07:06
Оценка:
Здравствуйте, Erop, Вы писали:

CC>>Гм. У вас до сих пор работают люди, которые допускают такие детские ошибки?

E>Такие -- это какие?
Непонимание как работают макросы
int mx = MAX( *q++. *q++ );
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: В чем прелесть замаскированного goto?
От: CreatorCray  
Дата: 13.09.10 07:06
Оценка:
Здравствуйте, Erop, Вы писали:

E>А зачем это писать *быстро*? Да и вообще, зачем это писать?.. Особенно про WORD и DWORD...

Sanity check. Мало ли на какой экзотике это собирать вздумают.

CC>>Но блин покажите мне промышленную систему где это не так, и для которой С++ компилятор поддерживает static_assert.

E>В чём проблема, написать свой переносимый аналог static_assert'а?..
А потом ещё и свой переносимый аналог С++0х? Чтоб остальное собралось.

E>>>Для третьего в нашей библиотеке уже есть похожий макрос, ну и вообще он обычно уже есть очень во многих библиотеках => не надо вводить свой, надо юзать стандартный.

CC>>Т.е. по сути это уже принято.
E>Ну это много где принято. Но сами по себе программисты всё равно не должны писать свой макрос, но могут использовать библиотечный.
В библиотеке оно само образовалось или всё таки сначала было написано программистом и потом включено в библиотеку?
Те же foreach и countof тоже сначала болтались в отдельных файла проекта, пока не стали настолько общеупотребляемыми что заняли своё место во фреймворке.

CC>>Кстати std::for_each также подвержен этой "беде".

E>Мы вроде как сошлись на том, что он ниже плинтуса? Или нет?
Раз у стандартного та же "проблема", которую до сих пор так никто и не исправил, то значит это не очень то и проблема на самом деле. Не?

E>Дык это опять надо нигде не наколоться. То есть знать, что на самом деле этот макрос раскрывается в то-то...

Ну ведь знают же люди к примеру что стандартные макросы min и max во что то раскрываются. И что в целом в макросы подобные значения пихать не стоит тоже откуда то знают.

E>В общем идея такая, что не так важна скорость набора кода, как скорость чтения/понимания/внесения правок.

Дык цель любого макроса — заменить многабукаф на одно имя, в случаях когда запихивание этого кода в функцию менее эффективно. И foreach для читабельности и понимания несколько выгоднее чем for (многабукаф)

E>Так что чем плодить макрос foreach берёшь да и пишешь всюду [c]for( auto it = cont.begin(), it != cont.end(); ++it ) {

Писал, но крайне быстро задрало. Да и читать это потом не очень.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[16]: В чем прелесть замаскированного goto?
От: Erop Россия  
Дата: 13.09.10 16:57
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Непонимание как работают макросы

CC>
CC>int mx = MAX( *q++. *q++ );
CC>


Не всегда легко понять кто именно тут макрос
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: В чем прелесть замаскированного goto?
От: dilmah США  
Дата: 13.09.10 17:07
Оценка:
CC>Ну ведь знают же люди к примеру что стандартные макросы min и max во что то раскрываются.

ээ.. std::min вроде сегодня утром шаблонной функцией был?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.