Многие языки нравится C++
, C#
и Java
позволяют создавать объекты , которые представляют собой простые типы , такие как integer
или float
. Используя интерфейс класса, вы можете переопределить операторы и выполнить логику, например, проверку, превышает ли значение бизнес-правило 100.
Мне интересно, возможно ли в некоторых языках определить эти правила как аннотации или атрибуты переменной / свойства.
Например, C#
вы можете написать:
[Range(0,100)]
public int Price { get; set; }
Или, может быть, C++
вы могли бы написать:
int(0,100) x = 0;
Я никогда не видел подобного, но учитывая, насколько мы зависим от проверки данных перед хранением. Странно, что эта функция не была добавлена в языки.
Можете ли вы привести пример языков, где это возможно?
java
c#
c++
annotations
attributes
Reactgular
источник
источник
data Bool = True | False
и для того, что вы хотите, можно сказать,data Cents = 0 | 1 | 2 | ...
есть взгляд на «тип Алгебраических данных» (которые должны быть более правильно названными типами Хиндли-Милнера , но люди путают , что с типом выводом раздражающе) en.wikipedia.org/wiki/Algebraic_data_typetype
конце концов, в Паскале есть ключевое слово. Ориентация объекта - это скорее шаблон проектирования, чем свойство "atomar" языков программирования.Ответы:
Паскаль имел поддиапазонные типы, то есть уменьшал количество чисел, вписывающихся в переменную.
Ада также имеет понятие диапазонов: http://en.wikibooks.org/wiki/Ada_Programming/Types/range
Из Википедии ....
также можно сделать
И вот где это становится круто
C не имеет строгого поддиапазонного типа, но есть способы имитировать один (по крайней мере ограниченный), используя битовые поля для минимизации количества используемых битов.
struct {int a : 10;} my_subrange_var;}
, Это может работать как верхняя граница для переменного содержимого (в общем, я бы сказал: не используйте битовые поля для этого , это просто для подтверждения точки).Многие решения для целочисленных типов произвольной длины в других языках встречаются на уровне библиотек, т.е. C ++ допускает решения на основе шаблонов.
Существуют языки, которые позволяют отслеживать состояние переменных и связывать с ними утверждения. Например в Clojurescript
Функция
mytest
вызывается приa
изменении (с помощьюreset!
илиswap!
) проверки выполнения условий. Это может быть примером для реализации поведения поддиапазона в языках позднего связывания (см. Http://blog.fogus.me/2011/09/23/clojurescript-watchers-and-validators/ ).источник
for y in Year_Type loop ...
устраняя такие проблемы, как переполнение буфера.Ada также является языком, который допускает ограничения для простых типов, фактически в Ada рекомендуется определять собственные типы для вашей программы, чтобы гарантировать корректность.
Он долгое время использовался DoD, может быть, до сих пор, но я потерял его текущее использование.
источник
Посмотрите Ограничение диапазона типов значений в C ++ для примеров того, как создать проверенный диапазон тип значения в C ++.
Резюме: Используйте шаблон для создания типа значения со встроенными минимальными и максимальными значениями, которые вы можете использовать следующим образом:
Вам даже не нужен шаблон здесь; Вы можете использовать класс для аналогичного эффекта. Использование шаблона позволяет указать базовый тип. Кроме того, важно отметить, что тип
percent
выше не будетfloat
, а скорее экземпляром шаблона. Это может не соответствовать аспекту «простых типов» вашего вопроса.Простые типы - это просто - просто. Их часто лучше всего использовать в качестве строительных блоков для создания необходимых инструментов, а не для непосредственного использования.
источник
Насколько мне известно, некоторая ограниченная форма вашего намерения возможна в Java и C # посредством комбинации аннотаций и шаблона динамического прокси (существуют встроенные реализации для динамических прокси в Java и C #).
Версия на Java
Аннотация:
Класс Wrapper, создающий экземпляр Proxy:
InvocationHandler, служащий в качестве обхода при каждом вызове метода:
Пример-интерфейс для использования:
Main-метод:
Выход:
C # -Version
Аннотация (в C # называется атрибутом):
Подкласс DynamicObject:
The ExampleClass:
Использование:
В заключение вы видите, что вы можете заставить что-то подобное работать в Java , но это не совсем удобно, потому что
Возможности класса DynamicObject в C # снимают ограничения интерфейса, как вы видите в реализации C #. К сожалению, это динамическое поведение устраняет статическую безопасность типов в этом случае, поэтому проверки во время выполнения необходимы, чтобы определить, разрешен ли вызов метода на динамическом прокси.
Если эти ограничения приемлемы для вас, это может послужить основой для дальнейших копаний!
источник
public virtual int Min { get; private set; }
это хороший трюк, который значительно сократит ваш кодДиапазоны являются частным случаем инвариантов. Из Википедии:
Диапазон
[a, b]
может быть объявлен как переменная типа xInteger
с инвариантами x> = a и x <= b .Поэтому типы поддиапазонов Ada или Pascal не являются строго необходимыми. Они могут быть реализованы с целочисленным типом с инвариантами.
источник
Специальные функции для типов с ограниченным диапазоном не нужны в C ++ и других языках с мощными системами типов.
В C ++ ваши цели могут быть достигнуты относительно просто с помощью пользовательских типов . А в тех случаях, когда желательны типы с ограниченным диапазоном, их вряд ли достаточно . Например, можно также хотеть, чтобы компилятор проверил, что вычисления физических единиц были записаны правильно, так что скорость / время вызывает ускорение, а получение квадратного корня из ускорения / времени дает скорость. Для этого удобно иметь возможность определять систему типов, без явного присвоения имени каждому типу, который может появиться в формуле. Это можно сделать в C ++ .
источник