Autor Téma: Vytvorenie triedy a správny spôsob jej "spustenia"  (Přečteno 1687 krát)

100343

  • Host
Re:Vytvorenie triedy a správny spôsob jej "spustenia"
« Odpověď #15 kdy: 28-06-2018, 09:32:34 »
Modul produktu:

Kód: Delphi [Vybrat]
  1. unit MyLib.Product.Classes;
  2.  
  3. interface
  4.  
  5. uses
  6.   Dialogs;
  7.  
  8. type
  9.   TProduct = class
  10.   public
  11.     procedure DoSomething;
  12.   end;
  13.   TProductClass = class of TProduct;
  14.  
  15. implementation
  16.  
  17. { TProduct }
  18.  
  19. procedure TProduct.DoSomething;
  20. begin
  21.   ShowMessage('DoSomething');
  22. end;
  23.  
  24. end.

Modul tovarny (dle navrhu pf1957):

Kód: Delphi [Vybrat]
  1. unit MyLib.Product.Factory;
  2.  
  3. interface
  4.  
  5. uses
  6.   MyLib.Product.Classes;
  7.  
  8. type
  9.   TFactory = class
  10.   strict private
  11.     class var
  12.       FInstance: TFactory;
  13.   strict private
  14.     constructor Create;
  15.     class destructor Destroy;
  16.     class function GetInstance: TFactory; static;
  17.   public
  18.     function New(Kind: TProductClass): TProduct;
  19.     class property Instance: TFactory read GetInstance;
  20.   end;
  21.  
  22. implementation
  23.  
  24. { TFactory }
  25.  
  26. constructor TFactory.Create;
  27. begin
  28.   inherited;
  29. end;
  30.  
  31. class destructor TFactory.Destroy;
  32. begin
  33.   FInstance.Free;
  34.   FInstance := nil;
  35. end;
  36.  
  37. class function TFactory.GetInstance: TFactory;
  38. begin
  39.   if not Assigned(FInstance) then
  40.     FInstance := TFactory.Create;
  41.   Result := FInstance;
  42. end;
  43.  
  44. function TFactory.New(Kind: TProductClass): TProduct;
  45. begin
  46.   Result := Kind.Create;
  47. end;
  48.  
  49. end.

Pouziti:

Kód: Delphi [Vybrat]
  1. uses
  2.   MyLib.Product.Classes, MyLib.Product.Factory;
  3.  
  4. var
  5.   Product: TProduct;
  6. begin
  7.   Product := TFactory.Instance.New(TProduct);
  8.   try
  9.     Product.DoSomething;
  10.   finally
  11.     Product.Free;
  12.   end;
  13. end;
« Poslední změna: 28-06-2018, 09:50:10 od 100343 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5570
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Vytvorenie triedy a správny spôsob jej "spustenia"
« Odpověď #16 kdy: 28-06-2018, 09:39:58 »
Ďakujem. Už tomu asi aj rozumiem:)
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline starous

  • Mladík
  • **
  • Příspěvků: 94
  • Karma: 2
    • Verze Delphi: Delphi 7, Delphi 10.4
Re:Vytvorenie triedy a správny spôsob jej "spustenia"
« Odpověď #17 kdy: 28-06-2018, 09:46:19 »
Tohle je typický roubování mechanizmů Javy v prostředí Delphi, které má trochu jiné programovací prostředky.

Narazil jsem při vytváření tříd na jeden zajímavý postup, který mě opravdu zaujal. Místo deklarace třídy v sekci interface tam byla jen funkce, která vracela interface a vše ostatní (deklarace třídy i její definice) bylo v sekci Implementation.
Možná by něco takového šlo použít.

Ve svých programech používám Singleton také a řeším to privátním konstruktorem s class function Instance a nevidím v tom problém.

Co od Standy nezaznělo, jak to vůbec má fungovat. To nemá každý typ sestavy vlastní třídu? Proč je tam abstraktní třída a pak jen třída TBasePrintFR? Jiný třídy nebudou?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5570
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Vytvorenie triedy a správny spôsob jej "spustenia"
« Odpověď #18 kdy: 28-06-2018, 10:13:58 »

