investAPI icon indicating copy to clipboard operation
investAPI copied to clipboard

Использовать ENUM для InstrumentType

Open Antonboom opened this issue 3 years ago • 7 comments

Вместо строк "share", "bond" и т.д.

Antonboom avatar May 23 '22 04:05 Antonboom

Будет неудобно. На стороне клиента можно самим сделать enum-оболочку. Текстовое представление не имеет большого размера и удобнее читать логи, что происходит и с чем имеем дело.

MasterDimmy avatar Jun 06 '22 14:06 MasterDimmy

@MasterDimmy как вы определяете, когда пользоваться протобафным enum, а когда забивать на него? :)

Antonboom avatar Jun 06 '22 17:06 Antonboom

enum подразумевает целочисленное представление, если речь идет о порядковом номере - то нужен enum. Если же, как в примере выше, удобнее строчное представление - то достаточно массива строковых констант, о чем и сказано. Так и определяем. Как бы, YAGNI ;)

MasterDimmy avatar Jun 06 '22 18:06 MasterDimmy

enum подразумевает целочисленное представление, если речь идет о порядковом номере - то нужен enum.

Крайне сомнительное утверждение, есть ли какие-то официальные источники? Не затруднит ли вас привести примеры хороших и плохих enum в контексте Protobuf?

Если же, как в примере выше, удобнее строчное представление

Удобно в чём конкретно? Я собственно завёл это issue после того, как не понял из сгенерированного кода, какие значения могут быть в этом поле и пришлось грепать по документации. Тип инструмента – это не динамическая строка, а элемент конкретного множества.

Вот примеры перечислений из оф. документации:

enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
 }

 enum EnumAllowingAlias {
    option allow_alias = true;
    UNKNOWN = 0;
    STARTED = 1;
    RUNNING = 1;
 }

Почему-то гугл не предлагает делать "web", "images", "local" и т.д. И ни о каком порядковом номере речи не идёт.

Плюхи:

  1. Мы из коробки имеем constraint на уровне типа (с некоторыми допущениями).
  2. Мы знаем, какие значения может принимать поле на уровне описания контракта и полученного кода.
  3. Никто не мешает получать строковое представление по числовому стандартными способами.
  4. Никто не мешает преобразовывать полученную "транспортную" чиселку в свой доменный тип.

Antonboom avatar Jun 06 '22 19:06 Antonboom

Крайне сомнительное утверждение, есть ли какие-то официальные источники?

Можете сомневаться. Делайте как хотите.

Плюхи

Все тоже самое применимо и к строкам. Но и вспомним:

http.StatusOK = "OK" http.StatusCreated = "Created" http.StatusAccepted = "Accepted"

MasterDimmy avatar Jun 06 '22 20:06 MasterDimmy

Большинство типов в апи описаны через enum. Поэтому поддержу @Antonboom, для InstrumentType также напрашивается enum.

vitalets avatar Jun 09 '22 10:06 vitalets

Текстовое представление не имеет большого размера и удобнее читать логи, что происходит и с чем имеем дело.

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

Если представление протобуфного енама не настраивается в логах, то можно сделать value.ToString или что-то типа того :)

vabka avatar Sep 06 '22 09:09 vabka