У нашому додатку Delphi 2007 ми використовуємо багато наступних конструкцій
FdmBasic:=TdmBasicData(FindOwnerClass(AOwner,TdmBasicData));
FindOwnerClass переміщує ієрархію власника поточного компонента вгору, щоб знайти конкретний клас (у прикладі TdmBasicData). Отриманий об'єкт зберігається у змінній Field FdmBasic. Ми використовуємо це в першу чергу для передачі модулів даних.
Приклад: Під час генерації звіту отримані дані стискаються та зберігаються у полі Blob таблиці, до якої можна отримати доступ через модуль даних TdmReportBaseData. В окремому модулі нашої програми є функція показу даних із звіту у форматі, що охоплюється, за допомогою ReportBuilder. Основний код цього модуля (TdmRBReport), використовує клас TRBTempdatabase для перетворення стислих даних блобу в різні таблиці, які можна використовувати в програмі звітування про виконання часу Reportbuilder. TdmRBReport має доступ до TdmReportBaseData для всіх видів даних про звіт (тип звіту, налаштування розрахунків звітів тощо). TRBTempDatabase побудований у TdmRBReport, але повинен мати доступ до TdmReportBasedata. Отже, це робиться за допомогою конструкції вище:
constructor TRBTempDatabase.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FdmReportBaseData := TdmRBReport(FindOwnerClass(Owner, TdmRBReport)).dmReportBaseData;
end;{- .Create }
Моє відчуття, що це означає, що TRBTempDatabase знає багато свого власника, і мені було цікаво, чи це якийсь запах коду чи антидіаграма.
Які ваші думки з цього приводу? Це кодовий запах? Якщо так, що є кращим способом?