Autor Téma: Component ako const parameter rutiny.  (Přečteno 228 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2872
  • Karma: 27
    • Verze Delphi: XE7 professional
Component ako const parameter rutiny.
« kdy: 06-10-2017, 09:26:23 »
Príklad:
Kód: Delphi [Vybrat]
  1. procedure (const AComboBox: TComboBox);
  2. begin
  3.   AComboBox.Clear;
  4.   AComboBox.Items := myLists;
  5. end;  
  6.  
Neviem či to v tomto prípade je v poriadku. Lebo nemením samotnú hodnotu AComboBox, ale jeho vlastnosti.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1722
  • Karma: 70
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Component ako const parameter rutiny.
« Odpověď #1 kdy: 06-10-2017, 10:42:48 »
No v pořádku to každopádně je a je jasné co program udělá. Jde jen o to, jestli je to to samé co si představuješ ty. Co si představuješ, že to udělá? Resp. co jsi chtěl dosáhnout tím const?

V tomto případě to má v tvé ukázce význam jen
a) pro ARC kompilátor, kdy se nebude zvedat počet referencí objektu a tím se po návratu z rutiny ARC nemusí starat o úpravu počtu
b) říkáš kompilátoru, že nebudeš měnit referenci na objekt, tj. chrání tě před tím, aby jsi udělal AComboBox := nil, nebo AComboBox := TComboBox.Create


Embarcadero MVP - Czech republic

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2872
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:Component ako const parameter rutiny.
« Odpověď #2 kdy: 06-10-2017, 11:08:23 »
Citace
Resp. co jsi chtěl dosáhnout tím const?
Mám na mysli tri veci:
  • Tvoje b)
  • Múdra kniha hovorí, že nemáme meniť, pracovať s argumentami. Treba ho priradiť do lokálnej premennej.
  • Ak sa jedná o string a pod, tak je lepšia práca s pamäťou. Jednak je to rýchlejšie a rezervuje sa len potrebná veľkosť pamäte. To mám z tohto fóra.
O tom a) som nevedel.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1722
  • Karma: 70
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Component ako const parameter rutiny.
« Odpověď #3 kdy: 06-10-2017, 14:00:17 »
>Múdra kniha hovorí, že nemáme meniť, pracovať s argumentami. Treba ho priradiť do lokálnej premennej.
No to je odvazne tvrzeni a podle mne zjednodušující, nebo špatně interpretované.

ad 3) ano predavani slozitych typů jako string, record, variant pokud je v rutine neměníme je efektivnější (nic se nealokuje). Ale nijak se to netýká předávání objektů (vyjma ARC kompilátoru), jednoduchých datových typů (int, bool...).
Embarcadero MVP - Czech republic

Offline Delfin

  • Plnoletý
  • ***
  • Příspěvků: 229
  • Karma: 9
    • Verze Delphi: 2009, Tokyo
Re:Component ako const parameter rutiny.
« Odpověď #4 kdy: 06-10-2017, 14:37:44 »
ad 3) ano predavani slozitych typů jako string, record, variant pokud je v rutine neměníme je efektivnější (nic se nealokuje).

Co je slozitejsi, string nebo objekt ;D? Jde o typy s pocitanymi referencemi. U nich ma smysl const pouzit pro odstraneni implicitne pridavaneho vnejsiho try..finally bloku (pro navyseni a snizeni poctu referenci). Napr. u interface ma podstatny vyznam. Nicmene i parametr oznaceny const se muze predavat hodnotou namisto reference. Od toho vznikl dekorator [Ref].

b) říkáš kompilátoru, že nebudeš měnit referenci na objekt, tj. chrání tě před tím, aby jsi udělal AComboBox := nil, nebo AComboBox := TComboBox.Create

Ochranu prepisu reference bych u parametru typu objekt mozna nezminoval jako vyhodu. Porad muzes predanou instanci uvolnit metodou Free a ta muze nad vzniklym dangling pointerem pripravit moc mila prekvapeni.
« Poslední změna: 06-10-2017, 14:41:47 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2872
  • Karma: 27
    • Verze Delphi: XE7 professional
Re:Component ako const parameter rutiny.
« Odpověď #5 kdy: 06-10-2017, 15:01:42 »
Citace
>Múdra kniha hovorí, že nemáme meniť, pracovať s argumentami. Treba ho priradiť do lokálnej premennej.
No to je odvazne tvrzeni a podle mne zjednodušující, nebo špatně interpretované.
Zdôvodnenie bolo úplne jednoduché. Nejaký iný programátor použije daný argument s predpokladom, že tam je to čo sa poslalo. Ale niekto to medzitým zmenil. A problém je na svete.
Čiže tá lokálna premenná je poistka proti takýmto prípadom.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1722
  • Karma: 70
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Component ako const parameter rutiny.
« Odpověď #6 kdy: 06-10-2017, 15:03:57 »

Co je slozitejsi, string nebo objekt ;D? Jde o typy s pocitanymi referencemi.

Objekt má počítané reference jen u ARC kompilátoru nebo pokud se jedná o následníka InterfacedObjekt .

b) říkáš kompilátoru, že nebudeš měnit referenci na objekt, tj. chrání tě před tím, aby jsi udělal AComboBox := nil, nebo AComboBox := TComboBox.Create

Ochranu prepisu reference bych u parametru typu objekt mozna nezminoval jako vyhodu. Porad muzes predanou instanci uvolnit metodou Free a ta muze nad vzniklym dangling pointerem pripravit moc mila prekvapeni.

Nic jsem takového nenapsal, ani nic takového jsem netvrdil, takže mi nic takového nepodsouvej. Jen jsem reagoval na jeho ukázku, kdy by ho kompilátor upozornil.

Embarcadero MVP - Czech republic

Offline Delfin

  • Plnoletý
  • ***
  • Příspěvků: 229
  • Karma: 9
    • Verze Delphi: 2009, Tokyo
Re:Component ako const parameter rutiny.
« Odpověď #7 kdy: 06-10-2017, 16:16:08 »
Objekt má počítané reference jen u ARC kompilátoru nebo pokud se jedná o následníka InterfacedObjekt .

Reference se pocitaji objektum implementujicim IInterface interface.

Nic jsem takového nenapsal, ani nic takového jsem netvrdil, takže mi nic takového nepodsouvej. Jen jsem reagoval na jeho ukázku, kdy by ho kompilátor upozornil.

Pravda. Kompilator neumozni napsat kod pro prepis reference. Je to urcita vyhoda, byt porad muzes objekt znicit, a to nepeknejsim zpusobem.
« Poslední změna: 06-10-2017, 16:22:30 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline Delfin

  • Plnoletý
  • ***
  • Příspěvků: 229
  • Karma: 9
    • Verze Delphi: 2009, Tokyo
Re:Component ako const parameter rutiny.
« Odpověď #8 kdy: 06-10-2017, 17:11:59 »
Objekt má počítané reference jen u ARC kompilátoru nebo pokud se jedná o následníka InterfacedObjekt .

Reference se pocitaji objektum implementujicim IInterface interface.

Abych byl presnejsi, ne primo pocitaji. Jen se jim implicitne volaji metody na jejich pocitani (_AddRef a _Release).
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):