In unserer Delphi 2007-Anwendung verwenden wir viele der folgenden Konstrukte
FdmBasic:=TdmBasicData(FindOwnerClass(AOwner,TdmBasicData));
Die FindOwnerClass wandert die Eigentümerhierarchie der aktuellen Komponente nach oben, um eine bestimmte Klasse zu finden (im Beispiel TdmBasicData). Das resultierende Objekt wird in der Feldvariablen FdmBasic gespeichert. Wir verwenden dies hauptsächlich, um Datenmodule weiterzugeben.
Beispiel: Beim Generieren eines Berichts werden die resultierenden Daten komprimiert und in einem Blob-Feld einer Tabelle gespeichert, auf die über ein Datenmodul TdmReportBaseData zugegriffen wird. In einem separaten Modul unserer Anwendung gibt es Funktionen zum Anzeigen der Daten aus dem Bericht in einer Seitenform mit ReportBuilder. Der Hauptcode dieses Moduls (TdmRBReport) verwendet eine Klasse TRBTempdatabase, um die komprimierten Blob-Daten in verschiedene Tabellen zu konvertieren, die im Reportbuilder-Laufzeit-Reportdesigner verwendet werden können. TdmRBReport hat Zugriff auf TdmReportBaseData für alle Arten von berichtbezogenen Daten (Berichtstyp, Berichtsberechnungseinstellungen usw.). TRBTempDatabase wird in TdmRBReport erstellt, muss jedoch Zugriff auf TdmReportBasedata haben. Dies geschieht nun mit der obigen Konstruktion:
constructor TRBTempDatabase.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FdmReportBaseData := TdmRBReport(FindOwnerClass(Owner, TdmRBReport)).dmReportBaseData;
end;{- .Create }
Mein Gefühl ist, dass dies bedeutet, dass TRBTempDatabase viel von seinem Besitzer kennt, und ich habe mich gefragt, ob dies eine Art Codegeruch oder Anti-Pattern ist.
Was denkst du darüber? Ist das ein Code-Geruch? Wenn ja, was ist ein besserer Weg?