Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.05;
Скачать: CL | DM;

Вниз

Использование объектов для простых типов. Стоит ли?   Найти похожие ветки 

 
Kolan ©   (2006-10-14 20:46) [0]

Здравствуйте,
 В книге Design Patterns  говорится(не буду цитировать, думаю и так повереите :) - используйте объекты даже для простых типов, это не про string или integer, это про например тип "диапазон".
Можно его выразить двумя числами (начало и конец), а можно сделать в виде объекта.

Так вот пользуетесь вы этим предложением? Оборачиваете ли такие веши в объекты?

PS
 С диапазоном попробовал - понравилось. А работать удобно через интерфейс, чтобы о памяти не волноваться...


 
MeF Dei Corvi ©   (2006-10-14 20:50) [1]

ИМХО, если оборачивать, то нарушается принцип KISS


 
Джо ©   (2006-10-14 20:50) [2]

> Так вот пользуетесь вы этим предложением? Оборачиваете ли
> такие веши в объекты?

Случается... :)


 
Kolan ©   (2006-10-14 20:57) [3]


> Джо ©   (14.10.06 20:50) [2]

О вас то я и пождидал:) Вопрос вот с чем связан. У  два типа массивов, которые пользуются очень много где:

TByteArrayObject = class;

 TDoublePoint = record
   X: Double;
   Y: Double;
 end;

 TDoublePointArray = array of TDoublePoint;

 TByteArray = array of Byte;


Хочу переделать их на объекты. Вот думаю стоит ли? И стоит ли оба. TByteArray - может не трогать его?

PS
 Серьезный рефакторинг предстоит, так что можно за одно и это поменять...


 
Джо ©   (2006-10-14 21:02) [4]

TByteArray я бы оставил, как есть.
TDoublePointArray, скорее всего, сделал бы объектом-контейнером. Со своими методами добавления, удаления, доступа к элементам. Плюс методы чтения/сохранения и т.п.
Впрочем, все, как всегда, от задачи зависит :)


 
Джо ©   (2006-10-14 21:04) [5]

P.S. Я не большой любитель всяких формальных методов (не очень в них верю). Как я считаю удобным для формирования нужной мне абстракции, так и делаю :) Поэтому очень многое зависит от того, что в каких дальнейших операциях будут учавствовать упомянутые тобой типы.


 
Kolan ©   (2006-10-14 21:05) [6]


> Впрочем, все, как всегда, от задачи зависит :)

Блиин, я тоже так думаю, правда начал с TByteArray и уже почти доделал... :)

Лана пойду все сотру.. :)


 
Kolan ©   (2006-10-14 21:07) [7]


> Поэтому очень многое зависит от того, что в каких дальнейших
> операциях будут учавствовать упомянутые тобой типы.
>

Так   TDoublePointArray в 3 основных:
1. Отрисовка на TCahrt
2. Данные полученые в TByteArray преврашаются в TDoublePointArray
3. На основе TDoublePointArray вычисляются числа Double или еще один(два..)TDoublePointArray


 
Kolan ©   (2006-10-14 21:11) [8]

Может мне TDoublePointArray вообще через списочек сделать?
А TDoublePoint оставить записью или опятьже объектом?

Забыл в массивчике по 40000 тысяч точек-бывает, а бывает и больше.


 
Джо ©   (2006-10-14 21:15) [9]

Обсуждение лично мне очень интересно, но, к сожалению, приходится из него устраняться — убегаю, дела... :)


 
Kolan ©   (2006-10-14 21:17) [10]


> Обсуждение лично мне очень интересно, но, к сожалению, приходится
> из него устраняться — убегаю, дела... :)

Надеюсь продолжим после :)


 
Юрий Зотов ©   (2006-10-14 21:23) [11]

Буду очень признателен человеку, который внятно обьяснит мне, какие преимущества имеет объект перед своим прототипом вида
TDoublePoint = record
 X: Double;
 Y: Double;
end;


 
Kolan ©   (2006-10-14 21:33) [12]


> Буду очень признателен человеку, который внятно обьяснит
> мне, какие преимущества имеет объект перед своим прототипом
> вида

Я заметил, что с первого взгляда кажется, что объект не будет имет "+". Их понимаешь потом, когда что-то понадобится.

Пример с диапазоном.
Казалось бы тоже два числа. Однако в процессе использования понадобилось расчитать длину: Конец-Начало. Естественно я в класс включил. Теперь всегда под рукой.

Пример с TDoublePointArray уже вижу что в класс засуну разные ф-ции обработки, например пересечение графика(этот массив-это график) с прямой и тд...

Вот с TDoublePoint пока не знаю, может понадобится.

Кроме того если и TDoublePoint и TDoublePointArray объекты, создавать TDoublePoint буду с помощью фабричного метеда, те в будущем смогу добавить что-то не изменяю остальной код...


 
TUser ©   (2006-10-14 21:38) [13]

Имхо, не стоит. И не пользуюсь. Другое дело, если вокруг простого типа надо какие-то оберточные пассы совершать. А Иначе это напоминает метод SetTrueIfFalseOrSetFalse IfTrue (c).


 
MeF Dei Corvi ©   (2006-10-14 21:52) [14]


> Казалось бы тоже два числа. Однако в процессе использования
> понадобилось расчитать длину: Конец-Начало. Естественно
> я в класс включил.

