Стиль декларирования челенов класса
От: FurJ Россия  
Дата: 24.01.06 14:17
Оценка:
Существующая сегодня венгерская нотация предлагает для всех переменных членов класса ставить префикс "m_". Альтернативная рекомендация, завоевавшая мир C# и Java, предлагает названия приватных членов начинать с нижнего подчеркивания. Подобный стиль нередко встречается и у Unix-программистов. Насколько применима данная рекомендация для C++ — программирования? Вопрос вызван в связи с непроверенной информацией будто бы в стандарте C++ token-ы, начинающиеся с нижнего подчеркивания, зарезервированы за компилятором.
Re: Стиль декларирования челенов класса
От: aik Австралия  
Дата: 24.01.06 14:19
Оценка:
Здравствуйте, FurJ, Вы писали:

FJ>Существующая сегодня венгерская нотация предлагает для всех переменных членов класса ставить префикс "m_". Альтернативная рекомендация, завоевавшая мир C# и Java, предлагает названия приватных членов начинать с нижнего подчеркивания. Подобный стиль нередко встречается и у Unix-программистов. Насколько применима данная рекомендация для C++ — программирования? Вопрос вызван в связи с непроверенной информацией будто бы в стандарте C++ token-ы, начинающиеся с нижнего подчеркивания, зарезервированы за компилятором.


Нормально все применимо. Ты все равно не угадаешь. Вот у нас был свой контейнер CStringBuf, а потом вышел ATL7.0, где появился с таким же именем — и все, наш пришлось переименовать.
Re: Стиль декларирования челенов класса
От: Ведмедь Россия  
Дата: 24.01.06 14:30
Оценка:
Здравствуйте, FurJ, Вы писали:

FJ>Существующая сегодня венгерская нотация предлагает для всех переменных членов класса ставить префикс "m_". Альтернативная рекомендация, завоевавшая мир C# и Java, предлагает названия приватных членов начинать с нижнего подчеркивания. Подобный стиль нередко встречается и у Unix-программистов. Насколько применима данная рекомендация для C++ — программирования? Вопрос вызван в связи с непроверенной информацией будто бы в стандарте C++ token-ы, начинающиеся с нижнего подчеркивания, зарезервированы за компилятором.


Вроде бы МС и для C# не рекомендует начинать идентификаторы с подчеркивания из соображений совместимости
Да пребудет с тобой Великий Джа
Re: Стиль декларирования челенов класса
От: smidy СССР  
Дата: 24.01.06 14:47
Оценка:
Здравствуйте, FurJ, Вы писали:

ээээ...
с нижнего регистра начинаются имена любых переменных..
с верхнего — функций..
а имена переменных-членов (класса) должны еще заканчиваться _ (подчеркиванием)

кстати "альтернативная" типа была предложена г.саттером.....
STOP Java !
STOP .NET !
STOP JIT at ALL !
Take UnRestricted !
Re: Стиль декларирования челенов класса
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.01.06 14:53
Оценка:
Здравствуйте, FurJ, Вы писали:

FJ>Существующая сегодня венгерская нотация предлагает для всех переменных членов класса ставить префикс "m_".


Нет. Венгерка предполагает не просто префикс, а префикс, отражающий тип.

FJ> Альтернативная рекомендация, завоевавшая мир C# и Java, предлагает названия приватных членов начинать с нижнего подчеркивания.


В Java стиль описан документом от Sun. Подчеркивания я там что то не припомню. А в C# разные стили бывают, в том числе и с m_.
... << RSDN@Home 1.2.0 alpha rev. 631>>
AVK Blog
Re[2]: Стиль декларирования челенов класса
От: FurJ Россия  
Дата: 24.01.06 14:58
Оценка:
Здравствуйте, smidy, Вы писали:

S>а имена переменных-членов (класса) должны еще заканчиваться _ (подчеркиванием)


Александреску в своей литертуре примеры пишет с подобной загагулиной. Также подобный стиль принят в сорцах Loki. Однако, хотелось бы узнать, что говорит стандарт по поводу переднего подчеркивания.
Re[2]: Стиль декларирования челенов класса
От: FurJ Россия  
Дата: 24.01.06 15:02
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Нет. Венгерка предполагает не просто префикс, а префикс, отражающий тип — согласен, просто я это опустил, поскольку к сути вопроса это отношения не имеет.


