Article View: pl.comp.lang.delphi
Article #346406Re: Circular Unit Reference (Circular Class Reference)
From: immo
Date: Sat, 10 Mar 2018 08:59
Date: Sat, 10 Mar 2018 08:59
125 lines
5909 bytes
5909 bytes
W dniu czwartek, 8 marca 2018 15:08:52 UTC+1 użytkownik wloochacz napisał:
> > No to ...pisz ;-)
> Popieram.
> Bo szczerze to ja nie do końca rozumiem co masz i co chcesz mieć.
Wydawało mi się to jasne i proste to co napisałem.
Dobra - jeszcze raz, ale wyjaśnienie będzie dłuuugie.
Chce mieć w aplikacji jedną klasę Core, z której będzie dostęp do wszystkiego w tej aplikacji, czyli konfiguracji, logiki, fabryki okien, toolsow itd. itp. Singleton. Tak żeby w kodzie aplikacji można było do wszystkiego mieć dostęp pisząc np. coś takiego. Core.Connection.GetNewConnection.ExecSQLScalar.
Dlaczego tak? Bo biorąc wszystko pod uwagę, tak jest najprościej i najbardziej przejrzysto :)
Ale żeby nie było za trywialnie, chcę żeby z samej definicji tej klasy można też było się odwoływać do każdego miejsca w tej klasie, czy to poprzez klasę rodzica, czy przez Core samo z siebie.
Czyli żeby każda klasa która jest w Core miała w sobie przynajmniej wie rzeczy:
Core <- dostęp do głównej klasy Core
i Parent <- dostęp do klasy w której została stworzona ta w której w danym momencie jesteśmy.
Ogólnie każda klasa w Core ma być dziedziczona z klasy bazowej która ma właśnie zdefiniowane te dwie powyżej (Core i Parent).
Mam nadzieję że to jasne.
W tej chwili mam to załatwione przez class helpera :) 8-10 lat temu wydawało mi się to dobre. W sumie działa, ale chciałbym się poduczyć interfejsów, bo na razie to jest stosowałem ale do trochę czegoś innego.
Teraz pokaże jak to mam w kodzie, bo jeśli tamto było nieczytelne, to może to coś wyjaśni:
klasa bazowa: FW.Classes.Core
TCoreClass = class(TObject)
strict private
_CoreObj: TObject;
public
constructor Create(aCore: TObject);
destructor Destroy; override;
property CoreObj: TObject read _CoreObj write _CoreObj;
end;
helper: FW.Helpers.Core
uses
FW.Classes.Core
,FW.Core
;
type
TCoreClassHelper = class helper for TCoreClass
function Core: TCore;
end;
implementation
function TCoreClassHelper.Core: TCore;
begin
if assigned(CoreObj) then
result := CoreObj as TCore
else
result := nil;
end;
Main unit: FW.Core
uses
FW.Classes.Core
,FW.Connection.Main
,FW.Settings.Main
,FW.Tools.Main
,...
;
type
TCore = class(TCoreClass)
strict private
fConnection: TConnection;
fSettings: TSettings;
fTools: TTools;
public
destructor Destroy; override;
procedure Initialize;
function DebugModeOn: boolean;
property Connection: TrisConnection read ConnectionGet write ConnectionSet;
property Settings: TrisSettings read SettingsGet write SettingsSet;
property Tools: TrisTools read ToolsGet write ToolsSet;
end;
gdzie np. ConnectionGet wygląda tak:
function TCore.ConnectionGet: TConnection;
begin
ConnectionCheck;
result := fConnection;
end;
procedure TCore.ConnectionCheck;
begin
if not Assigned(fConnection) then
fConnection := TConnection.Create(Self);
end;
connection: FW.Connection.Main
uses
FW.Classes.Core
,FW.Classes.MSSQLConnection
;
type
TConnection = class(TCoreClass)
strict private
fMain: TMSSQLConnection;
public
destructor Destroy; override;
end;
implementation
uses
FW.Helpers.Core
;
I właśnie chodzi o to uses tutaj (FW.Helpers.Core), to mi daje to, że z każdej klasy która wywodzi się w TCoreClass mogę użyć konstrukcji Core.Connection... cos tam coś tam.
To wszystko powyżej jest poobcinane więc mam nadzieję, że nie uciąłem czegoś co jest istotne :)
I jaki jest problem?
Chciałbym mieć dalej tę samą funkcjonalność ale napisaną dzisiaj :) Dlatego moje pytanie w sumie nie jest jak konkretnie to zrobić, ale jaką drogą iść i jakie macie Wy pomysły na rozwiązanie tego problemu.
Zresztą ten cały "moloch" jest pochodną dyskusji nad frameworkami prowadzonymi w wloochaczem "pare" dobrych lat temu :)
pozdrawiam,
Przemek O.
Technical Details
Message-ID:
<8d0301ff-0c6a-48d3-a311-0765e733e24f@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!r195no566893itc.0!news-out.google.com!a2-v6ni1823ite.0!nntp.google.com!e10-v6no564474itf.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mailReferences:
<06e89078-c8b6-46f1-8353-fe26050464f7@googlegroups.com> <1f7uetk1q6zns.dlg@tyczka.com> <a9a0ea51-cda4-4d78-b162-30263f6da079@googlegroups.com> <5aa02014$0$31354$65785112@news.neostrada.pl> <dyi5ls6ud9lq$.dlg@tyczka.com> <5aa04edf$0$673$65785112@news.neostrada.pl> <039a897c-b565-44af-9878-417a0e3704a9@googlegroups.com> <5aa127ab$0$1005$65785112@news.neostrada.pl> <952c4560-1ed3-4e78-a5fa-89e8254227c4@googlegroups.com> <1w838ct6a2suq.dlg@tyczka.com> <5aa143d6$0$1001$65785112@news.neostrada.pl>Show Full Headers
Complete Article Headers
X-Received: by 10.36.153.196 with SMTP id a187mr575843ite.11.1520672384915; Sat, 10 Mar 2018 00:59:44 -0800 (PST) X-Received: by 10.157.14.124 with SMTP id n57mr64347otd.3.1520672384657; Sat, 10 Mar 2018 00:59:44 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!weretis.net!feeder6.news.weretis.net!feeder.usenetexpress.com!feeder-in1.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!r195no566893itc.0!news-out.google.com!a2-v6ni1823ite.0!nntp.google.com!e10-v6no564474itf.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.delphi Date: Sat, 10 Mar 2018 00:59:44 -0800 (PST) In-Reply-To: <5aa143d6$0$1001$65785112@news.neostrada.pl> Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=91.230.119.211; posting-account=uWBjDgoAAACxkgIP6dtE4dpCnc16V86n NNTP-Posting-Host: 91.230.119.211 References: <06e89078-c8b6-46f1-8353-fe26050464f7@googlegroups.com> <1f7uetk1q6zns.dlg@tyczka.com> <a9a0ea51-cda4-4d78-b162-30263f6da079@googlegroups.com> <5aa02014$0$31354$65785112@news.neostrada.pl> <dyi5ls6ud9lq$.dlg@tyczka.com> <5aa04edf$0$673$65785112@news.neostrada.pl> <039a897c-b565-44af-9878-417a0e3704a9@googlegroups.com> <5aa127ab$0$1005$65785112@news.neostrada.pl> <952c4560-1ed3-4e78-a5fa-89e8254227c4@googlegroups.com> <1w838ct6a2suq.dlg@tyczka.com> <5aa143d6$0$1001$65785112@news.neostrada.pl> User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <8d0301ff-0c6a-48d3-a311-0765e733e24f@googlegroups.com> Subject: Re: Circular Unit Reference (Circular Class Reference) From: immo <przemek-o@soft-system.pl> Injection-Date: Sat, 10 Mar 2018 08:59:44 +0000 Lines: 151 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit