2014-10-06 1 views
0

У меня есть функция в эликсире, который может закончиться в одном из состояний с дополнительным флагом: ОК, заблокирован, ok_spawned, blocked_spawned. (В этом случае флаг «_spawned» является флагом.) В будущем количество состояний и флагов может увеличиться.Как эффективно представлять флаги в Elixir?

Мой вопрос - что это лучший способ осуществить это? Поэтому я могу легко проверить флаги/общее состояние?

Моих идей либо карта или какой-то кортеж, где первый элемент является основным состоянием и второго является представлением флагов, но я не уверен, что лучше.

Любые идеи, высоко ценятся.

+2

Я не уверен, но тот факт, что ваши возвращаемые значения настолько гибки может указывать на недостаток дизайна. Может быть, ваш метод слишком много? Для пользователей публичного API обычно представляются только два результата: в случае успеха соглашение должно возвращать ': ok' или' {: ok, return_value} '. В случае отказа вы должны вернуть '{: error, reason}'. Что вы ожидаете от потребителя метода для всех возвращаемых флагов? Это кажется слишком сложным в использовании. –

ответ

0

Я бы просто использовать атомы и кортеж:

http://elixir-lang.org/getting_started/2.html#2.3-atoms

http://elixir-lang.org/getting_started/2.html#2.7-tuples

Что-то вроде этого, может быть:

{:ok, nil} 
{:ok, :blocked} 
{:ok, :spawned} 
{:blocked, :spawned} 

Но, может быть, я не понимая ваш вопрос правильно ?

+0

Благодарим вас за ответ. Я понимаю, как добавить другое состояние (только один атом на первой позиции). Однако как представить состояние с двумя или более флагами (в будущем)? Скажем: ok с флагами: порожденными и: new_flag? PS: Я считаю, что второй один должен быть {: заблокирован, ноль} –

+0

Если количество флагов является динамическим, следует использовать 'HashSet' (http://elixir-lang.org/docs/stable/elixir/HashSet. html) как второй элемент кортежа. – sasajuric

+0

@ TomášBrukner, как я уже сказал, я не совсем уверен, что понимаю ваш вопрос. –

Смежные вопросы