Skip to content Skip to sidebar Skip to footer

Tworzenie precyzyjnych i wydajnych warunków w Ferryt przy użyciu edytora zaawansowanego

W Aplikacjach Ferryt precyzyjne i wydajne warunki logiczne są kluczowe dla prawidłowego działania systemów, przetwarzania danych i obsługi logiki biznesowej. W tym artykule omawiamy, jak optymalnie tworzyć warunki, aby zachować czystość kodu, zwiększyć wydajność, a jednocześnie zadbać o poprawność operacji logicznych.

Warunki logiczne, czyli konstrukcje typu if, else if, switch, są fundamentem podejmowania decyzji przez aplikacje. Prawidłowe wykorzystanie warunków pozwala na kontrolowanie przepływu logiki biznesowej, co w realiach ferrytowych, operujących na dużych ilościach danych, ma ogromne znaczenie. Korzystanie z warunków możliwe jest zarówno z poziomu kontrolki przepływu „warunek” BPM, jak i z poziomu reguły, gdzie pętle można napisać z wykorzystaniem składni C# w edytorze zaawansowanym.

Zrozumienie warunków logicznych – podstawy

Warunki logiczne w Ferryt, bazują na operacjach porównania logiki binarnej, czyli prawda / fałsz – innymi słowy 1 / 0. Poniżej znajduje się podstawowy przykład warunku, który można wykorzystać do sprawdzenia stanu konta klienta:

if (PF.konto.CzyAktywne)
{
// Przetwarzanie aktywnego konta
}
else
{
// Obsługa nieaktywnego konta
}

Ten prosty warunek sprawdza, czy konto jest aktywne, co w praktyce decyduje o dalszych operacjach, takich jak przetwarzanie transakcji.

Kluczowe dobre praktyki

  • Zwięzłość: Warunki powinny być tak proste, jak to tylko możliwe. Złożone wyrażenia logiczne są trudniejsze do debugowania.
  • Czytelność: Nawet proste warunki muszą być czytelne dla innych developerów. Unikaj tworzenia wielokrotnych zagnieżdżonych warunków.

Rodzaje operatorów logicznych

W warunkach logicznych kluczową rolę odgrywają operatory, które pozwalają na tworzenie bardziej złożonych warunków. W Ferryt dostępne są m.in.:

  • && (AND): Warunek jest spełniony, gdy oba wyrażenia są prawdziwe.
    • Przykład: if (PF.konto.CzyAktywne && PF.konto.Saldo > 0)
  • || (OR): Warunek jest spełniony, gdy przynajmniej jedno wyrażenie jest prawdziwe.
    • Przykład: if (PF.konto.CzyAktywne || PF.konto.MaDostep)
  • ! (NOT): Zwraca wartość przeciwną do wyrażenia (negacja).
    • Przykład: if (!PF.konto.CzyAktywne) sprawdza, czy konto nie jest aktywne.
  • == (Porównanie): Sprawdza, czy dwie wartości są równe.
    • Przykład: if (PF.konto.Typ == "Osobiste")
  • != (Nierówność): Sprawdza, czy dwie wartości nie są równe.
    • Przykład: if (PF.konto.Typ != "Firmowe")

Optymalizacja warunków – od prostych do bardziej złożonych

W codziennej pracy z danymi w Ferryt, często musimy podejmować decyzje na podstawie wielu zmiennych. Na przykład, obsługując przelewy, musimy sprawdzić stan konta, dostępne środki oraz limity dzienne.

Przykład bardziej złożonego warunku:

if (PF.konto.CzyAktywne && PF.konto.Saldo >= PF.przelew.Kwota && PF.konto.LimitDzienny >= PF.przelew.Kwota)
{
    // Przetwarzanie przelewu
}
else
{
    // Odrzucenie przelewu
}

Tutaj mamy do czynienia z kombinacją trzech warunków. Aby warunek został spełniony, wszystkie trzy muszą być prawdziwe: konto musi być aktywne, saldo musi być wystarczające, a limit dzienny nie może zostać przekroczony.

