Dans notre application Delphi 2007, nous utilisons un grand nombre des constructions suivantes
FdmBasic:=TdmBasicData(FindOwnerClass(AOwner,TdmBasicData));
FindOwnerClass parcourt la hiérarchie Propriétaire du composant actuel vers le haut pour rechercher une classe spécifique (dans l'exemple TdmBasicData). L'objet résultant est stocké dans la variable de champ FdmBasic. Nous l'utilisons principalement pour transmettre des modules de données.
Exemple: lors de la génération d'un rapport, les données résultantes sont compressées et stockées dans un champ Blob d'une table accessible via un module de données TdmReportBaseData. Dans un module distinct de notre application, il existe une fonctionnalité pour afficher les données du rapport sous une forme paginée à l'aide de ReportBuilder. Le code principal de ce module (TdmRBReport), utilise une classe TRBTempdatabase pour convertir les données de blob compressées en différentes tables qui sont utilisables dans le Reportdesigner d'exécution Reportdesigner. TdmRBReport a accès à TdmReportBaseData pour toutes sortes de données liées au rapport (type de rapport, paramètres de calcul de rapport, etc.). TRBTempDatabase est construit dans TdmRBReport mais doit avoir accès à TdmReportBasedata. Donc, cela se fait maintenant en utilisant la construction ci-dessus:
constructor TRBTempDatabase.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FdmReportBaseData := TdmRBReport(FindOwnerClass(Owner, TdmRBReport)).dmReportBaseData;
end;{- .Create }
Mon sentiment est que cela signifie que TRBTempDatabase connaît beaucoup de son propriétaire, et je me demandais s'il s'agissait d'une sorte d'odeur de code ou d'Anti-pattern.
Qu'en pensez-vous? Est-ce une odeur de code? Si oui, quelle est la meilleure façon?