Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.051 c
15-1160936200
Сало
2006-10-15 22:16
2006.11.05
61 MIPS. Какой это проц?


2-1161101504
Golik
2006-10-17 20:11
2006.11.05
Поиск в БД


2-1161085423
L15
2006-10-17 15:43
2006.11.05
Создание Теста на Делфи


15-1160668265
menart
2006-10-12 19:51
2006.11.05
Modbus


4-1150724006
novill
2006-06-19 17:33
2006.11.05
Заняты ли "горячие клавиши"? Или получить список активных?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский