Как правильно, enum или bool флаг ?
От: Alexey_N  
Дата: 23.12.07 08:29
Оценка:
В общем зашла речь о задаче в каком-то там ВУЗе: написать программу, ...
И все бы ничего, но в условии была следующая структура (восстановлено по памяти):


struct Student 
{
    string Name;
    byte Age;
    bool Male; //пол: true - мужской, false - женский
    ...
}


Комментарий привлек внимание
В общем хорошо посмеялись, что наверняка составитель мужик (кстати, так и оказалось), но потом задумались.
Наверняка использовать перечисление было бы нагляднее, хотя с другой стороны перечисление из двух элементов — это не совсем удобно.
Заглядывая в MSDN иногда встречаются перечисления из двух элементов, например (Automatic, Manual).

Вопрос такой, как же правильней и от чего это зависит ?
Может кто помнит, где это в стандарте прописано.
Re: Как правильно, enum или bool флаг ?
От: ilnar Россия  
Дата: 23.12.07 09:08
Оценка:
Здравствуйте, Alexey_N, Вы писали:

......

A_N>Вопрос такой, как же правильней и от чего это зависит ?

A_N>Может кто помнит, где это в стандарте прописано.

утгь позволяет задавать именованные состояния. к тому же неопределенное состояние (пока не задано)
Re: Как правильно, enum или bool флаг ?
От: Ромашка Украина  
Дата: 23.12.07 09:20
Оценка: +1 -1
Alexey_N пишет:
> Вопрос такой, как же правильней и от чего это зависит ?

Начнем с того, что правильно Sex, а не Male.

А остальное зависит от предметной области. Как-то делал БД для
буржуйских медиков, у них было штук восемь разных "полов" в справочнике.
Причем "неизвестен" и "не определен" это разные сущности. Я
подозреваю, с чем это связано, но вдаваться в подробности не хотелось.

ЗЫ. По идее правильно перечисления, даже если два значения.
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re: Как правильно, enum или bool флаг ?
От: Prometheus Россия bizyaev.narod.ru
Дата: 23.12.07 09:27
Оценка:
Здравствуйте, Alexey_N, Вы писали:
A_N> bool Male; //пол: true — мужской, false — женский
A_N>Вопрос такой, как же правильней и от чего это зависит ?
A_N>Может кто помнит, где это в стандарте прописано.

Зависит от задачи.
Если вы работаете с БД, то как вы будете интерпретировать ваш enum (не спорю, можно конечно, но это как из пушки по вробьям)?

Иначе, можно так:
[Flags]
enum SEX
{
Man = 0x01,
Women = 0x02,
Unknown = 0x04
}

или так:
enum SEX : byte
{
Man = 1,
Women = 2
};

или так:
enum SEX
{
Man,
Woman,
Unknown
}

Всяко правильно.
------------------------------------
Re[2]: Как правильно, enum или bool флаг ?
От: ilnar Россия  
Дата: 23.12.07 09:40
Оценка:
Здравствуйте, Prometheus, Вы писали:

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

A_N>> bool Male; //пол: true — мужской, false — женский
A_N>>Вопрос такой, как же правильней и от чего это зависит ?
A_N>>Может кто помнит, где это в стандарте прописано.

P>Зависит от задачи.

P>Если вы работаете с БД, то как вы будете интерпретировать ваш enum (не спорю, можно конечно, но это как из пушки по вробьям)?

P>Иначе, можно так:

P>[Flags]
P>enum SEX
P>{
P> Man = 0x01,
P> Women = 0x02,
P> Unknown = 0x04
P>}

может получиться что одновременно неизвестного пола гермофрадит?

P>или так:

P>enum SEX : byte
P>{
P> Man = 1,
P> Women = 2
P>};

P>или так:

P>enum SEX
P>{
P> Man,
P> Woman,
P> Unknown
P>}

анноун лучше ставить первым

P>Всяко правильно.
Re[2]: Как правильно, enum или bool флаг ?
От: ilnar Россия  
Дата: 23.12.07 09:42
Оценка:
Здравствуйте, Ромашка, Вы писали:

Р>Alexey_N пишет:

>> Вопрос такой, как же правильней и от чего это зависит ?

Р>Начнем с того, что правильно Sex, а не Male.


Р>А остальное зависит от предметной области. Как-то делал БД для

Р>буржуйских медиков, у них было штук восемь разных "полов" в справочнике.
Р> Причем "неизвестен" и "не определен" это разные сущности. Я
Р>подозреваю, с чем это связано, но вдаваться в подробности не хотелось.

неизвестен -- не видели
неопределен -- видели, но непонятно что там: мужское, женское или еще какое

Р>ЗЫ. По идее правильно перечисления, даже если два значения.
Re: Как правильно, enum или bool флаг ?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.12.07 10:02
Оценка: +1
Здравствуйте, Alexey_N, Вы писали:

