🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #346406

Re: Circular Unit Reference (Circular Class Reference)

#346406
From: immo
Date: Sat, 10 Mar 2018 08:59
125 lines
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-mail
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>

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