Недостатки архитектуры VCL |
Здравствуйте, жители славного Королевства!
VCL далеко не безгрешна, это все знают. Но, программа без ошибки - не программа.
Библиотека, думается, тоже. К мелким и не очень багам все уже давно привыкли,
считают их присутствие делом обычным, и ищут способы борьбы с ними.
Я же хочу уделить внимание другому аспекту проблемы: грубых ошибках в самой
архитектуре VCL. Работая долгое время с Дельфи, я обнаружил, что определенного
количества проблем в написании программ можно было бы избежать, если бы VCL была
спроектирована более строго и однозначно.
Согласен, что тема по большому счету бесперспективная, т. к. изменить что-либо в
архитектуре VCL мы не можем без потери совместимости, но все-таки... Интересно
было бы узнать ваше мнение по теме.
Конкретные факты найденных мною огрехов VCL - отдельным письмом.
Freeman
Всего в теме 284 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Интерфейс. Компоненты и формы
- Компоненты. А нужны ли они вообще?
284—275 | 274—265 | ...>>> Всего сообщений в теме: 284; страниц: 29; текущая страница: 1
№ 284 Удалено модератором | |
№ 283 Удалено модератором | |
№ 282 10-05-2003 15:02 | |
»сообщение 280«
Первый вариант правильный -- его всегда и используй. В перекрытом конструкторе конструктор базового класса нужно вызывать всегда, как и деструктор. Это правило можно нарушать, но сие уже hack.
>>>Стоит ли вообще использовать классовые переменные внутри своих не компонентных классов?
Конечно. Никаких противопоказаний не замечено :-)
№ 281 10-05-2003 14:56 | |
280:
В данном случае оба варианта верны. Но если бы TMyClass наследовался от класса, в котором переопределен конструктор, то вызывать inherited Create обязательно (точнее - объективно нужно. Необходимость опустить данный вызов говорит, скорее всего, о кривой иерархии).
Стоит ли вообще использовать классовые переменные внутри своих не компонентных классов?
Это совершенно обычная практика. Называется это агрегированием. Согласно парадигме ООП необходимо инкапсулировать поле ссылки на включенный объект и предоставить клиентам делегирующие методы. Хотя при большом их числе возможно и отступление от этого правила в целях облегчения будущего расширения.
№ 280 10-05-2003 03:55 | |
Прочитал тут пару книг по Delphi. Ни в одной из них я не нашел конкретного ответа на один важный вопрос касающийся ООП. Имею ввиду использование классовых переменных внутри своих классов (но не компонентов!). Например создаем два класса:
type TSomeClass = class(TObject)
и
type
TMyClass = class(TObject)
SomeClass: TSomeClass;
end;
var
MyClass: TMyClass;
Тогда мы имеем доступ к методам и свойствам обьекта SomeClass, через обьект MyClass. Правилен ли такой подход?
Если да, то как инициализировать переменную SomeClass? Почитав исходный код VCL (ну, и справку), я думаю, что нужно переопределить конструктор и перекрыть деструстор:
type
TMyClass = class(TObject)
SomeClass: TSomeClass;
constructor Create;
destructor Destroy; override;
end;
Знаю два варианта.
Первый:
constructor TMyClass.Create;
begin
inherited Create; // Лучше ли сначала унаследовать главный конструктор?
SomeClass := TSomeClass.Create;
end;
destructor TMyClass.Destroy;
begin
SomeClass.Free;
inherited Destroy;
end;
Второй:
constructor TMyClass.Create;
begin
SomeClass := TSomeClass.Create;
end;
destructor TMyClass.Destroy;
begin
SomeClass.Free;
inherited;
end;
Если оба варианта верны, то какой из них предпочтительней использовать?
Стоит ли вообще использовать классовые переменные внутри своих не компонентных классов? Очень прошу помочь,
так как авторы всех известных мне книг по Delphi старательно избегают расмотрения этих вопросов.
№ 279 17-02-2003 10:23 | |
Trurl, я думаю не стоит человеку пока забивать голову старыми объектами. Пусть бы лучше исходники VCL почитал, штоль...
№ 278 17-02-2003 09:03 | |
As an alternative to class types, you can declare object types using the syntax
type objectTypeName = object (ancestorObjectType)
memberList
end;
№ 277 16-02-2003 12:57 | |
>>>Меня, очевидно, не совсем правильно поняли. Справку я читаю... как правило, ее понимаю. И, конечно, давно знаю о существовании конструктора Create. Просто не додумался его здесь применить, потому что писал программу по аналогии с C++ Builder.
Тут просто нет аналогии для Class member; Есть только для Class *member;
>>>Но не дает покоя такой вопрос:
>>>В C++ Builder очень удобно создавать обьекты одного класса "внутри" другого. Получалась своеобразная цепочка обьектов. В Delphi, по-моему, удобство немного теряется именно из-за использования Create и Free. Пытаюсь высказать примерно следующее:
>>>Созданы два класса TFirstClass, TSecondClass. В классе TFirstClass обьявлена переменная SecondClass типа TSecondClass.
>>>Тогда:
>>>FirstClass:=TFirstClass.Create;
>>>FirstClass.SecondClass:=TSecondClass.Create;
>>>FirstClass.SecondClass.ClVar:=100;
>>>Моя проблема заключается в том, что не знаю точно как быть в данном случае с освобождением памяти (процедура Free). Правильно ли я понимаю, что FirstClass, выступает здесь как владелец SecondClass, и, соответственно, уничтожая владельца, автоматически уничтожаешь все его обьекты? Или же нужно поочередно удалять каждый обьект, а потом владельца. То есть достаточно ли (для хорошей программы) написать так:
>>>FirstClass.Free;
>>>или же необходимо сначала:
>>>FirstClass.SecondClass.Free;
>>>а потом
>>>FirstClass.Free;
>>>Кто нибудь, когда нибудь занимался подобными делами?
Делай по аналогии с C++, считая что у тебя нет объектов, а только указатели на них:
class A{
...
}
class B{
A* a;
}
так он будет владельцем:
class B{
A* a;
B(){
a=new A();
}
~B(){
delete a;
}
}
а так нет:
class B{
A* a;
}
так же и в дельфи.
№ 276 16-02-2003 06:06 | |
Меня, очевидно, не совсем правильно поняли. Справку я читаю... как правило, ее понимаю. И, конечно, давно знаю о существовании конструктора Create. Просто не додумался его здесь применить, потому что писал программу по аналогии с C++ Builder. Но не дает покоя такой вопрос:
В C++ Builder очень удобно создавать обьекты одного класса "внутри" другого. Получалась своеобразная цепочка обьектов. В Delphi, по-моему, удобство немного теряется именно из-за использования Create и Free. Пытаюсь высказать примерно следующее:
Созданы два класса TFirstClass, TSecondClass. В классе TFirstClass обьявлена переменная SecondClass типа TSecondClass.
Тогда:
FirstClass:=TFirstClass.Create;
FirstClass.SecondClass:=TSecondClass.Create;
FirstClass.SecondClass.ClVar:=100;
Моя проблема заключается в том, что не знаю точно как быть в данном случае с освобождением памяти (процедура Free). Правильно ли я понимаю, что FirstClass, выступает здесь как владелец SecondClass, и, соответственно, уничтожая владельца, автоматически уничтожаешь все его обьекты? Или же нужно поочередно удалять каждый обьект, а потом владельца. То есть достаточно ли (для хорошей программы) написать так:
FirstClass.Free;
или же необходимо сначала:
FirstClass.SecondClass.Free;
а потом
FirstClass.Free;
Кто нибудь, когда нибудь занимался подобными делами?
P.S.:
Возможно я где-то допустил ошибки, но думаю сущьность изложенного вам ясна.
>>>Как грустно... :о(((
Думаете мне сейчас весело?
№ 275 12-02-2003 18:48 | |
Профи обычно противопоставляются любителям. Делают одно и то же, но профи получают за это деньги. Супер-профи вроде Вирта могут обидется если их назвать профи, т.к. работают уже не за деньги. Это программеры в законе :)
284—275 | 274—265 | ...>>> Всего сообщений в теме: 284; страниц: 29; текущая страница: 1
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|