Класс-обёртка для integer (например)...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Как вариант, можно совместить оба подхода -- т.е. сеттеры + соответствующие объявления типов.
Типы сделают интерфейс библиотеки более понятным, а сеттеры выполнят валидацию вводимых данных вне зависимости от включенных range checks. Хотя считается, что хороший код должен корректно работать со включенными range checks, кому-то может потребоваться подключить ODFProc к старому проекту, быстро почистить код которого нет возможности.
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

имхо

Код: Выделить всё

...
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;
...
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

iskander писал(а):имхо

вот и я тоже склоняюсь к такому решению...
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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

Код: Выделить всё

  if val = r.FValue then
    Exit;

наверное лишнее.
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

эта ситуация примерно та же что и с типом TColor, это решаемо.

Добавлено спустя 3 часа 57 минут 24 секунды:
iskander писал(а):Поле класса типа TPositiveInteger после создания класса будет нулевое,

для объектов есть возможность определить конструктор и декструктор... в конструкторе наверно можно явно задать необходимое начальное значение...
Ответить