Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Базарная площадь
  
О разделе

Основная страница

Группы обсуждений


Тематический каталог обсуждений

Архив

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  12:50[Войти] | [Зарегистрироваться]
Обсуждение темы:
Недостатки архитектуры 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


    Добавить свое сообщение

    Отслеживать это обсуждение

    Дополнительная навигация:
    Количество сообщений на странице

    Порядок сортировки сообщений
    Новое сообщение вверху списка (сетевая хронология)
    Первое сообщение вверху списка (обычная хронология)

    Перейти на конкретную страницу по номеру
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования