Что можно делать в конструкторе?
От: myaso  
Дата: 21.12.04 12:55
Оценка:
Всем привет!

Сабж. Что тут можно делать, имеется ввиду какие операции тут было бы правильно разместить, а какие нет?
Вопрос родился на почве следущей ситуации, есть интерфейс с двумя методами get_count и get_item. Типа коллекции. Элементы коллекции передаются например серез пайп(не суть, с того же файла считываются). То есть, при создании объекта предоставляющего этот интерфейс надо, в случаее пайпа, приконектиться к пайпу, получить данные заполнить коллекцию... Сейчас я это делаю на этапе создания объекта. Тоесть в конструкторе. Это нормально? Это не коверкает какои либо постулаты ООП? :) Или лучше разместить это сделать при первом вызове например get_count?

Заранее спасибо!
Re: Что можно делать в конструкторе?
От: Larev  
Дата: 21.12.04 13:18
Оценка: 3 (1)
Здравствуйте, myaso, Вы писали:

M>Всем привет!


M>Сабж. Что тут можно делать, имеется ввиду какие операции тут было бы правильно разместить, а какие нет?

M>Вопрос родился на почве следущей ситуации, есть интерфейс с двумя методами get_count и get_item. Типа коллекции. Элементы коллекции передаются например серез пайп(не суть, с того же файла считываются). То есть, при создании объекта предоставляющего этот интерфейс надо, в случаее пайпа, приконектиться к пайпу, получить данные заполнить коллекцию... Сейчас я это делаю на этапе создания объекта. Тоесть в конструкторе. Это нормально? Это не коверкает какои либо постулаты ООП? Или лучше разместить это сделать при первом вызове например get_count?

В конструкторе не совсем хорошо делать действия, если есть вероятность, что объект будет создан раньше, чем то, с помощью чего объект, например инициализируется (в данном случае пайп). Лучше это вынести за пределы конструктора в кокой-нибудь метод, чтобы контролировать эти действия, поскольку если вы захотите объявить объект (допустим сделать членом класса), то не остается другого способа, как объявить указатель, а потом когда это станет возможно выделить память под объект. А если вынести из конструктора, то не надо об этом заботиться, а вызвать метод в нужный момент.
Короче из всего сказанного, в конструкторе нужно выполнять только те дейтвия, которые не зависят от внешних факторов, условий и возможно не созданных еще объектов.

M>Заранее спасибо!
Re[2]: Что можно делать в конструкторе?
От: myaso  
Дата: 21.12.04 14:01
Оценка:
Здравствуйте, Larev, Вы писали:

L>В конструкторе не совсем хорошо делать действия, если есть вероятность, что объект будет создан раньше, чем то, с помощью чего объект, например инициализируется (в данном случае пайп). Лучше это вынести за пределы конструктора в кокой-нибудь метод, чтобы контролировать эти действия, поскольку если вы захотите объявить объект (допустим сделать членом класса), то не остается другого способа, как объявить указатель, а потом когда это станет возможно выделить память под объект. А если вынести из конструктора, то не надо об этом заботиться, а вызвать метод в нужный момент.

L>Короче из всего сказанного, в конструкторе нужно выполнять только те дейтвия, которые не зависят от внешних факторов, условий и возможно не созданных еще объектов.

мг. хорошо. получается если я не хочу ломать интерфейс. то мне нужно вызывать это наполнение коллекции при перовом вызове какго либо метода этого интерфейса. Получается только так...
Изначально в интерфейсе я предусмотрел что-то типа метода FillCollection, но мне сказали что это сакс, мол это всё надо скрыть от юзера. И я как бы с этим согласен, поэтому убрал этот метод. Теперь получается что вызов из конструктора коряво, сделать как я описал выше тоже коряво... Откуда ж позвать его? :)
Я понимаю что идеальных ситуаций не бывает и всё сделать красиво не получиться. но....
Re: Что можно делать в конструкторе?
От: GlebZ Россия  
Дата: 21.12.04 14:06
Оценка: -1
Здравствуйте, myaso, Вы писали:

Зависит от многого, например от языка.
Например для C# есть очень удобная конструкция:


using (FileStream file=new FileStream(...))
{
//здесь работа с файлом
....
}

Таким образом, гарантируется закрытие и открытие файла через конструктор и dispose.
В дельфе, я бы так не рискнул.

С уважением, Gleb.
Re[2]: Что можно делать в конструкторе?
От: kavlad Россия http://www.wavesoft.ru
Дата: 22.12.04 15:09
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>В дельфе, я бы так не рискнул.


Зря
... По ушам лупит My Dying Bride — Sear Me MCMXCIII
Re[3]: Что можно делать в конструкторе?
От: GlebZ Россия  
Дата: 22.12.04 16:47
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, GlebZ, Вы писали:


GZ>>В дельфе, я бы так не рискнул.


K>Зря

Аргументируй. Например, напиши подобную конструкцию.

С уважением, Gleb.
Re[4]: Что можно делать в конструкторе?
От: kavlad Россия http://www.wavesoft.ru
Дата: 22.12.04 18:01
Оценка: -1
Здравствуйте, GlebZ, Вы писали:

GZ>Аргументируй. Например, напиши подобную конструкцию.


constructor Create(AFile: TFileStream);
begin
  FFile := AFile;
end;

destructor Destroy;
begin
  FreeAndil(FFile);
end;

MyObjVar := TMyObject.Create(TFileStream.Create(...))
... По ушам лупит My Dying Bride — I Am The Bloody Earth
Re[5]: Что можно делать в конструкторе?
От: GlebZ Россия  
Дата: 22.12.04 18:24
Оценка: +1
Здравствуйте, kavlad, Вы писали:

Не сами конструкторы, а их использование, как это написал я для C#. То есть:

TMyObject myObject:=TMyObject.Create(....);
try
   некоторая логика


finally
   myObject.Free;
end;


Что более похоже на правду.
Так что можно и в Delphi, хотя я обычно стараюсь вынести подобную логику из конструктора. Явный вызов деструктора очень колебает, особенно когда пишешь на 3 языках одновременно. Начинаешь боятся того, что автоматизировано в других языках.

С уважением, Gleb.
Re[6]: Что можно делать в конструкторе?
От: kavlad Россия http://www.wavesoft.ru
Дата: 23.12.04 07:02
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Начинаешь боятся того, что автоматизировано в других языках.


Re[4]: Smart pointers(деструкторы) в у Delphi
Автор: kavlad
Дата: 24.02.04
... По ушам лупит начальство
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.