Как вариант, можно совместить оба подхода -- т.е. сеттеры + соответствующие объявления типов.
Типы сделают интерфейс библиотеки более понятным, а сеттеры выполнят валидацию вводимых данных вне зависимости от включенных range checks. Хотя считается, что хороший код должен корректно работать со включенными range checks, кому-то может потребоваться подключить ODFProc к старому проекту, быстро почистить код которого нет возможности.
Класс-обёртка для integer (например)...
Модератор: Модераторы
имхо
Код: Выделить всё
...
type
TPositiveInteger = object
private
FValue: Integer;
end;
operator := (val: Integer) r: TPositiveInteger;
operator := (val: TPositiveInteger) r: Integer;
implementation
...
operator:=(val: Integer)r: TPositiveInteger;
begin
if val = r.FValue then
Exit;
if val <= 0 then
raise EInOutError.Create('Value mast be > 0.')
else
r.FValue := val;
end;
operator:=(val: TPositiveInteger)r: Integer;
begin
r := val.FValue;
end;
...
Есть нюансы:
Поле класса типа TPositiveInteger после создания класса будет нулевое,
а в локальной переменной типа TPositiveInteger вообще будет мусор.
Так что
наверное лишнее.
Поле класса типа TPositiveInteger после создания класса будет нулевое,
а в локальной переменной типа TPositiveInteger вообще будет мусор.
Так что
Код: Выделить всё
if val = r.FValue then
Exit;
наверное лишнее.
- leo_bsv
- постоялец
- Сообщения: 276
- Зарегистрирован: 04.08.2010 16:26:10
- Откуда: Йошкар-Ола
- Контактная информация:
эта ситуация примерно та же что и с типом TColor, это решаемо.
Добавлено спустя 3 часа 57 минут 24 секунды:
для объектов есть возможность определить конструктор и декструктор... в конструкторе наверно можно явно задать необходимое начальное значение...
Добавлено спустя 3 часа 57 минут 24 секунды:
iskander писал(а):Поле класса типа TPositiveInteger после создания класса будет нулевое,
для объектов есть возможность определить конструктор и декструктор... в конструкторе наверно можно явно задать необходимое начальное значение...