AVK>В Java стиль описан документом от Sun. Подчеркивания я там что то не припомню. — к сожелению не видел документа от Sun (можно ссылку?), но замечал что этот стиль у большинства Java-программеров (Фаулер — самый яркий представитель).
Re: Стиль декларирования челенов класса
От: Lorenzo_LAMAS  
Дата: 24.01.06 15:03
Оценка: +1
Здравствуйте, FurJ, Вы писали:

FJ>для C++ — программирования? Вопрос вызван в связи с непроверенной информацией будто бы в стандарте C++ token-ы, начинающиеся с нижнего подчеркивания, зарезервированы за компилятором.


Имена, начинающиеся с __ или _Большая буква — зарезервированы. Имя, начинающееся с подчеркивания зарезервировано в глобальном пространстве имен (и пространстве имен ::std).
Of course, the code must be complete enough to compile and link.
Re[2]: Стиль декларирования челенов класса
От: FurJ Россия  
Дата: 24.01.06 15:07
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Имена, начинающиеся с __ или _Большая буква — зарезервированы. Имя, начинающееся с подчеркивания зарезервировано в глобальном пространстве имен (и пространстве имен ::std).


Таким образом можно смело называть член класса именем типа _мАленькаяБуква?
Re[3]: Стиль декларирования челенов класса
От: Lorenzo_LAMAS  
Дата: 24.01.06 15:15
Оценка: 2 (1)
FJ>Таким образом можно смело называть член класса именем типа _мАленькаяБуква?

В С++ лучше не стоит. Саттер говорит, мол, что мешает реализации определить макрос с таким именем?
Of course, the code must be complete enough to compile and link.
Re[4]: Стиль декларирования челенов класса
От: FurJ Россия  
Дата: 24.01.06 15:16
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>В С++ лучше не стоит. Саттер говорит, мол, что мешает реализации определить макрос с таким именем?


Понятно. Спасибо.
Re[3]: Стиль декларирования челенов класса
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 24.01.06 15:25
Оценка: 1 (1)
Здравствуйте, FurJ, Вы писали:

AVK>>В Java стиль описан документом от Sun.


FJ>Подчеркивания я там что то не припомню. — к сожелению не видел документа от Sun (можно ссылку?), но замечал что этот стиль у большинства Java-программеров (Фаулер — самый яркий представитель).


http://developers.sun.com/software/sundev/whitepapers/java-style.pdf

Field naming
Names of non-constant fields (reference types, or non-final primitive types) should use the infixCaps style.
Start with a lower-case letter, and capitalize the first letter of any subsequent word in the name, as well as
any letters that are part of an acronym. All other characters in the name are lower-case. Do not use underscores
to separate words. The names should be nouns or noun phrases. Examples:

boolean resizable;
char recordDelimiter;


P.S. И цитируй, пожалуйста, как следует.
... << RSDN@Home 1.2.0 alpha rev. 631>>
AVK Blog
Re[4]: Стиль декларирования челенов класса
От: FurJ Россия  
Дата: 24.01.06 15:42
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>http://developers.sun.com/software/sundev/whitepapers/java-style.pdf


Спасибо, нашел. Правда, похоже местоположение документа изменилось на
http://developers.sun.com/prodtech/cc/products/archive/whitepapers/java-style.pdf
Re[2]: Стиль декларирования челенов класса
От: crable США  
Дата: 24.01.06 21:10
Оценка: +2
Здравствуйте, Lorenzo_LAMAS, Вы писали:

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


FJ>>для C++ — программирования? Вопрос вызван в связи с непроверенной информацией будто бы в стандарте C++ token-ы, начинающиеся с нижнего подчеркивания, зарезервированы за компилятором.


L_L>Имена, начинающиеся с __ или _Большая буква — зарезервированы. Имя, начинающееся с подчеркивания зарезервировано в глобальном пространстве имен (и пространстве имен ::std).