А почему сразу в класс? Почему не

TRange = record
 First, End: Integer;
 function Length: Integer;
end;


 
vidiv ©   (2006-10-14 22:03) [15]


> TRange = record
>  First, End: Integer;
>  function Length: Integer;
> end;

опа.... пойду проверю...


 
MeF Dei Corvi ©   (2006-10-14 22:03) [16]


> опа.... пойду проверю...

Сорри. Забыл указать, что BDS2006 needed...


 
vidiv ©   (2006-10-14 22:04) [17]


> > TRange = record
> >  First, End: Integer;
> >  function Length: Integer;
> > end;
>
> опа.... пойду проверю...

обманщик :(


 
Kolan ©   (2006-10-14 22:06) [18]


> TRange = record
>  First, End: Integer;
>  function Length: Integer;
> end;

2 причины:
1. Еще не отложилось что так можно.

2. Для объекта можно наследника сделать...


 
Petr V. Abramov ©   (2006-10-14 22:11) [19]

имеет смысл, если появлятся методы. в крайнем случае недолго и переделать, что у доступа к record, что у доступа к объекту синтаксис одинаковый


 
Petr V. Abramov ©   (2006-10-14 22:12) [20]

насчет диапазона - имеет смысл, т.к. в методе set можно сразу сделать проверку корректности (например, конец не меньше начала)


 
TUser ©   (2006-10-14 22:13) [21]


> имеет смысл, если появлятся методы

Можно написать обьычную процедуру и туда передавать в явном виде параметр. Реально смысл есть, еслит будет наследование.


 
Petr V. Abramov ©   (2006-10-14 22:15) [22]

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


 
Джо ©   (2006-10-14 22:52) [23]

> [21] TUser ©   (14.10.06 22:13)
>
> > имеет смысл, если появлятся методы
>
> Можно написать обьычную процедуру и туда передавать в явном
> виде параметр. Реально смысл есть, еслит будет наследование.

Вклинюсь на минутку...
То, что у объекта есть свойство Length — гораздо проще запомнить и понять, чем то, что где-то (в каком-то там модуле) есть специальная процедура для вычисления его Length. А если этих функций с десяток? Это всего лишь одно (пусть, небольшое), но, ИМХО, преимущество.


 
Kolan ©   (2006-10-14 23:00) [24]

Короче за завтра переделаю проектик(небольшой) доложу о плюсах, которые получил.


 
Kolan ©   (2006-10-14 23:20) [25]

Уже сейчас скажу что кода будет меньше. Пока получается не намного меньше, но меньше:
Было:
 SetLength(ImaginativePart, Range.Length);
 I := Range.LeftAge;
 while I <= Range.RightAge do
 begin
   ImaginativePart[I].X := I;
   ImaginativePart[I].Y := EvalImaginativeConductivity(I, C);
   I := I + Range.Step;
 end;


Стало:
 I := Range.LeftAge;
 while I <= Range.RightAge do
 begin
   RealPart.Add(TDoublePointObject.Create(I, EvalRealConductivity(R)));
   I := I + Range.Step;
 end;


То что вверху  ImaginativePart а внизу RealPart не вожно.


 
Kolan ©   (2006-10-15 11:50) [26]

Вообщем переделал. Сделал точку - объектом, массив точек через TObjectList.
Вот результат по времени:


Колво точек Массив Объект
50000     32       15
100000    62      15
500000    328      125


Мой вывод. для часто используемых сущностей и для большого кол-ва данных не годится.. :(


 
Игорь Шевченко ©   (2006-10-16 01:40) [27]


> Мой вывод. для часто используемых сущностей и для большого
> кол-ва данных не годится.. :(


Всякий овощ приносит пользу будучи употреблен надлежащим образом в надлежащее время.

Есть такое слово - инкапсуляция, оно действительно хорошо, когда не надо никому раскрывать внутренней реализации объекта, неважно, большой он или маленький. Например AnsiString и Variant в Delphi, которые по сути тоже являются объектами с классической точки зрения, другое дело, что вызовы методов этих объектов (неявные) генерируются компилятором.

И ничего, годятся для частого использования и для большой количества данных тоже...


 
icWasya ©   (2006-10-16 17:42) [28]

Если слишком часто делать
 SetLength(X,1+Length(X))
то лучше использовать объекты


 
TUser ©   (2006-10-16 17:45) [29]


> То, что у объекта есть свойство Length — гораздо проще запомнить
> и понять, чем то, что где-то (в каком-то там модуле) есть
> специальная процедура для вычисления его Length. А если
> этих функций с десяток? Это всего лишь одно (пусть, небольшое),
>  но, ИМХО, преимущество.

Дело привычки, имхо.



Страницы: 1 вся ветка

Текущий архив: 2006.11.05;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.069 c
15-1160886789
ира
2006-10-15 08:33
2006.11.05
клавиатура


2-1161201316
Meganop
2006-10-18 23:55
2006.11.05
Вопрос про массив.


3-1157532896
SergP.
2006-09-06 12:54
2006.11.05
Как предотвратить "обрезание" полей?


2-1161095085
Виктория
2006-10-17 18:24
2006.11.05
Программа "Угадай число"


15-1161139835
Slider007
2006-10-18 06:50
2006.11.05
С днем рождения ! 18 октября