Как стать автором
Обновить

Комментарии 13

О Паскале мало статей, спасибо за старания. Но всё очень умозрительно, прочёл без интереса, лезть в код, что бы понять о чём статья — совсем не интересно.
Мир тесен. Писал такую же штуку на Шарпе для сохранения и загрузки параметров отчетов. На Дельфях тоже приходится писать. Начинаю тесты добавлять в легаси, там где возможно.
За статью — спасибо.

Не всегда можно тесты добавить. В Delphi многие пишут код прямо в обработчике события.

Что мешает написать внешний класс, заинжектить его в конструктор и в обработчике события вызывать метод этого класса?
Советую использовать const в параметрах магических типов к коим относится string.
отсутствие const скрытно добавляет в код (см CPU Window)
Param.AddRef
try

fynally
Param.DeleteRef
end

На первый взгляд, безусловно, справедливое замечание. Если бы не одно но.


По сути это микрооптимизация. Если бы речь шла о высокоскоростной обработке больших массивов данных, я бы с Вами согласился на все сто процентов. Но здесь идёт речь о реакциях на события пользовательского интерфейса на десктопе. Положительный эффект по этой причине будет, скажем прямо, неощутимым. Станет ли оно настолько же лучше, насколько, в результате, дороже (дольше писать, дольше читать)?


При этом обратите также внимание на использование интерфейсов. В Дельфи они наряду со строками управляются чёрной магией. Каждое присваивание переменной интерфейса, каждое удаление непустой переменной со стека (при завершении метода), каждая передача в параметрах — это вызов методов подсчёта ссылок:


function TInterfacedObject._AddRef: Integer;
begin
  Result := InterlockedIncrement(FRefCount);
end;

function TInterfacedObject._Release: Integer;
begin
  Result := InterlockedDecrement(FRefCount);
  if Result = 0 then
    Destroy;
end;

Если фанатеть по микрооптимизации, то интерфейсы тоже надо гнать поганой метлой. Зато бонусом при их использовании можно совсем не дёргаться по поводу ручного управления памятью, что тоже плюс.

const для ссылочных — это не микрооптимизация, а гигиена кода; такая же, как выбор const/var при передаче структур, чтобы на класть их на стек
Интересно, конечно. Но разбираться с кодом ради этого не особо хочется
Мне кажется с интерфейсами в delphi сделали какой то ужас… Вот тебе Делфи с ручным управлением памятью и вот тебе на… интерфейсы с подсчетом ссылок и с ними тебе надо работать по другому, не так как ты работаешь обычно с классами… Вот это полиморфизм, вот это тебе все ваши эти ООП… Кто это сотворил?

Да, это кажется странным… Да и не только кажется, это на самом деле странно.


Исторически, если я не ошибаюсь, это выросло из роли интерфейсов в Delphi как средства доступа к COM-объектам. А вопрос "кто это сотворил" предлагаю заменить на "когда это сделали" (середина — начало второй половины 90-х, когда тот ещё угар в прикладном программировании творился) и "зачем" (чтобы переманить народ с Visual Basic, как вариант). VCL вообще много скрывает от нас в части работы с памятью (концепция объектов-владельцев) — всё для того, чтобы предпенсионного возраста тётушка из АСУП не была озабочена избыточными для её роли ритуалами, реализуя свой многолетний опыт в предметной области. Ну, или вьюнош со взором горящим не терял леса за деревьями. Практика в ущерб науке, которая тогда ещё и не родилась толком.


Можно, кстати, вместо TInterfacedObject использовать базовый класс без подсчёта ссылок и рулить памятью вручную, никто не запрещал.


Коротко и по существу об этом ответили здесь: https://stackoverflow.com/questions/22196129/why-delphi-objects-that-implement-interfaces-need-to-be-reference-counted

Можно, кстати, вместо TInterfacedObject использовать базовый класс без подсчёта ссылок и рулить памятью вручную, никто не запрещал.

но при этом истратить на это единственную возможность отнаследоваться.
Любой из обходных путей не дает в Delphi нормально пользоваться интерфейсами. А решение могло быть таким простым: голый Interface и унаследованный от него какой-нибудь ComInterface с подсчетом ссылок. Поэтому и возникает вопрос кто это сделал??? Почему желая использовать интерфейсы я вынужден зависеть от не нужной мне функциональности.
но при этом истратить на это единственную возможность отнаследоваться.

Если Вы пишете реализацию с нуля — это не проблема, а бойлерплейт. Если наследуете что угодно другое — это тоже не проблема, а бойлерплейт, только вместо базового класса методы будут добавлены в Вашу реализацию (на любом уровне иерархии). Если для Вас бойлерплейт — проблема, то просто бегайте от подобной работы, и будет Вам хорошо, если не припрёт.


Почему желая использовать интерфейсы я вынужден зависеть от не нужной мне функциональности.

Потому, что за Вас решили, что Вам это надо. Ошиблись, бывает. Наука и технология разработки ПО были ещё совсем не о том.


Когда создавали Delphi, во главе угла стояли совсем иные проблемы: скрыть от прикладного программиста бесчеловечный WIN API. Собственно, изначально VCL — это, по сути, обёртка над функциями Win API плюс фреймворк TApplication. И это был 1995 год. Для примера, святой равноапостольный Дядя Боб примерно в те годы (читайте ретроспективные фрагменты в его "Чистой архитектуре") ещё изо всех сил набивал свои великоучёные шишки, чуть не похоронив эпический проект с модульной структурой из-за серьёзных архитектурных просчётов. Впрочем, его команда смогла признать, что они облажались, и (чудо!) убедить инвестора в необходимости продолжить работу, откатившись при этом существенно назад.


Интерфейсы в Delphi добавились в 1998. Это была эпоха добавления и становления технологий межпрограммного взаимодействия. ПО перестало быть "вещью в себе" и начало социализироваться, что ли… Каждая новая принципиальная возможность со стороны ОС должна была немедленно выводиться на рынок в средствах разработки. Думать некогда, надо сделать ещё вчера. Опоздавший проигрывал.


При этом ещё раз напомню: принципы SOLID (в том числе Intrface segregation principle), как единый комплекс, были сформулированы в 2000-м году — ПОЗЖЕ создания VCL, ПОЗЖЕ появления интерфейсов в Delphi. Общее признание они заработали ещё позже! А "традиционная" версия Delphi 7 вышла в 2002 году.


Вы поймите, я не агитирую за использование древних средств разработки, и не утверждаю, что они соответствуют современным требованиям. В статье я говорю о том, что боль от вынужденного их применения вполне можно уменьшить, и при этом новые инструменты в рамках проекта не обязаны наследовать старую ментальность. Впрочем, жать и натирать в целом оно всё равно будет.

Спасибо за экскурс в историю! теперь все с ними ясно )

p.s. мог бы голосовать, поставил бы вам +
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории