В ходе code review коллега попенял на код типа такого:
int myfunc()
{
...
enum { OUTSIDE, HEADER, BODY } status = OUTSIDE;
...
switch (status)
{
case OUTSIDE:
...
case HEADER:
...
case BODY:
...
}
}
— сказал, что мол локальный enum без тега — нехорошо, почему нехорошо — объяснить затруднился, типа gut feeling у него такой. Может кто-нибудь пояснить — чем же нехорош такой код все-таки?
Здравствуйте, lazymf, Вы писали:
L>- сказал, что мол локальный enum без тега — нехорошо, почему нехорошо — объяснить затруднился, типа gut feeling у него такой. Может кто-нибудь пояснить — чем же нехорош такой код все-таки?
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, lazymf, Вы писали:
L>>- сказал, что мол локальный enum без тега — нехорошо, почему нехорошо — объяснить затруднился, типа gut feeling у него такой. Может кто-нибудь пояснить — чем же нехорош такой код все-таки?
A>какой язык-то?
Извиняюсь, забыл уточнить. С++, VC 2010 и новее, GCC 4.8.2.
Здравствуйте, 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
Здравствуйте, 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)
Здравствуйте, lazymf, Вы писали:
L>- сказал, что мол локальный enum без тега — нехорошо, почему нехорошо — объяснить затруднился, типа gut feeling у него такой. Может кто-нибудь пояснить — чем же нехорош такой код все-таки?
Насколько мне помнится, anonymous enumerations нельзя использовать в качестве параметра шаблона в С++03. В приведенных вами компиляторах есть поддержка C++0x. Но если вы захотите компилить свой код, например, в MinGW без поддержки C++0x, и будете параметризовать шаблоны вашим энумом, могут вознинуть проблемы.
Помимо этого, по моему личному мнению, в коде, подобном вашему, локальные безымянные энумы создают проблемы в юнит тестировании. Код функции, который вы привели, реализует некоторую стейт машину, состояния которой соответсвуют значениям энума. Эту стейт машину в тесте неплохо было бы привести в некоторое исходное состояние. Если вы будете хранить это состояние в тестовой переменной в другом файле, то возникает вопрос — какого типа она должна быть?