Autor Téma: Nějaké info o nové verzi Delphi  (Přečteno 4207 krát)

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Nějaké info o nové verzi Delphi
« Odpověď #45 kdy: 09-11-2018, 07:26:39 »
Jaky je rozdil vim. Co nechapu je, proc by struktura mela kdy podle nekterych nazoru umet vic nez ukladani hodnot.
Protože teď máme divný hybrid mezi původním pascalským recordem, který umí akorát ukládání hodnot, a třídou, která toho umí mnoho. A za tímco ani jedna z krajních poloh mě neuráží, tak pro hybrid nevidím žádný smysl. To ať už je record plnoprávná obdoba třídy se vším všudy, akorát že se vytváří i ničí automaticky přímo na zásobníku. Ne že budu mít něco, co se chová skoro stejně jako třída, ale má to nesmyslné rozdíly typu "instance se vytvoří sama, ale nezavolá se na ní konstruktor, takže není nainicializovaná", "instance se zničí sama, ale neexistuje pro ni destruktor" (oboje řeší teď poslední úprava do 10.3), "instance může mít metody, ale tyto metody se nemohou overridovat", atd. Jakkoliv nemohu říci, že bych jazyk C považoval za vzor hodný následování, tak zrovna tohle má udělané dobře hned od zavedení objektů.

Citace
Jinak psal Barry Kelly, ze jednim z problemu dedicnosti recordu by byl (mimo virtualnich metod) ve ztrate hodnot poli pri prirazovani (tedy napr. i pri predavani zaznamu parametrum). Napr. v tomto pseudokodu:
Já v tom právě žádný problém nevidím. Ani z pohledu uživatele, ani z pohledu kompilátoru. A pokud by to někde problém byl, od toho je kopírovací konstruktor a/nebo přiřazovací operátor, aby vyhodil výjimku, že takhle tedy ne.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Nějaké info o nové verzi Delphi
« Odpověď #46 kdy: 09-11-2018, 07:30:35 »
Mně konstruktory a destruktory u recordu moc k srdci nepřirostly.
Když někde vidím
Kód: Delphi [Vybrat]
  1. x:=tPokus.Create;
tak zatím jsem zvyklý, že tPokus je třída, tím pádem očekávám, že tam bude něco jako:
Bohužel, s tím musíme počítat už od okamžiku, kdy se začaly používat interfacy, protože tam je to přesně to samé. Sám právě v rámci čistoty kódu i u nich používám try-finally s tím, že jim přiřadím nil, abych na první pohled viděl, že je to vyřešené. U recordů bych rád volal ve finally metodu Free, která třeba vůbec nic neudělá, jen bude fungovat jako signál, že ano, je to vyřešené, a kdybych se náhodou rozhodl jednou přejít z recordu na třídu (když už jsou skoro to samé...), tak že mi program bude i nadále fungovat, místo aby začal leakovat.

Citace
Jakmile se x:=tPokus.Create; bude víc používat i u recordu, tak už nebude tak snadno vidět případné opomenutí toho závěrečného uvolnění instance třídy.
Můžeš také používat x.Create bez přiřazení. To bude hned vypadat lépe, jako že voláš metodu na neinstancovaném objektu :-).

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Nějaké info o nové verzi Delphi
« Odpověď #47 kdy: 09-11-2018, 08:30:03 »
Jakmile se x:=tPokus.Create; bude víc používat i u recordu, tak už nebude tak snadno vidět případné opomenutí toho závěrečného uvolnění instance třídy. A tedy si budu muset i pamatovat, co je třída a co record - třeba moje "oblíbené" TFormatSettings, u kterého si to ověřuju co chvíli.

Jen pro jistotu: rozumíš, že nemusíš to Create používat, že?

Kód: Delphi [Vybrat]
  1. var
  2.   rPokus: TPokus;
  3. begin
  4. // zde nekde se zavola def. constructor, pokud je definovany
  5.   rPokus.neco := 'x';
  6. end; // a zde destructor
  7.  
Embarcadero MVP - Czech republic

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Nějaké info o nové verzi Delphi
« Odpověď #48 kdy: 09-11-2018, 09:06:20 »
Jen pro jistotu: rozumíš, že nemusíš to Create používat, že?
Jenže až od Delphi 10.3. V současných Delphi musíš - a ještě to nesmí být konstruktor, protože jinak ti to Delphi nezkompilují:

Kód: Delphi [Vybrat]
  1. {$apptype console}
  2. type
  3.   TTestRecord = record
  4.     Value: string;
  5.     constructor Create;
  6.   end;
  7.  
  8. constructor TTestRecord.Create;
  9. begin
  10.   Value := 'Ahoj';
  11. end;
  12.  
  13. var
  14.   Rec: TTestRecord;
  15.  
  16. begin
  17.   Writeln(Rec.Value);
  18.   Rec.Create;
  19.   Writeln(Rec.Value);
  20. end.
Testováno na 10.2: "Error: E2394 Parameterless constructors not allowed on record types"

Offline zdenek

  • Plnoletý
  • ***
  • Příspěvků: 134
  • Karma: 8
Re:Nějaké info o nové verzi Delphi
« Odpověď #49 kdy: 09-11-2018, 09:46:15 »
On to taky není úplně konstruktor.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Nějaké info o nové verzi Delphi
« Odpověď #50 kdy: 09-11-2018, 10:11:32 »
On to taky není úplně konstruktor.
Jaký jiný název navrhuješ pro funkci, která se zavolá na začátku života datového bloku a nastaví ho do nějakého výchozího stavu?

Nebo jinak, v čem se podle tebe liší konstruktor v tvém pojetí od "konstruktoru" recordu?

Offline zdenek

  • Plnoletý
  • ***
  • Příspěvků: 134
  • Karma: 8
Re:Nějaké info o nové verzi Delphi
« Odpověď #51 kdy: 09-11-2018, 10:39:25 »
Konstruktor je součástí alokace objektu dané třídy. Je kolem něho nabalena další funkcionalita. Mně je celkem jedno jak tomu říkat, ale tady u recordu je to trochu něco jiného. Ten record existuje sám  o sobě a toto je vlastně jenom procedura, která s ním pracuje. Mulvím o 10.2 a starší.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Nějaké info o nové verzi Delphi
« Odpověď #52 kdy: 09-11-2018, 10:56:18 »
Konstruktor je součástí alokace objektu dané třídy.
Ne, to není.

Citace
Ten record existuje sám  o sobě
To také není pravda. I u recordu proběhne alokace, akorát jiným mechanismem, a udělá ji kód dodaný kompilátorem, ne explicitně programátor.

Pochop, že se nebavím o tom, jak to vypadá na úrovni zdrojového kódu. Bavím se o tom, jak to je udělané uvnitř.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Nějaké info o nové verzi Delphi
« Odpověď #53 kdy: 09-11-2018, 14:34:05 »
Aha. Zjevně je tu zásadní neporozumění mezi tím, co je to alokace, co je to inicializace, a co z toho dělá konstruktor. No nic, tak já už mlčím.

Offline Slappy

  • Plnoletý
  • ***
  • Příspěvků: 174
  • Karma: 11
  • Slappy
    • Verze Delphi: 10.2 Tokyo + Vsetky :)
    • unSigned
Moje projekty: http://www.unsigned.sk Tvorba cool dizajnovych instalatorov v NSIS a Inno Setup. Rozsirenie pre Visual Studio a RAD Studio pre tvorbu NSIS a Inno Setup instalatorov.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 765
  • Karma: 43
    • Verze Delphi: 10.3
Re:Nějaké info o nové verzi Delphi
« Odpověď #55 kdy: 09-11-2018, 18:47:20 »
Jen pro jistotu: rozumíš, že nemusíš to Create používat, že?

Jo, rozumím, měl jsem do příkladu napsat to tFormatSettings, u něj v helpu je přímo:
1. Declare a variable of type TFormatSettings.
2. Call TFormatSettings.Create to populate the TFormatSettings variable with locale information (FS := TFormatSettings.Create('en-US'); ).
Což mě pak vždycky znejistí, jestli jsem ho náhodou taky neměl uvolnit, pokud si nedám do komentáře, že uvolňovat nemusím.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Nějaké info o nové verzi Delphi
« Odpověď #56 kdy: 21-11-2018, 12:03:51 »
Dnes je hezky, dnes by to šlo.
Embarcadero MVP - Czech republic

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 765
  • Karma: 43
    • Verze Delphi: 10.3
Re:Nějaké info o nové verzi Delphi
« Odpověď #57 kdy: 21-11-2018, 14:04:43 »
Dnes je hezky, dnes by to šlo.

Že by? Už to není "my nesmíme ani naznačovat"? ;-)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Nějaké info o nové verzi Delphi
« Odpověď #58 kdy: 21-11-2018, 14:29:20 »
Dnes je hezky, dnes by to šlo.

Že by? Už to není "my nesmíme ani naznačovat"? ;-)

Ehm,
na druhou stranu bohužel http://blog.marcocantu.com/blog/2018-november-deferring-managed%20records.html
Embarcadero MVP - Czech republic