Dobre praktyki optymalizacji warunków

  • Unikaj niepotrzebnych warunków zawsze spełnionych: Jeśli chcesz wykonać jakąś operację zawsze, nie umieszczaj jej w warunku if (true), ponieważ warunek taki zawsze jest spełniony i można go pominąć:

    if (true)
    {
    // Nie ma sensu używać takiego warunku, ponieważ zawsze zostanie wykonany.
    }


    Analogicznie, nie używaj if (false), ponieważ ten warunek nigdy nie zostanie spełniony i kod wewnątrz takiego bloku nie zostanie wykonany:

    if (false)
    {
    // Kod ten nigdy nie zostanie wykonany.
    }
  • Sprawdzanie wartości bool bez porównania: Jeśli pole jest typu bool, nie musisz porównywać go z true lub false.

    Zamiast:

    if (PF.konto.CzyAktywne == true)
    {
    // Przetwarzanie
    }


    Wystarczy samo:

    if (PF.konto.CzyAktywne)
    {
    // Przetwarzanie
    }
  • Kolejność warunków: Warto pamiętać, że warunki są sprawdzane sekwencyjnie. Zawsze umieszczaj na początku te, które mają najwyższą szansę na „wykrycie” nieprawdy.
    Na przykład, jeśli większość kont klientów nie ma wystarczającego salda, to sprawdzenie salda powinno być na początku.
  • Podział na mniejsze fragmenty: Jeśli warunek staje się zbyt długi, rozważ podział na mniejsze, nazwane zmienne:

    bool maWystarczajaceSaldo = PF.konto.Saldo >= PF.przelew.Kwota;
    bool miesciSieWLimicie = PF.konto.LimitDzienny >= PF.przelew.Kwota;

    if (PF.konto.CzyAktywne && maWystarczajaceSaldo && miesciSieWLimicie)
    {
    // Przetwarzanie przelewu
    }


    Dzięki temu kod staje się bardziej czytelny i łatwiejszy do zrozumienia.

Warunki wielokrotnego wyboru – kiedy stosować else if oraz switch

Podczas developmentu procesu często napotykamy sytuacje, gdzie decyzje są podejmowane na podstawie wielu różnych kryteriów. Warunki else if i switch są idealnym rozwiązaniem, gdy mamy do czynienia z wieloma opcjami.

Przykład zastosowania else if – obsługa różnych typów kont

if (PF.konto.Typ == "Osobiste")
{
// Przetwarzanie dla konta osobistego
}
else if (PF.konto.Typ == "Firmowe")
{
// Przetwarzanie dla konta firmowego
}
else if (PF.konto.Typ == "Oszczędnościowe")
{
// Przetwarzanie dla konta oszczędnościowego
}
else
{
// Obsługa nieznanego typu konta
}

Jak działa else if i czym różni się od else?

  • else if: Umożliwia sprawdzenie dodatkowych warunków w momencie, gdy pierwszy warunek if nie zostanie spełniony. Każdy else if jest sprawdzany sekwencyjnie, a gdy jeden z nich zostanie spełniony, kolejne warunki nie są już brane pod uwagę.
  • else: Jest ostatecznym warunkiem, który zostanie wykonany, jeśli żaden z wcześniejszych warunków (w tym if i else if) nie został spełniony. else nie sprawdza żadnego warunku – jest stosowany w sytuacjach, gdy chcemy pokryć przypadki „domyślne” lub „nieznane”.

Przykład ilustruje, że else zostanie wykonany, jeśli konto nie jest ani osobiste, ani firmowe, ani oszczędnościowe.

Dlaczego warto stosować else if zamiast nowego if?

  • Wydajność: Gdy używamy konstrukcji else if, kod zatrzymuje się po znalezieniu pierwszego spełnionego warunku i nie sprawdza kolejnych bloków.
    Natomiast, gdy używamy kilku oddzielnych bloków if, każdy z nich jest sprawdzany niezależnie, nawet jeśli wcześniejszy został już spełniony.
    Może to prowadzić do niepotrzebnych operacji, które spowalniają działanie programu.

    if (PF.konto.Typ == "Osobiste")
    {
    // Przetwarzanie dla konta osobistego
    }
    if (PF.konto.Typ == "Firmowe")
    {
    // Przetwarzanie dla konta firmowego
    }
    if (PF.konto.Typ == "Oszczędnościowe")
    {
    // Przetwarzanie dla konta oszczędnościowego
    }


    W tym przypadku, nawet jeśli konto jest osobiste, program sprawdzi także dwa kolejne warunki, co jest niepotrzebne. Użycie else if zapobiega temu, co zwiększa wydajność.
  • Czytelność: Konstrukcja else if w sposób logiczny grupuje powiązane ze sobą warunki, co sprawia, że kod jest bardziej czytelny i zrozumiały. Oddzielne bloki if mogłyby sugerować, że warunki nie są ze sobą powiązane, co może wprowadzać w błąd innych programistów.

