Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Аномалия в Delphi


Автор: Akella 4.7.2005, 12:05
Вот, вычитал
http://www.rsdn.ru/article/delphi/delphianomaly.xml

Автор: December 4.7.2005, 14:19
Как-то смутно видится применение этой фишки на практике... А тот факт, что AV появляется внутри метода ИМХО не так уж и важен - какие шансы у Delphi противостоять кривым рукам девелупера? Скорее всего, Борланд даже не пытался что-нибудь сделать в этом направлении.

Автор: Петрович 7.7.2005, 19:30
Цитата(December @ 4.7.2005, 15:19)
Скорее всего, Борланд даже не пытался что-нибудь сделать в этом направлении.

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

Автор: p0s0l 8.7.2005, 00:11
Небольшие коментарии по статье:
Цитата
Меня заинтересовал один момент в Delphi – почему, когда я забываю создать объект класса, программа вываливается, тем не менее, только внутри метода?
Ctrl+Alt+C, и это узнаётся в 5 сек, без всяких извратов с Self'ами, но это так, для вступления smile
Цитата
Как видно, доступ к свойству и методу абсолютно свободен. Но это – широко известная аномалия защиты Delphi, заключающаяся в том, что код имеет доступ ко всем (даже приватным) данным и методам классов, описанных в том же модуле.
Единственный человеческий способ создания дружественных классов в Delphi незаслужено назван "аномалией в защите"... Если б этой "аномалии" не было, то большая часть VCL не смогла бы откомпилиться, т.к. классы любят брать друг у друга приватные и защищенные значения, вызывать методы... Без этой фичи пришлось бы прибегать к ненужным наворотам и извратам.
Цитата
Он содержит одну локальную переменную, память под которую опять же выделяется при компиляции класса!
Память под локальные переменные выделяется во время исполнения. Во время компиляции максимум что может произойти - это сгенерится add esp, -xxx, но в данном случае, для одной переменной даже выделять память в стеке не стоит, обойдёмся регистром...
Цитата
Меня заинтересовал один момент в Delphi – почему, когда я забываю создать объект класса, программа вываливается, тем не менее, только внутри метода?
Это не относится к виртуальным методам, т.к. вначале нужно узнать, какой наследник создан, и из его таблицы виртуальных методов (vmt) класса узнать адрес метода, и только тогда уже вызывать (а до вызова дело не дойдёт). Если объект не создан, в лучшем случае будет AV. (Тоже самое касается динамических методов).

Ну а вообщем-то, самое интересное, я совсем не понял, про какие аномалии говорится в статье ?
Первая аномалия четко озвучена - это "аномалия защиты доступа к приватным данным". Аномалией назвать можно, но сегодня это уже не аномалия, а фича, которой все пользуются. Кому надо защиту, те разделяют классы по разным модулям. Возможно, Borland изначально это так и задумывала, как незамысловатый способ создания дружественных классов.

Другие же аномалии уже не озвучены, приходится догадываться, какие аномалии имелись в виду.

1. Если имеется в виду возможность изменения Self - то в принципе это ерунда, какой дурак будет её менять ? Это может пригодиться только в редких случаях. Да и в любом случае, Self - лишь локальный параметр, защищать его особого смысла нет.
Т.к. Self - лишь просто параметр (хоть и неявный), то в принципе, в приведенном примере я мог бы сделать так:
Код
function TSomeClass.SomeFunc(pParam : Integer; var pSelf : TSomeClass): Integer;
var
  i : Integer;
  MySelf : TSomeClass;
begin
  MySelf := TSomeClass.Create;
  pSelf := MySelf;
  Result := 0;
  for i := 1 to pParam do
    Result := Result + i;
  MySelf.FProperty := Result;
end;
(или MySelf убрать и сразу юзать pSelf)... Так что тут никакой аномалии я не вижу, т.к. всё логично и закономерно.

2. Если под аномалией понимается факт того, что AV возникает не до вызова метода, а в самом методе - то тут уж ничего не поделаешь. Это не аномалия Delphi, это так оно и есть. Не производить же проверку валидности ссылки перед каждым вызовом метода ? smile Это приведет лишь к раздуванию и замедлению кода.
Такой же ярлык аномалии можно повесить на многие другие языки программирования, например, VC.

Больше ничего, что можно было бы отнести к аномалиям, я не нашёл...
Поэтому, имхо, статья в итоге поставленной темы не раскрывает (хотя новичкам будет интересна).

PS: всё это скромное имхо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)