Autor Téma: Ako rozsekať reťazec if ... then ... elese if ...  (Přečteno 395 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Ako rozsekať reťazec if ... then ... elese if ...
« kdy: 18-05-2019, 12:52:47 »

Mne prišlo na um len:
Kód: Delphi [Vybrat]
  1.   if Part1 then
  2.     exit;
  3.   if Part2 then
  4.     exit;
čo sa mi zrovna nepáči. Je to také kostrbaté. Je aj iné riešenie?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #1 kdy: 18-05-2019, 17:05:02 »
Ďakujem za tipy. V diskusii sa mi nepodarilo nič nájsť. Nad tými výnimkami pouvažujem. Pozdáva sa mi to.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #2 kdy: 18-05-2019, 17:56:52 »
Good
Rated 3 times
Nad tými výnimkami pouvažujem. Pozdáva sa mi to.
Pouziti vyjimek pro rizeni logiky se od jejich zavedeni v jazyku Ada vzdycky povazovalo za hrubku. Jsou to vyjimky a tak maji slouzit k osetreni vyjimecnych stavu.
Ostatne Delphi IDE ti ukaze tim, ze standardne zobrazuje na vyjimku dialog, jak nepouzitelna je to technika...

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #3 kdy: 18-05-2019, 18:12:54 »

Citace
Pouziti vyjimek pro rizeni logiky se od jejich zavedeni v jazyku Ada vzdycky povazovalo za hrubku.
Dám si povedať.
Našiel by sa nejaký ďalší tip? Pri short circuit evaluation sa akosi nechytám ako to je myslené.
Nech nie sme malicherní, tak vychádzajme z predpokladu, že je zreťazených 100 if-ov.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #4 kdy: 18-05-2019, 19:13:13 »
Ide o to, že z tých 100 funkcií sa má spustiť práve len jediná! Preto reťazenie If then else if then else ...
Alebo som to pole totálne nepochopil.
Mám tieto možnosti riadenia:
  • použijem reťazenie if-ov. Tak to mám teraz
  • samotná funkcia sa rozhodne či sa má vykonať a oznámi to. Hm, tu mi pasuje to pole :)
  • funkcie rozdelím do blokov a ak sa funkcia zbehne, tak si nastavím príznak na True. To je mnou uvedený prípad
Ako najvhodnejšia, najkratšia a najkrajšia cesta sa javí 2. Do poľa viem dať text, ale funkciu? Idem sa opýtať uja. Radšej než pole používam generiká. Pole len výnimočne.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Plnoletý
  • ***
  • Příspěvků: 147
  • Karma: 8
    • Verze Delphi: XE2
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #5 kdy: 18-05-2019, 19:22:08 »
Ide o to, že z tých 100 funkcií sa má spustiť práve len jediná! Preto reťazenie If then else if then else ...

1. Znamená to že těch 100 vyhodnocení  je na 100% pouze jedna true  nebo jich true může vracet více a vykonat se má pouze  první nalezená ?
2. to se vyhodnocuje  100 podmínek a může se volat i 100 ruzných funkcí ?










Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #6 kdy: 18-05-2019, 19:37:11 »
Citace
Co je tedy v dotazu Part1 a Part2?
Niekoľko funkcií v konštrukcii it then else if...
V mojom konkrétnom prípade načítavam/zapisujem hodnoty do Edit/DB. Tu je príklad, ale pomocou case
Kód: Delphi [Vybrat]
  1.   for DBEditCtrl in FDBEditContrlos do
  2.   begin
  3.     case DBEditCtrl.TypeCtrl of
  4.       tcEdit: WritetcEdit(DBEditCtrl);  // TAdvEdit, TAdvMoneyEdit - majú zhodný zoznam EditType
  5.       tcSpinEdit: WritetcSpinEdit(DBEditCtrl);  // TAdvSpinEdit
  6.       ...
  7.     else
  8. ....
Vždy sa zavolá/vykoná len jedna funkcia a ide sa do ďalšieho cyklu. Mám aj iné prípady s použitím if. Podstata je tá istá.
« Poslední změna: 18-05-2019, 19:39:39 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #7 kdy: 18-05-2019, 20:01:07 »
Excellent
Rated 1 time
Našiel by sa nejaký ďalší tip?
Nenasel, protoze z dotazu nerozumim, co presne tim retezenim 100 selekci resis. Na samotnem retezenim if ... then ... else if ... nevidim nic spatneho, krome toho, ze to produkuje dlouhy kod, ktery se nevejde na "1 obrazovku".  Ale pokud je tech podminek hodne, tak si stejne nepomuzes. To s tim exit se nekdy pouziva, cely ten podmineny chain se umele nacpe do extra subroutiny a logika se invertuje -> v podstate se implementuje asemblerovske podminene RETURN.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #8 kdy: 18-05-2019, 20:05:40 »
Excellent
Rated 1 time
V mojom konkrétnom prípade načítavam/zapisujem hodnoty do Edit/DB. Tu je príklad, ale pomocou case
Pouziti CASE je to nejlepsi, co muzes udelat, ale zalezi to na to, jestli mas pro selekci tohoto typu  ridici hodnotu. Pokud ne, tak nezbyde nez retezit ty if ... else if ev. v jejich inverzi pomoci toho exit

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #9 kdy: 18-05-2019, 20:09:07 »
Ide len o zabavenie sa toho dlhého kódu. Preto som v prvej úvahe použil Part1, Part2 ...
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #10 kdy: 18-05-2019, 20:55:09 »
Môže to byť aj tak ;)  Akurát by sa tam volali procedúry. Princíp zostáva.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #11 kdy: 18-05-2019, 21:13:04 »
Ide len o zabavenie sa toho dlhého kódu. Preto som v prvej úvahe použil Part1, Part2 ...
No to bude nejkratsi, pokud Part1, Part2, ... PartN budou funkce, ktere budou obsahovat:
Kód: Delphi [Vybrat]
  1. Result := ... evaluate conditions ...
  2. if Result then
  3.   begin
  4.     ... akce ...
  5.   end;
  6.  
a pak muzes mist exit psat
Kód: Delphi [Vybrat]
  1. if Part1 then
  2.   //
  3. else if Part2 then
  4.   //
  5. else if Part3 then
  6.   //
  7.   ...
  8. else
  9.   raise ...;
  10.  
« Poslední změna: 18-05-2019, 21:14:59 od pf1957 »

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #12 kdy: 18-05-2019, 21:16:56 »
Mne to trocha trvá než mi to dôjde do takej podoby. Málo kedy to "trafím" na prvý krát. Materiálu mám dosť. Teraz to už len použivať podľa potreby. Považujem tému za vyčerpanú.
Všetkým ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #13 kdy: 18-05-2019, 21:53:38 »
Vtip je v tom, že ja neviem koľko tých funkcií v budúcnosti môže byť. Ale 100 ich nebude. Radšej som sa poistil a opýtal sa na to.
Priznám sa bez mučenia, že ma poplietol prípad, kde volám 61 funkcií. Ale to je bez toho if ... else. A to sa mi zmotalo dokopy :-[
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #14 kdy: 18-05-2019, 22:00:55 »
Kód: Delphi [Vybrat]
  1. if not (Part1 and Part2 and Part3) then
  2.   raise ...;
V pozitivni logice by to s ohledem na De Morganovy zakony muselo byt not (Part1 or Part2 or Part3), ne?