Точнее, зарезервированы имена содержащие __, в начале или нет — не важно.
The last good thing written in C was Franz Schubert's Symphony No. 9.
Re: Стиль декларирования челенов класса
От: McSeem2 США http://www.antigrain.com
Дата: 24.01.06 22:06
Оценка: 3 (2) +2 :)
На мой взгляд, стиль m_nnn — это вполне разумно. Собственно, это единственное, что я активно использую из старых MS-рекомендаций. А в C# его явно или неявно душат (дизайнером форм, например). Типа раньше всех убеждали, как "m_" и венгерская нотация полезны для здоровья, а теперь это стало не вкусно, выплюньте.

Что же касается подчеркиваний, то начинать или заканчивать ими — это полный атас. Мало того, что может потенциально привести к конфликтам, так еще и код весь превращается в крокозяблики.
        if (_End - _Last < _M)
            {size_type _N = size() + (_M < size() ? size() : _M);
            iterator _S = allocator.allocate(_N, (void *)0);
            iterator _Q = _Ucopy(_First, _P, _S);
            _Q = _Ucopy(_F, _L, _Q);
            _Ucopy(_P, _Last, _Q);
            _Destroy(_First, _Last);
            allocator.deallocate(_First, _End - _First);
            _End = _S + _N;
            _Last = _S + size() + _M;
            _First = _S; }
        else if (_Last - _P < _M)
            {_Ucopy(_P, _Last, _P + _M);
            _Ucopy(_F + (_Last - _P), _L, _Last);
            copy(_F, _F + (_Last - _P), _P);
            _Last += _M; }
        else if (0 < _M)
            {_Ucopy(_Last - _M, _Last, _Last);
            copy_backward(_P, _Last - _M, _Last);
            copy(_F, _L, _P);
            _Last += _M; }}

Лично у меня от такого рябит в глазах и болит голова.
По моему глубокому убеждению, идентификаторы должны начинаться и заканчиваться буквами. Прописными или строчными, но буквами. Подчеркивания допустимы (и даже необходимы) внутри идентификатора, но не по краям. В этом случае, идентификаторы гораздо легче визуально отделяются от знаков препинания (операций) — как в обычном, естественном тексте. Иначе неизбежно полявляются brainfuck-шедевры типа:
_a_-_b_._c_->_d_
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: Стиль декларирования челенов класса
От: Воронков Василий Россия  
Дата: 24.01.06 22:48
Оценка: +3
Здравствуйте, McSeem2, Вы писали:

MS>Что же касается подчеркиваний, то начинать или заканчивать ими — это полный атас. Мало того, что может потенциально привести к конфликтам, так еще и код весь превращается в крокозяблики.

MS>
MS>        if (_End - _Last < _M)
MS>            {size_type _N = size() + (_M < size() ? size() : _M);
MS>            iterator _S = allocator.allocate(_N, (void *)0);
MS>            iterator _Q = _Ucopy(_First, _P, _S);
MS>            _Q = _Ucopy(_F, _L, _Q);
MS>            _Ucopy(_P, _Last, _Q);
MS>            _Destroy(_First, _Last);
MS>            allocator.deallocate(_First, _End - _First);
MS>            _End = _S + _N;
MS>            _Last = _S + size() + _M;
MS>            _First = _S; }
MS>        else if (_Last - _P < _M)
MS>            {_Ucopy(_P, _Last, _P + _M);
MS>            _Ucopy(_F + (_Last - _P), _L, _Last);
MS>            copy(_F, _F + (_Last - _P), _P);
MS>            _Last += _M; }
MS>        else if (0 < _M)
MS>            {_Ucopy(_Last - _M, _Last, _Last);
MS>            copy_backward(_P, _Last - _M, _Last);
MS>            copy(_F, _L, _P);
MS>            _Last += _M; }}
MS>


На самом деле любую нотацию можно довести до brainfuck-a. Замени в этом примере подчеркивание на "m_" — в глазах будет рябить не меньше.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Стиль декларирования челенов класса
От: McSeem2 США http://www.antigrain.com
Дата: 24.01.06 23:01
Оценка: :)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>На самом деле любую нотацию можно довести до brainfuck-a. Замени в этом примере подчеркивание на "m_" — в глазах будет рябить не меньше.