Citace
Ve svých programech používám Singleton také a řeším to privátním konstruktorem s class function Instance a nevidím v tom problém.
Ja tiež nie. O class function som si niečo prečítal, ale to neznamená, že som pochopil ich podstatu ;)  Už som to viackrát spomínal, že som samouk a tak mi chýbajú základy, nemám predpoklady pre programovanie - myslenie a pod. a chýba mi "encyklopedická" pamäť. Nóó, ešte ma to baví.
Citace
Co od Standy nezaznělo, jak to vůbec má fungovat. To nemá každý typ sestavy vlastní třídu? Proč je tam abstraktní třída a pak jen třída TBasePrintFR? Jiný třídy nebudou?
Samozrejme že každá zostava má vlastnú triedu. Tu som dal len minimum, ktoré som považoval za potrebné.
To vysvetlenie od Delfina mi plne stačí.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline starous

  • Mladík
  • **
  • Příspěvků: 94
  • Karma: 2
    • Verze Delphi: Delphi 7, Delphi 10.4
Re:Vytvorenie triedy a správny spôsob jej "spustenia"
« Odpověď #19 kdy: 28-06-2018, 11:58:50 »

Ja tiež nie. O class function som si niečo prečítal, ale to neznamená, že som pochopil ich podstatu ;) 

Pokud používáš metody třídy nad objektem, tak při jejím volání předáváš skrytě i odkaz na ten objekt. U class metod tam nic takového není, metoda se dá používat bez existujícího objektu.

Citace
Samozrejme že každá zostava má vlastnú triedu. Tu som dal len minimum, ktoré som považoval za potrebné.
To vysvetlenie od Delfina mi plne stačí.

To si nejsem právě jist, že ti to stačí. V to tvém kódu je následující řádek:
Kód: Delphi [Vybrat]
  1.      oBasePrintFR := TBasePrintFR.Create(ATypeReport);
  2.  

Ten se mi právě nelíbí. Třída, která vytváří tiskovou sestavu přeci ví s jakou tiskovou sestavou bude pracovat a ten parametr je tam zbytečný. Podle mě patří do nějaké tovární třídy, nikoliv sem. Maximálně patří jako návratová hodnota metody GetTypeReport.

Tovární třída musí podle něčeho rozhodnout jakou třídu má použít. Delfin ti tam pro zjednodušení jako parametr napsal typ třídy, ale takto to volat napřímo nemůžeš, protože pak celá ta logika továrny padá. To si tam pak můžu napsat TPrintFRxxx.create a nemusím se babrat s továrnou.

Továrna má smysl ve chvíli, kdy vedle ní mám nějaký katalog produktů (na továrně nezávislý) a podle nějakého parametru (výčtový typ, celočíselné konstanty, řetězec) požaduju po továrně, aby příslušný produkt vytvořila. A zase je asi proti principu továrny, aby měla přímo v nějaké metodě natvrdo napsaný case, který bude říkat, co se vyrobí. Protože s přidáním nového produktu musíš neustále upravovat továrnu.
Řešením je mít součástí továrny nějaký slovník (třeba TDictionary), který ukládá typ produktu a zároveň třídu produktu. Vedle toho tam musí být nějaká metoda, která umožní ten slovník plnit.

Dále musí být v programu někde možnost si ten katalog produktů v továrně naplnit. Osobně to řeším v sekci initialization v unitách, kde si vytvářím potomka té základní třídy. Hm, píšu nezávislý katalog produktů a mám jej přímo v továrně. Správně bych měl ten katalog v podobě slovníku předávat jako parametr, čímž bych mohl prostou výměnou katalogu místo aut třeba vyrábět koloběžky.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5570
  • Karma: 42
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Vytvorenie triedy a správny spôsob jej "spustenia"
« Odpověď #20 kdy: 28-06-2018, 12:29:26 »
Citace
To si tam pak můžu napsat TPrintFRxxx.create a nemusím se babrat s továrnou.
Teraz som prišiel na to, že v prípade tlačových zostáv máš pravdu. Už to aj v tomto zmysle opravujem. Ďakujem.
Ešte mám výpočet vyúčtovania na ktorom aktuálne robím a tam tu továreň potrebujem. Takže celú tu debatu tam zúžitkujem.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.