A_N>Вопрос такой, как же правильней и от чего это зависит ?


Правильно, конечно, enum. Потому что при этом сильно лучше читаемость кода. Это во-первых. А во-вторых если завтра понадобится какой нибудь отдельный пол для транссексуалов — что будешь со своим булом делать?

A_N>Может кто помнит, где это в стандарте прописано.


В каком стандарте?
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re[2]: Как правильно, enum или bool флаг ?
От: Аноним  
Дата: 23.12.07 10:32
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>В каком стандарте?


У Microsoft есть например статьи по правилам именования переменных, классов и т.д. Они во многих местах используются как стандарт. Возможно есть статьи и на тему правил создания enum.
Re: Как правильно, enum или bool флаг ?
От: Igor Trofimov  
Дата: 23.12.07 12:15
Оценка: +1
Enum в данной ситуации совершенно точно правильнее.
Во-первых, не будет возникать вопросов, что означает true и false.
Во-вторых, в какой-то момент может потребоваться другое значение, например, где-то в Малазии, кажется, уже попадается "средний" пол
В то же время бывают и удачные места для применения bool. Но никак не здесь, ИМХО.
Re[3]: Как правильно, enum или bool флаг ?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.12.07 12:26
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>У Microsoft есть например статьи по правилам именования переменных, классов и т.д. Они во многих местах используются как стандарт. Возможно есть статьи и на тему правил создания enum.


Стандартов никаких на эту тему нет.
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re: Как правильно, enum или bool флаг ?
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 23.12.07 13:08
Оценка:
Здравствуйте, Alexey_N, Вы писали:

A_N>В общем зашла речь о задаче в каком-то там ВУЗе: написать программу, ...

A_N>И все бы ничего, но в условии была следующая структура (восстановлено по памяти):
Мне это напомнило шуточную задачу про столы и ножки.
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
Re: Как правильно, enum или bool флаг ?
От: Programador  
Дата: 23.12.07 13:54
Оценка:
Здравствуйте, Alexey_N, Вы писали:

A_N>
A_N>struct Student 
A_N>{
A_N>    string Name;
A_N>    byte Age;
A_N>    bool Male; //пол: true - мужской, false - женский
A_N>    ...
A_N>}
A_N>


A_N>Комментарий привлек внимание

A_N>В общем хорошо посмеялись, что наверняка составитель мужик (кстати, так и оказалось), но потом задумались.

следующий повод задуматся — как правильно

gender == мужской

или
gender != женский
Re[2]: Как правильно, enum или bool флаг ?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 23.12.07 14:12
Оценка:
Здравствуйте, Prometheus, Вы писали:

P>Если вы работаете с БД


Если работать с БД, то надо задуматься о том, что енум может меняться (ну не как пол конечно). В этом случае, возможно, понадобится что то вроде:
public class Sex
{
    public static Sex Male = new Guid("...");
    public static Sex Female = new Guid("...");
    
    private readonly Guid _value;
    
    private Sex(Guid value)
    {
        _value = value;
    }
    
    // Override Equals and GetHashCode, implement IEquatable<T>, == and != operators
}

Ну и в БД поле, естественно, uniqueidentifier или byte[16].
... << RSDN@Home 1.2.0 alpha rev. 725 on Windows Vista 6.0.6000.0>>
AVK Blog
Re: Как правильно, enum или bool флаг ?
От: Пётр Седов Россия  
Дата: 23.12.07 15:03
Оценка: 1 (1)
Здравствуйте, Alexey_N, Вы писали:

A_N>Наверняка использовать перечисление было бы нагляднее,

По-моему, да.

A_N>хотя с другой стороны перечисление из двух элементов — это не совсем удобно.

Почему?

A_N>Вопрос такой, как же правильней и от чего это зависит ?

Я бы сделал enum (С++):
enum Sex // пол
{
  Sex_Male,
  Sex_Female,
};

Строго говоря, bool – это тоже enum (true/false или yes/no), только встроенный.

Пара цитат:

1. Книга «Code Complete»
Автор(ы): Стив Макконнелл

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

Chapter 11. Fundamental Data

11.6 Enumerated Types

Use enumerated types as an alternative to boolean variables. Often, a boolean variable isn’t rich enough to express the meanings it needs to. For example, suppose you have a routine return True if it has successfully performed its task and False otherwise. Later you might find that you really have two kinds of False. The first kind means that the task failed, and the effects are limited to the routine itself; the second kind means that the task failed and caused a fatal error that will need to be propagated to the rest of the program. In this case, an enumerated type with the values Success, Warning, and FatalError would be more useful than a boolean with the values True and False. This scheme can easily be expanded to handle additional distinctions in the kinds of success or failure.

(В русском переводе это раздел 12.6 «Перечислимые типы».)

2. Аналогичный вопрос возникает при создании пользовательского интерфейса. Можно выбрать CheckBox (аналог bool-а) или пару RadioButton-ов (аналог enum-а с двумя значениями). Влад Головач в книге «Дизайн пользовательского интерфейса» пишет:

