Em nossa aplicação Delphi 2007, estamos usando muitas das seguintes construções
FdmBasic:=TdmBasicData(FindOwnerClass(AOwner,TdmBasicData));
O FindOwnerClass percorre a hierarquia do proprietário do componente atual para cima para encontrar uma classe específica (no exemplo TdmBasicData). O objeto resultante é armazenado na variável de campo FdmBasic. Usamos isso principalmente para repassar os módulos de dados.
Exemplo: ao gerar um relatório, os dados resultantes são compactados e armazenados em um campo Blob de uma tabela acessada por meio de um módulo de dados TdmReportBaseData. Em um módulo separado do nosso aplicativo, há funcionalidade para mostrar os dados do relatório em um formulário Paginado usando o ReportBuilder. O código principal deste módulo (TdmRBReport) usa uma classe TRBTempdatabase para converter os dados compactados do blob em diferentes tabelas que são utilizáveis no Reportbuilder runtime reportdesigner. O TdmRBReport tem acesso ao TdmReportBaseData para todos os tipos de dados relacionados ao relatório (tipo de relatório, configurações de cálculos de relatório etc.). TRBTempDatabase é construído em TdmRBReport, mas precisa ter acesso a TdmReportBasedata. Portanto, isso agora é feito usando a construção acima:
constructor TRBTempDatabase.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FdmReportBaseData := TdmRBReport(FindOwnerClass(Owner, TdmRBReport)).dmReportBaseData;
end;{- .Create }
Meu sentimento é que isso significa que o TRBTempDatabase conhece muito de seu proprietário, e eu queria saber se isso é algum tipo de cheiro de código ou Anti-padrão.
Quais são seus pensamentos sobre isso? Isso é um cheiro de código? Se sim, qual é a melhor maneira?