W naszej aplikacji Delphi 2007 używamy wielu następujących konstrukcji
FdmBasic:=TdmBasicData(FindOwnerClass(AOwner,TdmBasicData));
FindOwnerClass podróżuje w górę hierarchii właściciela bieżącego komponentu w celu znalezienia określonej klasy (w przykładzie TdmBasicData). Powstały obiekt jest przechowywany w zmiennej Field FdmBasic. Używamy tego przede wszystkim do przekazywania modułów danych.
Przykład: podczas generowania raportu dane wynikowe są kompresowane i przechowywane w polu Blob tabeli dostępnej przez moduł danych TdmReportBaseData. W oddzielnym module naszej aplikacji jest funkcjonalność umożliwiająca wyświetlanie danych z raportu w formie stronicowanej przy użyciu ReportBuilder. Główny kod tego modułu (TdmRBReport) wykorzystuje klasę TRBTempdatabase do konwersji skompresowanych danych obiektów blob na różne tabele, które można wykorzystać w narzędziu Reportdesigner środowiska wykonawczego Reportbuilder. TdmRBReport ma dostęp do TdmReportBaseData dla wszystkich rodzajów danych związanych z raportem (rodzaj raportu, ustawienia obliczeń raportów itp.). TRBTempDatabase jest zbudowany w TdmRBReport, ale musi mieć dostęp do TdmReportBasedata. Jest to teraz wykonywane przy użyciu powyższej konstrukcji:
constructor TRBTempDatabase.Create(aOwner: TComponent);
begin
inherited Create(aOwner);
FdmReportBaseData := TdmRBReport(FindOwnerClass(Owner, TdmRBReport)).dmReportBaseData;
end;{- .Create }
Mam wrażenie, że oznacza to, że TRBTempDatabase zna wielu swoich właścicieli i zastanawiałem się, czy to jest jakiś zapach kodu lub anty-wzór.
Co o tym sądzisz? Czy to zapach kodu? Jeśli tak, jaki jest lepszy sposób?