"Проверенный тип" шаблон проектирования - PullRequest
0 голосов
/ 09 февраля 2019

Мне интересно, есть ли имя для шаблона проектирования, заключающего в себе значения, которые ограничивают допустимые значения внутри них.Другими словами, эти объекты налагают больше ограничений на систему типов.

Дополнительный вопрос: существуют ли библиотеки для этих вещей, поэтому мне не нужно создавать свои собственные версии с ошибками?

Пример: тип диапазона

В идеальном мире мы могли бы выразить тип диапазона как зависимый тип.Например, тип диапазона для целых чисел будет определяться верхней и нижней границами.Значения в этом типе будут любым числом, которое вписывается в диапазон.Поскольку Java не допускает зависимые типы, по понятной причине, я уверен, нам нужно пойти на компромисс.

Тип диапазона в следующем смешивает переменные типа с переменной значения.Подтипирование позволяет нам задавать типы для определенных диапазонов, например от 0 до 100, которые будут в процентах:

class Range{
  final private int _tLower;
  final private int _tUpper;
  final private int _value;

  protected Range(int lower, int upper, int value){
    _tLower = lower;
    _tUpper = upper;
    _value = value;
    verify();
  }

  private void verify(){
    if(_value <= _tUpper && _value >= _tLower){
      return;
    }
    throw new RuntimeException("Value " + _value + " out of bounds: [" + _tLower + ", " + _tUpper + "]");
  }

  int getValue(){ return _value;}
}

class PercentageInt extends Range{
  public PercentageInt(int value){
    super(0, 100, value);
  }

Тип диапазона можно передавать / возвращать в / из определенных функций.Программист, увидев тип, сразу же передаст необработанные типы Integer или int.

Мотивация

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

Другие примеры I 'Мы думали, что помимо диапазона было бы:

  • Тип неравенства с двумя числами, одно из которых меньше (или равно) другого.
  • Тип строкового регулярного выражения - он содержитстрока и регулярное выражение, которому должна соответствовать эта строка.Подтип будет фиксировать регулярное выражение к чему-то конкретному.

Примечание: все такие типы должны подчиняться либо условию неизменности, либо неизменности в соответствии с их «условием проверки».Например, если бы мы изменили вышеупомянутый тип Range, чтобы позволить значению, которое будет изменяться функциями мутатора, любые такие мутаторы должны лучше сохранять значение в том же диапазоне.

Формальные альтернативы - и почему они нецелесообразны

  • JML (язык моделирования Java) .Это позволяет аннотировать методы с предварительными и последующими условиями в стиле логики Хоара.Ho
  • соответствие Говарда-Карри на Java .Как и JML, это кажется слишком «тяжелым», чтобы иметь практическую ценность.Программист должен доказать доказательства того, что предпосылка (и) подразумевает заключение, что делает кодирование намного более сложным.Кроме того, это означает, что без специальной модификации javac или введения внешнего инструмента, такого как JML, объекты доказательства необходимо переносить в памяти во время выполнения.Это был бы кошмар производительности.
...