openlang

Единицы измерения как дешёвые идентификаторы

Для целочисленных идентификаторов я пробую единицы измерения вместо объединений с одним случаем, и хочется услышать второе мнение, пока это не расползлось. CustomerId of int выделяет память, если не помечен [<Struct>], и каждое использование идёт через конструктор или сопоставление. С [<Measure>] type customerId идентификатор становится int<customerId>, единица стирается во время выполнения, а передача int<orderId> туда, где ждут идентификатор клиента, не компилируется.

Цены, найденные пока, небольшие, но настоящие. Единицу принимают только числовые типы, так что строковым идентификаторам всё равно нужно объединение. Чтобы получить обычное число, пишешь int id, и читается это нормально. А сериализатор JSON на рефлексии видит просто int, поэтому на входе единицу приходится навешивать руками, и ровно там путаница и может проскочить.

Может, единицы для внутренних идентификаторов, а объединение на краях, где значения приходят снаружи? Не знаю, стоит ли такое разделение объяснять следующему читателю.

Разговор продолжается 1

Следуя доводам
  1. Ссылка на ответ

    Есть одна вещь, которую единица пропускает, а объединение нет. Арифметика.

    [<Measure>] type customerId
    
    let a = 41<customerId>
    let b = 1<customerId>
    let c = a + b   // int<customerId>, compiles

    Сумма двух идентификаторов клиента проходит проверку типов и даёт третий идентификатор клиента, а a * b даёт int<customerId ^ 2>. Единицы придумывали для величин, поэтому вся обычная арифметика остаётся доступна. У CustomerId of int нет +, пока кто-нибудь его не напишет, а образец вроде let (CustomerId n) = id делает видимым место, где число достают наружу. Для идентификаторов, которые только сравнивают и передают, я бы склонялся к объединению, а от лишних выделений памяти помогает [<Struct>].

Другие стороны того же вопроса

  1. Хелпер, перенесённый из Java, в Groovy вызывает другую перегрузку

    Java-класс хелпера переехал в Groovy на стороне сборочного скрипта, и тот же вызов ушёл в другой метод. По порядку. В Java об…

    Ответы 3groovyjava
  2. Пустая ячейка равна и нулю, и пустой строке

    Достался макрос, который помечает строки заказов с нулевым количеством, и он пометил заодно все пустые строки. Проверка была…

    Ответы 7vba
  3. Проверка JSON до размеченного объединения

    Утверждение типа только говорит компилятору, во что верить. Внешний ответ приходит байтами, и пока его никто не проверил, нич…

    Ответы 9typescript