Инвентарь

Элементы управления

Чекбоксы и радиокнопки

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

Если же параметров всего два и при этом параметры невозможно комбинировать (т.е. либо ДА, либо НЕТ), решение более сложно. Дело в том, что группу из двух радиокнопок часто можно заменить одним чекбоксом. Предположим, что нужно дать пользователю выбор: показывать в документе линейки или не показывать. В этом случае логично поместить в диалоговое окно рамку группировки (см. «Структура окна» на стр. 94) со словами Показывать линейки, а в эту рамку поместить две радиокнопки: Да и Нет. Понятно, что это решение очень тяжеловесно. Можно сделать проще: убрать рамку группировки и радиокнопки, а на их место поместить всего один чекбокс со словами Показывать линейки. В этом случае всё будет хорошо. К сожалению, этот метод работает не всегда. Поскольку в самом чекбоксе написано только то, что произойдёт после его включения, но не описано, что произойдёт, если его не включить, такая конструкция не работает в ситуациях, когда пользователям по той или иной причине функциональность непоставленного чекбокса может быть непонятна. Например, если нужно спросить пользователя, в какой кодировке посылать ему письма, не получится заменить две радиокнопки Windows 1251 и KOI-8 единым чекбоксом KOI-8. Пользователь не обязан понимать, в какой кодировке система будет посылать ему письма по умолчанию. К счастью, такие ситуации редки.


P. S. Вспомнилась забавная рекомендация по заполнению анкеты:

Пример правильного заполнения анкеты:

sex:male
Пример неправильного заполнения анкеты:
sex:yes

Пётр Седов (ушёл с RSDN)
Re[2]: Как правильно, enum или bool флаг ?
От: ilnar Россия  
Дата: 23.12.07 15:55
Оценка:
Здравствуйте, Пётр Седов, Вы писали:

ПС>P. S. Вспомнилась забавная рекомендация по заполнению анкеты:

ПС>

ПС>Пример правильного заполнения анкеты:
ПС>

ПС>ПС>ПС>ПС>
sex:male
ПС>Пример неправильного заполнения анкеты:
ПС>ПС>ПС>ПС>ПС>
sex:yes


спасиба друх , улыбнуло
Re[2]: Как правильно, enum или bool флаг ?
От: IT Россия linq2db.com
Дата: 23.12.07 19:18
Оценка: +3 :)
Здравствуйте, Ромашка, Вы писали:

Р>Начнем с того, что правильно Sex, а не Male.


Начнём с того, что не Sex, Gender. Но если используется bool, то по правилам хорошего наименования должно быть IsMale.

Р>А остальное зависит от предметной области. Как-то делал БД для

Р>буржуйских медиков, у них было штук восемь разных "полов" в справочнике.
Р> Причем "неизвестен" и "не определен" это разные сущности. Я
Р>подозреваю, с чем это связано, но вдаваться в подробности не хотелось.

Это связано с тем, что на ещё не родившегося ребёнка, пол которого ещё не определён уже заводится медицинская карточка.
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Как правильно, enum или bool флаг ?
От: IT Россия linq2db.com
Дата: 23.12.07 19:18
Оценка: +1 :)))
Здравствуйте, Prometheus, Вы писали:

P>Иначе, можно так:

P>[Flags]
P>enum SEX
P>{
P> Man = 0x01,
P> Women = 0x02,
P> Unknown = 0x04
P>}

P>Всяко правильно.


Буржуй это прочитает примерно так

[Flags]
enum ПОЛОВАЯ_ЖИЗНЬ
{
Человек = 0x01,
Женщины = 0x02,
Неизвестно = 0x04
}
... << RSDN@Home 1.2.0 alpha rev. 717>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Как правильно, enum или bool флаг ?
От: McSeem2 США http://www.antigrain.com
Дата: 23.12.07 19:39
Оценка: :)
Здравствуйте, Ромашка, Вы писали:

Р>Alexey_N пишет:

>> Вопрос такой, как же правильней и от чего это зависит ?

Р>Начнем с того, что правильно Sex, а не Male.


Во-во. bool Sex; значения — true, false. Как в том бородатом анекдоте.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: Как правильно, enum или bool флаг ?
От: McSeem2 США http://www.antigrain.com
Дата: 23.12.07 19:40
Оценка: :)
Здравствуйте, IT, Вы писали:

IT>Начнём с того, что не Sex, Gender.


Эвона как. Значит я могу засудить DMV, ибо на моих водительских правах написано именно "Sex: M"
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Как правильно, enum или bool флаг ?
От: minorlogic Украина  
Дата: 23.12.07 19:41
Оценка: 1 (1)
А транссексуалы ? Типа вагиномужик или пенисоженщина ?

Кстати вполне удобно завернуть такое состояние в свой класс, так что перечисление это не предел мечтаний
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.