Vzorec: Více síly za jednoduchostí

Automaticky přeloženo z Deepl

Příkaz Formula je k dispozici od verze 4D v17 R3. Dosud jste možná uvažovali o přiřazení vzorce jako metody k objektu nebo o vytvoření inteligentních objektů, které mohou vypočítat hodnoty nebo provést cokoli, co potřebujete. To je opravdu skvělé a je toho víc, než se na první pohled zdá!

Vincent de Lachaux – vývojář a odborník na 4D – mi skvěle předvedl, jak tento příkaz používá. Pro tento příspěvek na blogu jsem z této ukázky sestavil různé scénáře, abych vám přiblížil jiný rozměr tohoto příkazu.

Příklad 1 – Zjednodušení existujícího příkazu

Některé příkazy 4D se v kódu používají statisíckrát.Často předáváme stejné parametry s výjimkou jednoho.

Vezměme si jednoduchý příklad příkazu OBJECT get pointer. Chci inicializovat hodnoty svých zaškrtávacích políček, proto napíšu:

(OBJECT get pointer(Object named; "checkbox"))->:=0

Nebo napíšu vzorec, který jako parametr přijme název mého objektu:

interface.pointer:=Formula(OBJECT Get pointer(Object named;$1))

Když chci přiřadit nebo načíst hodnotu svého zaškrtávacího políčka, jednoduše napíšu:

(interface.pointer("checkbox"))->:=0
(interface.pointer("checkbox2"))->:=0

Nebo pokud potřebuji nastavit tisíce zaškrtávacích políček, mohu si vytvořit vzorec, který mi to usnadní:

interface.setCheckbox:=Formula((OBJECT Get pointer(Object named;$1))->:=$2)

Pokud chci nastavit řadu zaškrtávacích políček, mohu jednoduše napsat:

interface.setCheckbox("checkbox1";0)
interface .setCheckbox("checkbox2";1)
interface .setCheckbox("checkbox3";0)
interface .setCheckbox("checkbox4";1)

Jednodušší na čtení – a mnohem jednodušší na psaní, protože nemusím počítat závorky…

Příklad 2 – s parametrem databáze

Ve svém kódu nastavte několikrát stejný databázový parametr s různými hodnotami. Uveďme si konkrétní příklad s kontrolními tipy zpoždění. Možná budete chtít v některých částech formuláře zobrazovat tipy bez zpoždění a v jiných částech čekat 1s. Při každém použití databázového parametru si musíte zapamatovat jeho hodnotu nebo ji vyhledat v jiné části kódu.

Proč nevytvořit vzorec?

interface.tipsNoDelay:=Formula(SET DATABASE PARAMETER(Tips delay;1))
interface .tips1sDelay:=Formula(SET DATABASE PARAMETER(Tips delay;60))

Když pak chcete hodnotu změnit, stačí zavolat vzorec:

interface.tips1sDelay()
// or

interface .tipsNoDelay()

Příklad 3 – Použití vzorce jako varianty

Můžete vytvořit vzorec, který používá hodnoty předané jako parametry metody( tj. $1, $2), ale v metodě, ve které vzorec vytváříte, nemusíte zadávat $1 a $2. Proměnné se zadávají při provádění vzorce. Můžete psát obecné metody nebo vzorce.

Zde je jednoduchý příklad, který ukazuje, že typ je definován při provádění.

$obj:=New object("addition";Formula($1+$2))

$number :=$obj.addition(1;2) // vrátí 3
$text :=$obj.addition("hello "; "world") // vrátí hello world
.

Příklad 4 – Testování série podmínek

Pokud vytvoříte posloupnost podmínek, například If (() & ()), 4D vždy vyhodnotí všechny podmínky. Nezastaví se a pokračuje ve vyhodnocování následujících. Pokud lze některé podmínky vyhodnotit pouze tehdy, jsou-li pravdivé ty nejlevější, jste nuceni vytvořit hluboce vnořený seznam podmínek if, abyste před testováním atributu ověřili, zda je objekt platný. Takto to probíhá:

If (Not(Undefined($o))
If ($o.value#Null)
If ($o.value<5)
// to do
End if
End if
End if

V tomto příkladu jsme měli „jen“ 3 podmínky, ale snadno si všimnete, že je to čím dál složitější. Co takhle zapsat vše do jediné podmínky? Co takhle napsat metodu, která bude provádět vaše vzorce jeden po druhém? Pokud je výsledek True, vyhodnotíte následující vzorec, pokud je výsledek false, zastavíte se a vrátíte False.

If (_AND (\
Formula (Not(Undefined($o)));\
Formula ($o.value#Null);\
Formula ($o.value<5)\
))
// to do
End if

Pro metodu _AND velmi obvyklý a jednoduchý kód:

$0:=True
For ($i;1;Count parameters;1)
$0 :=${$i}.call()
If (Not($0))
$i :=MAXLONG-1 // Stop if the condition fails
End if .
End for

Doufám, že vám tyto příklady přiblíží další způsoby použití tohoto příkazu. Neváhejte se o své vzorce podělit na fóru 4D… Určitě máte spoustu nápadů!

Vanessa Talbot
• Product Owner • Vanessa Talbot se připojila k programovému týmu 4D v červnu 2014. Jako Product Owner má na starosti psaní uživatelských příběhů a jejich převod do funkčních specifikací. Její úlohou je také zajistit, aby implementovaná funkce odpovídala potřebám zákazníka. Od svého příchodu pracovala na definování klíčových prvků ve 4D. Pracovala na většině nových funkcí preemptivního multi-threadingu a také na velmi složitém tématu: nové architektuře pro enginované aplikace. Vanessa má titul z Telecom Saint-Etienne. Svou kariéru začala ve Výzkumném ústavu kriminalistickém jako vývojářka pro audiovizuální oddělení. Působila také v mediální a lékařské oblasti jako expertka na technickou podporu, produkci i dokumentaci novinek.