enum без тега
От: lazymf Россия  
Дата: 17.01.14 08:51
Оценка:
Здравствуйте.

В ходе code review коллега попенял на код типа такого:
int myfunc()
{
    ...
    enum { OUTSIDE, HEADER, BODY } status = OUTSIDE;
    ...
    switch (status)
    {
    case OUTSIDE:
        ...
    case HEADER:
        ...
    case BODY:
        ...
    }
}

— сказал, что мол локальный enum без тега — нехорошо, почему нехорошо — объяснить затруднился, типа gut feeling у него такой. Может кто-нибудь пояснить — чем же нехорош такой код все-таки?
Re: enum без тега
От: Abyx Россия  
Дата: 17.01.14 09:15
Оценка:
Здравствуйте, lazymf, Вы писали:

L>- сказал, что мол локальный enum без тега — нехорошо, почему нехорошо — объяснить затруднился, типа gut feeling у него такой. Может кто-нибудь пояснить — чем же нехорош такой код все-таки?


какой язык-то?
In Zen We Trust
Re[2]: enum без тега
От: lazymf Россия  
Дата: 17.01.14 09:27
Оценка:
Здравствуйте, Abyx, Вы писали:

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


L>>- сказал, что мол локальный enum без тега — нехорошо, почему нехорошо — объяснить затруднился, типа gut feeling у него такой. Может кто-нибудь пояснить — чем же нехорош такой код все-таки?


A>какой язык-то?


Извиняюсь, забыл уточнить. С++, VC 2010 и новее, GCC 4.8.2.
Re: enum без тега
От: niXman Ниоткуда https://github.com/niXman
Дата: 17.01.14 09:32
Оценка:
Здравствуйте, lazymf, Вы писали:

L>локальный enum без тега — нехорошо

так тут и нет тега.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: enum без тега
От: lazymf Россия  
Дата: 17.01.14 09:40
Оценка:
Здравствуйте, niXman, Вы писали:

L>>локальный enum без тега — нехорошо

X>так тут и нет тега.

Да, так вот мне и интересно — почему локальный enum без тега — нехорошо?
Re: enum без тега
От: Stanislav V. Zudin Россия  
Дата: 17.01.14 09:41
Оценка: 4 (1)
Здравствуйте, lazymf, Вы писали:

L>В ходе code review коллега попенял на код типа такого:

L>
L>int myfunc()
L>{
L>    ...
L>    enum { OUTSIDE, HEADER, BODY } status = OUTSIDE;
L>    ...
L>    switch (status)
L>    {
L>    case OUTSIDE:
L>        ...
L>    case HEADER:
L>        ...
L>    case BODY:
L>        ...
L>    }
L>}
L>

L>- сказал, что мол локальный enum без тега — нехорошо, почему нехорошо — объяснить затруднился, типа gut feeling у него такой. Может кто-нибудь пояснить — чем же нехорош такой код все-таки?

Если все так и останется в пределах одной функции, то нормально. А если в результате рефакторинга понадобится часть кода вынести в отдельную функцию, и enum надо передавать в качестве параметра, то таки придется добавить имя. Что, в общем-то, совершенно не проблема.
Мое мнение — это его личные предпочтения, а не проблемы с кодом. Если есть общепринятый CodeStandard, придерживайся его.
_____________________
С уважением,
Stanislav V. Zudin
Re: enum без тега
От: uzhas Ниоткуда  
Дата: 17.01.14 10:17
Оценка: 4 (1)
Здравствуйте, lazymf, Вы писали:

L>локальный enum без тега — нехорошо, почему нехорошо — объяснить затруднился, типа gut feeling у него такой. Может кто-нибудь пояснить — чем же нехорош такой код все-таки?


я бы рассуждал так:
объявление типа и переменной — нагромождение. лучше разделить эти две фазы.
в первой фазе имя типу придется дать, если хочется его использовать
далее, касательно енума — в данном случае скорее всего тип неважен, а важны константы, поэтому если и определять неименованные енум, то не стоит и создавать переменную этого типа. переменную status тогда можно объявить как int
итак, имеем два варианта:
1.
enum { OUTSIDE, HEADER, BODY };
int status = OUTSIDE;
...
switch (status)


2.
enum StatusType { OUTSIDE, HEADER, BODY };
StatusType status = OUTSIDE;
...
switch (status)
Re: enum без тега
От: visual_wind  
Дата: 17.01.14 13:45
Оценка: 4 (1)
Здравствуйте, lazymf, Вы писали:

L>- сказал, что мол локальный enum без тега — нехорошо, почему нехорошо — объяснить затруднился, типа gut feeling у него такой. Может кто-нибудь пояснить — чем же нехорош такой код все-таки?


Насколько мне помнится, anonymous enumerations нельзя использовать в качестве параметра шаблона в С++03. В приведенных вами компиляторах есть поддержка C++0x. Но если вы захотите компилить свой код, например, в MinGW без поддержки C++0x, и будете параметризовать шаблоны вашим энумом, могут вознинуть проблемы.

Помимо этого, по моему личному мнению, в коде, подобном вашему, локальные безымянные энумы создают проблемы в юнит тестировании. Код функции, который вы привели, реализует некоторую стейт машину, состояния которой соответсвуют значениям энума. Эту стейт машину в тесте неплохо было бы привести в некоторое исходное состояние. Если вы будете хранить это состояние в тестовой переменной в другом файле, то возникает вопрос — какого типа она должна быть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.