Nella nostra applicazione Delphi 2007 utilizziamo molti dei seguenti costrutti
FdmBasic:=TdmBasicData(FindOwnerClass(AOwner,TdmBasicData));
FindOwnerClass percorre la gerarchia di proprietari del componente corrente verso l'alto per trovare una classe specifica (nell'esempio TdmBasicData). L'oggetto risultante è memorizzato nella variabile Field FdmBasic. Lo usiamo principalmente per passare i datamoduli.
Esempio: Quando si genera un report, i dati risultanti vengono compressi e archiviati in un campo Blob di una tabella a cui si accede tramite un datamodule TdmReportBaseData. In un modulo separato della nostra applicazione, c'è la funzionalità per mostrare i dati dal report in un modulo Paged usando ReportBuilder. Il codice principale di questo modulo (TdmRBReport), utilizza una classe TRBTempdatabase per convertire i dati del blob compresso in diverse tabelle utilizzabili nel runtime di Reportbuilder runtimedesigner. TdmRBReport ha accesso a TdmReportBaseData per tutti i tipi di dati relativi ai report (tipo di report, impostazioni di calcolo dei report, ecc.). TRBTempDatabase è costruito in TdmRBReport ma deve avere accesso a TdmReportBasedata. Quindi questo è ora fatto usando la costruzione sopra:
constructor TRBTempDatabase.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FdmReportBaseData := TdmRBReport(FindOwnerClass(Owner, TdmRBReport)).dmReportBaseData;
end;{- .Create }
Il mio sentimento è che questo significa che TRBTempDatabase conosce molto del suo proprietario e mi chiedevo se si tratta di una sorta di odore di codice o Anti-pattern.
Cosa ne pensi di questo? È un odore di codice? Se sì, qual è il modo migliore?