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

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

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

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

Сообщение Odyssey » 14.01.2012 21:17:57

Как вариант, можно совместить оба подхода -- т.е. сеттеры + соответствующие объявления типов.
Типы сделают интерфейс библиотеки более понятным, а сеттеры выполнят валидацию вводимых данных вне зависимости от включенных range checks. Хотя считается, что хороший код должен корректно работать со включенными range checks, кому-то может потребоваться подключить ODFProc к старому проекту, быстро почистить код которого нет возможности.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

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

Сообщение iskander » 14.01.2012 23:27:29

имхо
Код: Выделить всё
...
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;
...
iskander
энтузиаст
 
Сообщения: 623
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение leo_bsv » 15.01.2012 01:25:52

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

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

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

Сообщение iskander » 15.01.2012 11:23:29

Есть нюансы:
Поле класса типа TPositiveInteger после создания класса будет нулевое,
а в локальной переменной типа TPositiveInteger вообще будет мусор.
Так что
Код: Выделить всё
  if val = r.FValue then
    Exit;

наверное лишнее.
iskander
энтузиаст
 
Сообщения: 623
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение leo_bsv » 15.01.2012 14:41:24

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

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

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

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 250

Рейтинг@Mail.ru