Autor Téma: Object ako parameter funkcie. Kde ho zničiť?  (Přečteno 888 krát)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3004
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #15 kdy: 26-09-2020, 10:31:22 »
a dá sa teda dodatočne implementovať?
Ne. Jedine vytvorit potomka a tam to implementovat.

Offline František

  • Guru
  • *****
  • Příspěvků: 596
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #16 kdy: 28-09-2020, 13:07:54 »
tenkrát poprvé ..
Kód: Delphi [Vybrat]
  1. type
  2.   IfpMemTable = interface
  3.     ['{FA82DCFD-EF91-4A87-B06A-F6299A15D92F}']
  4.     procedure NextRecordSet2;
  5.   end;
  6.  
  7. type
  8.   TfpMemTable = class(TFDMemTable, IfpMemTable)
  9.   private
  10.     procedure NextRecordSet2;
  11.  end;
  12.  
  13. implementation
  14.  
  15. procedure TfpMemTable.NextRecordSet2;
  16. begin
  17.    NextRecordSet;
  18. end;
  19.  
  20. procedure TForm4.Button1Click(Sender: TObject);
  21. var
  22.     fpMemTablei: IfpMemTable;
  23. begin
  24.    fpMemTablei := TfpMemTable.Create(nil);
  25. end;
pochopil som to spravne?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3004
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #17 kdy: 28-09-2020, 13:24:32 »
pochopil som to spravne?
V zasade ano.

Kazdy interface by mel byt potomkem IInterface
Kód: Delphi [Vybrat]
  1. IfpMemTable = interface(IInterface)
Metody tykajici se spravy zivostniho cyklu uz implementoval tusim predek TDataset u jineho interface.

Pokud chces "vytahnout" metodu do interface, nemusis definovat NextRecordSet2, ale staci pridat rovnou NextRecordSet do interface, kterou uz implementuje predek, takze to u TfpMemTable nepridavas.





Offline František

  • Guru
  • *****
  • Příspěvků: 596
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #18 kdy: 28-09-2020, 13:38:21 »
Kód: Delphi [Vybrat]
  1. type
  2.   IfpMemTable = interface(IInterface)
  3.     procedure NextRecordSet;
  4.   end;
  5.  
  6. type
  7.   TfpMemTable = class(TFDMemTable, IfpMemTable)
  8.   end;

a použitie je takéto? (nemusím rušiť? ano?)
Kód: Delphi [Vybrat]
  1. procedure TForm4.Button1Click(Sender: TObject);
  2. var
  3.     fpMemTablei: IfpMemTable;
  4. begin
  5.    fpMemTablei := TfpMemTable.Create(nil);
  6.    fpMemTablei.NextRecordSet;
  7. end;

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3004
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #19 kdy: 28-09-2020, 14:58:00 »
Ano

Offline František

  • Guru
  • *****
  • Příspěvků: 596
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #20 kdy: 28-09-2020, 22:21:28 »
2pf: dikez, šlape to

2stanislav: ako si to poriesil? toto sa ti pozdava? ci len kllasisky FreeAndNil

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5450
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #21 kdy: 29-09-2020, 09:25:55 »
Ostávam pri klasike. Objekt ničím mimo funkcie. Hore spomínam, že používam aj opakovane v cykle.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Guru
  • *****
  • Příspěvků: 596
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #22 kdy: 29-09-2020, 09:56:57 »
ale to ze ho pouzivas opakovane by nemal byt problem, objekt existuje, pokial je nan referencia - teda tak je to v c# myslim
mne sa to teda pozdava ako cistejsie riesenie cez interface

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5450
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #23 kdy: 29-09-2020, 13:09:34 »
No vieš, ten interface je pre mňa nové slovo a automaticky to znamená niečo neznáme a nebezpečné :)
Čo som si o nich niečo prečítal, tak by mi určite pomohli vyriešiť niektoré problémy.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Guru
  • *****
  • Příspěvků: 596
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #24 kdy: 29-09-2020, 23:40:00 »
Citace
No vieš, ten interface je pre mňa nové slovo ...
pred prečítaním tohoto vlákna som bol na tom podobne ...no  nové slovo nie, ale španielska dedina určite ..
ale pf naznačil možnosti, ktoré ma zaujali a tak som sa o to pokúsil a šlape to, a šlape to krásne

