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

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #15 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ů: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #16 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ů: 4396
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #17 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ů: 4396
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #18 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ů: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #19 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ů: 4396
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #20 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ů: 4396
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #21 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ů: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #22 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?

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 42
    • Verze Delphi: 10.3
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #23 kdy: 18-05-2019, 22:22:22 »
A jak vypadají ty jednotlivé podmínky? Jestli jsou "na jedno brdo", nebo každá úplně jiná.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4396
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #24 kdy: 18-05-2019, 22:53:15 »
Ako som písal, tak som si zmiešal dohromady dve veci. Keď som sem písal, tak som mal na mysli podmienky typu:

Kód: Delphi [Vybrat]
  1. if cosi is Tnieco then
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 42
    • Verze Delphi: 10.3
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #25 kdy: 18-05-2019, 23:03:02 »
Možná by šlo si udělat takový "rozcestník":
Kód: Delphi [Vybrat]
  1. type tVolanaProcedura=procedure(x:tObject); // nebo procedure of object apod.
  2.      tRozcestnik=class(tDictionary<tClass, tVolanaProcedura>);
  3.  

Místo "ifů" bys pak z rozcestníku zkusil načíst proceduru a tu zavolat. Pokud teda jsou ty procedury taky na jedno brdo.
Výhodou by bylo, že bys nemusel spravovat jedno centrální místo s těmi "ify", místo toho by si třeba každá unita mohla přidat pár záznamů do rozcestníku pro "svoje" objekty. Ale nezkoušel jsem to a asi je to pro tenhle případ překombinované a nejpraktičtější bude ta sbírka "ifů" :-) (Pokud by to nešlo pro tClass, tak pro string by to jít mělo a předávalo by se tam objekt.ClassName.)

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1429
  • Karma: 34
    • Pepak.net
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #26 kdy: 19-05-2019, 05:59:00 »
Excellent
Rated 1 time
Ale zato se dá do třídy dát virtual metoda, kterou potomci overridnou každý podle svého, a potom není potřeba řešit žádný "rozcestník", protože správná metoda se zavolá čistě na základě polymorfismu. - Nebo použít jiný obdobný mechanismus, když nejde udělat společného předka (interface, společná proměnná...).

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 754
  • Karma: 42
    • Verze Delphi: 10.3
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #27 kdy: 19-05-2019, 09:21:14 »
Ale zato se dá do třídy dát virtual metoda, kterou potomci overridnou každý podle svého, a potom není potřeba řešit žádný "rozcestník", protože správná metoda se zavolá čistě na základě polymorfismu. - Nebo použít jiný obdobný mechanismus, když nejde udělat společného předka (interface, společná proměnná...).

Já měl právě za to, že tady řešíme případ, kdy autor dotazu nemůže měnit ty jednotlivé třídy, protože virtuální metody myslím zná a používá.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4396
  • Karma: 39
    • Verze Delphi: XE7 professional
Re:Ako rozsekať reťazec if ... then ... elese if ...
« Odpověď #28 kdy: 19-05-2019, 09:43:10 »
Nie som si istý, či som v tomto prípade nad tým rozmýšľal.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.