Zastosowanie switch dla lepszej czytelności

Kiedy mamy do czynienia z wieloma różnymi przypadkami, użycie instrukcji switch może zwiększyć przejrzystość i wydajność kodu:

switch (PF.konto.Typ)
{
case "Osobiste":
// Przetwarzanie dla konta osobistego
break;
case "Firmowe":
// Przetwarzanie dla konta firmowego
break;
case "Oszczędnościowe":
// Przetwarzanie dla konta oszczędnościowego
break;
default:
// Obsługa nieznanego typu konta
break;
}

Kiedy wybrać switch zamiast else if?

  • Czytelność: Gdy mamy wiele warunków do sprawdzenia na podstawie jednej zmiennej, switch jest bardziej czytelny niż seria else if.
  • Wydajność: W niektórych przypadkach, szczególnie przy dużej liczbie warunków, switch może być bardziej wydajny.

Wyciąganie logiki do pola

W wielu przypadkach warto przenieść wynik złożonych warunków do pól charakterystycznych lub lokalnych zmiennych. Dzięki temu, kiedy zachodzi potrzeba wielokrotnego sprawdzenia tego samego warunku, nie trzeba powtarzać tych samych obliczeń i porównań w każdym miejscu kodu.

Przykład:

bool kontoSpełniaWarunki = PF.konto.CzyAktywne && PF.konto.Saldo >= PF.przelew.Kwota && PF.konto.LimitDzienny >= PF.przelew.Kwota;

if (kontoSpełniaWarunki)
{
// Przetwarzanie przelewu
}

Dzięki wyciągnięciu logiki do pola:

  • Reużywalność: Jeśli ten sam warunek musi być sprawdzony wielokrotnie w różnych częściach kodu, zamiast obliczać / sprawdzać go za każdym razem od nowa, można użyć wcześniej wyliczonego pola.
  • Optymalizacja wydajności: Nie trzeba za każdym razem obliczać warunku, co może oszczędzić zasoby w bardziej złożonych operacjach.

Używanie ternary operator – zwięzłe warunki

Dla prostych warunków logicznych, które wymagają jedynie przypisania wartości, operator ternary (? :) jest świetnym narzędziem. Umożliwia on zapisanie prostych warunków w jednej linii.

PF.statusKonta = PF.konto.CzyAktywne ? "Aktywne" : "Nieaktywne";

Ternary operator działa w następujący sposób:

  • konto.CzyAktywne – warunek logiczny. Jeśli zwróci wartość true, zostanie wykonana pierwsza część.
  • "Aktywne" – wartość zwracana, jeśli warunek jest prawdziwy (true).
  • "Nieaktywne" – wartość zwracana, jeśli warunek jest fałszywy (false).

Jest to zwięzła alternatywa dla klasycznego if-else, która sprawdza się w przypadkach, gdzie potrzebujemy zwrócić jedną z dwóch wartości w zależności od warunku. Jest wygodna i czytelna, jednak należy jej używać z rozwagą, aby nie pogorszyć czytelności kodu w przypadku bardziej skomplikowanych warunków.

Podsumowanie

Tworzenie precyzyjnych i wydajnych warunków w Ferrycie jest kluczowe dla poprawnego działania aplikacji bankowych. Ważne jest, aby kod był nie tylko optymalny, ale również czytelny i łatwy w utrzymaniu. Dobre praktyki, takie jak

  • właściwe użycie operatorów logicznych,
  • unikanie niepotrzebnych porównań,
  • optymalizacja złożonych warunków,
  • wyciąganie logiki do pól i stosowanie, gdzie to możliwe, operatora ternary

pomagają w pisaniu kodu, który nie tylko działa efektywnie, ale także łatwo się w nim odnajduje i łatwo się go debuguje i utrzymuje.

6 komentarzy

Zostaw komentarz