2pf: ale aký je v tom zádrhel ... lebo vyzerá to ako kúzlo (garbage colector) ale nejako sa to moc nikde nepropaguje ..  teda dosť odvážne tvrdenie odo mňa, ale vieš čo myslím .. lebo kebyže áno, tak FireDac by to už mal dáfno naimplementované, nie?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3004
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #25 kdy: 30-09-2020, 11:34:33 »
2pf: ale aký je v tom zádrhel ... lebo vyzerá to ako kúzlo (garbage colector) ale nejako sa to moc nikde nepropaguje ..  teda dosť odvážne tvrdenie odo mňa, ale vieš čo myslím .. lebo kebyže áno, tak FireDac by to už mal dáfno naimplementované, nie?
Delphi prekladac neakceptuje metodu rozhrani jako event handler - to je IMHO jedine skutecne omezeni, o kterem vim.

Jinak v tom zadny zadrhel nevidim, krome toho, ze nemuzes odkazy na rozhrani bezstarostne rozkopirovavat na vsechna nadrazi, protoze jinak by se ti to neuvolnovalo a rostla by spotreba pameti.

Mezi automatickou spravou reference counted promennych a GC je dost velky rozdil...

Nepropaguje... AFAIK, tak nejmene 10 let se v oborech, venujicich se SI, uci, ze:
- se programuje proti interface a ne proti implementacim
- ze se dedicnost ma nahrazovat kompozici, pokud je to mozne.
- ze se maji pouzivat navrhove vzory, aby se stejne problemy resily stejne a ne jak koho momentalne napadne

U FireDac by to byla samoucelna zalezitost, protoze Delphi je nastroj pro kladece komponent a FireDac jsou komponenty ke kladeni, zatimco interfejsy jsou zalezitosti behu - taky je FireDaC a ostatni knihovny v Delphi vnitrne cim dal tim vic pouzivaji. Kladeci s zivotnim cyklem komponent problemy nemaji a ostatni tech par try-finally nezabije.

Ale interfejsy by mely v DB oblasti uplne jiny prinos: kdyby napr. Borland vcas definoval neco jako ISQLQuery, tak by ho vsechny ostatni konektivity implementovaly a pak by se vymena RDBMS aplikace v podstate nedotkla, jen by se zmenila factory na objekty (kdyz by se nedodala pres dependency injection). Ted zrejme kvuli zpetne kompatibilite nechavaji TDataset a ten implementuji pomoci rozhrani na ruzne providery. Ale proc nevytahli nejake spolecne rozhrani na urovni datasetu se me neptej. Treba FIB+ takovy interface mely a jako clovek, ktery menil ruzne DB connectivity a RDBMS bych to urcite ocenil.

« Poslední změna: 30-09-2020, 11:36:29 od pf1957 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5450
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #26 kdy: 30-09-2020, 12:59:28 »
OT: čítal som úvahu o OOP. Nebola mu dvakrát naklonená. Zhrnul by som to slovami: Počiatočná eufória, vytriezvenie - kto by to, skoro všetko, spätne prepracoval? Pozor, nezatracovali to, ibaže prax je iná než boli očakávania. Bavili sa aj o tom, kedy je vhodné použiť OOP a kedy Interface. V teoretickej rovine založenej na praxi.
Poznámka:
Chodia mi z The Overflow mesačne oznamy o zaujímavých blogoch, otázkach a odkazy na iné zaujímavé weby. Tam to bolo. Celkom to odporúčam.
« Poslední změna: 30-09-2020, 13:01:33 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3004
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #27 kdy: 30-09-2020, 15:08:52 »
OT: čítal som úvahu o OOP. Nebola mu dvakrát naklonená. Zhrnul by som to slovami: Počiatočná eufória, vytriezvenie - kto by to, skoro všetko, spätne prepracoval? Pozor, nezatracovali to, ibaže prax je iná než boli očakávania. Bavili sa aj o tom, kedy je vhodné použiť OOP a kedy Interface. V teoretickej rovine založenej na praxi.
Poznámka:
Chodia mi z The Overflow mesačne oznamy o zaujímavých blogoch, otázkach a odkazy na iné zaujímavé weby. Tam to bolo. Celkom to odporúčam.
Me ty sr*cky ze SO chodi taky, ale jedine, co trochu pripomina to, o cem pises, byl nejaky provokativni clanecek nejake zacinajici novinarky ve stylu "na co je vojakum OOP, kdyz dneska je in funkcni programovani"...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5450
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #28 kdy: 30-09-2020, 16:26:56 »
Históriu nemám, takže to nenájdem. Mne ten článok prišiel zaujímavý. Bolo to asi 2 mesiace dozadu.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Guru
  • *****
  • Příspěvků: 596
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Object ako parameter funkcie. Kde ho zničiť?
« Odpověď #29 kdy: 30-09-2020, 23:10:05 »
pf: díkez, mať tak prístup k tvojej private wikipédii a  k tomu ešte tie správne otázky (metódy)