Именно так иногда и делаю. По крайней мере, становятся видны операции (прочие аспекты кодирования в данном примере мы не рассматриваем).
        if (m_End - m_Last < m_M)
            {sizem_type m_N = size() + (m_M < size() ? size() : m_M);
            iterator m_S = allocator.allocate(m_N, (void *)0);
            iterator m_Q = m_Ucopy(m_First, m_P, m_S);
            m_Q = m_Ucopy(m_F, m_L, m_Q);
            m_Ucopy(m_P, m_Last, m_Q);
            m_Destroy(m_First, m_Last);
            allocator.deallocate(m_First, m_End - m_First);
            m_End = m_S + m_N;
            m_Last = m_S + size() + m_M;
            m_First = m_S; }
        else if (m_Last - m_P < m_M)
            {m_Ucopy(m_P, m_Last, m_P + m_M);
            m_Ucopy(m_F + (m_Last - m_P), m_L, m_Last);
            copy(m_F, m_F + (m_Last - m_P), m_P);
            m_Last += m_M; }
        else if (0 < m_M)
            {m_Ucopy(m_Last - m_M, m_Last, m_Last);
            copym_backward(m_P, m_Last - m_M, m_Last);
            copy(m_F, m_L, m_P);
            m_Last += m_M; }}
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[4]: Стиль декларирования челенов класса
От: Воронков Василий Россия  
Дата: 25.01.06 00:11
Оценка: 12 (1) +4 :))) :))) :))
Здравствуйте, McSeem2, Вы писали:

MS>Именно так иногда и делаю. По крайней мере, становятся видны операции (прочие аспекты кодирования в данном примере мы не рассматриваем).

MS>
MS>        if (m_End - m_Last < m_M)
MS>            {sizem_type m_N = size() + (m_M < size() ? size() : m_M);
MS>            iterator m_S = allocator.allocate(m_N, (void *)0);
MS>            iterator m_Q = m_Ucopy(m_First, m_P, m_S);
MS>            m_Q = m_Ucopy(m_F, m_L, m_Q);
MS>            m_Ucopy(m_P, m_Last, m_Q);
MS>            m_Destroy(m_First, m_Last);
MS>            allocator.deallocate(m_First, m_End - m_First);
MS>            m_End = m_S + m_N;
MS>            m_Last = m_S + size() + m_M;
MS>            m_First = m_S; }
MS>        else if (m_Last - m_P < m_M)
MS>            {m_Ucopy(m_P, m_Last, m_P + m_M);
MS>            m_Ucopy(m_F + (m_Last - m_P), m_L, m_Last);
MS>            copy(m_F, m_F + (m_Last - m_P), m_P);
MS>            m_Last += m_M; }
MS>        else if (0 < m_M)
MS>            {m_Ucopy(m_Last - m_M, m_Last, m_Last);
MS>            copym_backward(m_P, m_Last - m_M, m_Last);
MS>            copy(m_F, m_L, m_P);
MS>            m_Last += m_M; }}

MS>


Ну что я могу сказать — brainfuck он и есть brainfuck. Кому нравится спереди, кому-то — сзади...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Стиль декларирования челенов класса
От: alexeiz  
Дата: 25.01.06 02:03
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Именно так иногда и делаю. По крайней мере, становятся видны операции (прочие аспекты кодирования в данном примере мы не рассматриваем).

MS>
MS>        if (m_End - m_Last < m_M)
MS>            {sizem_type m_N = size() + (m_M < size() ? size() : m_M);
MS>            iterator m_S = allocator.allocate(m_N, (void *)0);
MS>            iterator m_Q = m_Ucopy(m_First, m_P, m_S);
MS>            m_Q = m_Ucopy(m_F, m_L, m_Q);
MS>            m_Ucopy(m_P, m_Last, m_Q);
MS>            m_Destroy(m_First, m_Last);
MS>            allocator.deallocate(m_First, m_End - m_First);
MS>            m_End = m_S + m_N;
MS>            m_Last = m_S + size() + m_M;
MS>            m_First = m_S; }
MS>        else if (m_Last - m_P < m_M)
MS>            {m_Ucopy(m_P, m_Last, m_P + m_M);
MS>            m_Ucopy(m_F + (m_Last - m_P), m_L, m_Last);
MS>            copy(m_F, m_F + (m_Last - m_P), m_P);
MS>            m_Last += m_M; }
MS>        else if (0 < m_M)
MS>            {m_Ucopy(m_Last - m_M, m_Last, m_Last);
MS>            copym_backward(m_P, m_Last - m_M, m_Last);
MS>            copy(m_F, m_L, m_P);
MS>            m_Last += m_M; }}
MS>


Ты с P.J. Plauger'ом тягаться не пробовал?
Re[4]: Стиль декларирования челенов класса
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.01.06 02:04
Оценка: 1 (1) +5
Здравствуйте, McSeem2, Вы писали:

MS>Именно так иногда и делаю. По крайней мере, становятся видны операции (прочие аспекты кодирования в данном примере мы не рассматриваем).

MS>
MS>        if (m_End - m_Last < m_M)
MS>            {sizem_type m_N = size() + (m_M < size() ? size() : m_M);
MS>            iterator m_S = allocator.allocate(m_N, (void *)0);
MS>            iterator m_Q = m_Ucopy(m_First, m_P, m_S);
MS>            m_Q = m_Ucopy(m_F, m_L, m_Q);
MS>            m_Ucopy(m_P, m_Last, m_Q);
MS>            m_Destroy(m_First, m_Last);
MS>            allocator.deallocate(m_First, m_End - m_First);
MS>            m_End = m_S + m_N;
MS>            m_Last = m_S + size() + m_M;
MS>            m_First = m_S; }
MS>        else if (m_Last - m_P < m_M)
MS>            {m_Ucopy(m_P, m_Last, m_P + m_M);
MS>            m_Ucopy(m_F + (m_Last - m_P), m_L, m_Last);
MS>            copy(m_F, m_F + (m_Last - m_P), m_P);
MS>            m_Last += m_M; }
MS>        else if (0 < m_M)
MS>            {m_Ucopy(m_Last - m_M, m_Last, m_Last);
MS>            copym_backward(m_P, m_Last - m_M, m_Last);
MS>            copy(m_F, m_L, m_P);
MS>            m_Last += m_M; }}

MS>


Ох нехотел влезать в этот бестолковый спор о вкусах, но такая "изумительная" аргументация просто подталкнула к этому.

Не споря о том, какой стиль лучше (на мой взгляд лучше тот к которому привык и о котором договорился с остальными), скажу, что твой пример не чем кроме как подтасовки назвать нельзя, так как твои оппонетны предлагают использовать подчеркивания исклчительно для выделения переменных членов и глобальных переменных. Причем в их натации после подчеркивания не пишется так нелепо выглядящая в этом случае большая буква. Если твой код отформатировать в соотвествии с предложением твоий оппонентов, то он будет выглядеть примерно так:
    if (_end - _last < _m)
    {
        size_type n = size() + (_m < size() ? size() : _m);
        iterator s = allocator.allocate(n, (void *)0);
        iterator q = Ucopy(_First, _p, s);
    
        q = Ucopy(_f, _l, q);
    
        Ucopy(_p, _last, q);
        Destroy(_First, _last);
        allocator.deallocate(_first, _end - _First);
        _end = s + n;
        _last = s + size() + _m;
        _first = s;
    }
    else if (_last - _p < _m)
    {
        Ucopy(_p, _last, _p + _m);
        Ucopy(_f + (_last - _p), _l, _last);
        copy(_f, _f + (_last - _p), _p);
        _last += _m;
    }
    else if (0 < _m)
    {
        Ucopy(_last - _m, _last, _last);
        copy_backward(_p, _last - _m, _last);
        copy(_f, _l, _p);
        _last += _m; 
    }
}

Это при условии, что все неописанные переменные являются полями. Рельно же такого количества полей вряд ли встртишь.

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

А вот на что действительно стоило бы оратить внимание, так это на то что весь код утыкан совершенно бессмыслеными однобуквенными идентификатороами которые что с подчеркиваеним, что без него смысла не имеют.
... << RSDN@Home 1.2.0 alpha rev. 631>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.