# Dobre praktyki ScriptCode

### Kontekst <a href="#dobrepraktykiscriptcode-kontekst" id="dobrepraktykiscriptcode-kontekst"></a>

Reguły dotyczące pisania ScriptCode na platformie Eximee pozwolą zapewnić spójność, czytelność oraz bezpieczeństwo kodu, a także ułatwią wdrożenie nowych pracowników.

Twórz ScriptCode zgodnie z regułami opisanymi poniżej.

<table><thead><tr><th width="206">Obszar</th><th>Reguła</th></tr></thead><tbody><tr><td>Spójna konwencja nazewnicza</td><td><ul><li>Pisz kod w języku angielskim - stosuj angielskie nazwy zmiennych, funkcji itp.</li></ul><p><strong>Wyjątki:</strong> odgórne ustalenia biznesowe dotyczące nazewnictwa lub duży poziom skomplikowania skryptu (tu decyzja należy do low-code developera). Jeśli decydujesz się na konwencję nazw po polsku - <strong>bądź spójny w obrębie jednego skryptu</strong>.</p><ul><li>Stałe literalne <strong>wpisane na sztywno</strong> w kodzie nazywaj w formacie UPPER_SNAKE_CASE, np. const MOBILE_CHANNEL = "mobile"</li><li>Pozostałe zmienne i funkcje nazywaj w formacie camelCase, np. const correlationId = context.getFirstParameter('correlationId'), let motherBranchNumber, function generateBranch()</li></ul></td></tr><tr><td>Kolejność w strukturze kodu</td><td><p>Kod organizuj zgodnie z poniższą kolejnością:</p><ol><li><strong>Stałe literalne</strong>- deklaruj na początku skryptu</li><li><strong>Zmienne</strong> - następnie deklaruj zmienne, które będą używane w logice głównej</li><li><strong>Logika główna</strong> - główny ciąg operacji, które kod wykonuje (np. przetwarzanie danych, wywoływanie funkcji)</li><li><strong>Funkcje pomocnicze</strong> - umieszczaj na końcu</li></ol></td></tr><tr><td>Logowanie</td><td><ul><li>Nie duplikuj logów platformowych - jeśli jakieś parametry są automatycznie generowane przez platformę nie loguj ich ponownie w skrypcie</li><li>Używaj loggera sensytywnego do logowania danych wrażliwych, wzór: <a href="http://logger.info/">Logger.info</a>("Pesel klienta wypełniony na formularzu: {}", pesel)</li></ul><p><strong>Dowiedz się więcej:</strong><br><a href="/pages/nONGQHEohx3s2IpUnHE5">Logowanie w ScriptCode</a></p></td></tr><tr><td>Deklaracja zmiennych</td><td><ul><li>Nie używaj varów</li><li>Typy prymitywne: używaj let tylko gdy zmieniasz w skrypcie wartość zmiennej. W pozostałych przypadkach używaj const</li><li>Typy złożone: nie używaj let jeśli modyfikujesz tylko zawartość obiektu - w tym tablic (Array), setów (Set), map (Map).</li></ul><p>Nie ma potrzeby używania let przy deklarowaniu obiektów - w tym tablic (Array), setów (Set), map (Map) - o ile referencja (czyli odwołanie do konkretnego obiektu lub tablicy) nie będzie zmieniana.<br><strong>W większości przypadków powinno się stosować const do deklarowania tablic i innych obiektów, nawet jeśli ich zawartość będzie modyfikowana.</strong></p><p>Przykład z użyciem const:</p><p>const array = [1, 2, 3];<br>array.push(4); // Działa poprawnie, modyfikujemy zawartość tablicy</p><p>const obj = { name: "Alice" };<br>obj.age = 30; // Działa poprawnie, modyfikujemy właściwości obiektu<br></p><p><strong>Uwaga:</strong> Dopóki silnik rhino nie wspiera poprawnie zakresu blokowego dla const należy wewnątrz pętli "for" deklarować zmienne z wykorzystaniem let. Więcej o błędzie można przeczytać w materiale podlinkowanym poniżej.<br></p><p><strong>Dowiedz się więcej:</strong><br><a href="https://kursjs.pl/kurs/super-podstawy/typy-danych">Typy danych w Javascript</a>,</p><p><a href="https://www.youtube.com/watch?v=-mbiJ2it-5M">Referencja, mutowalność, typy prymitywne - powtórka Javascript!</a></p><p><a href="/pages/GZF5HTuxLPClXGMU6Y4Z">Skrypty(ScriptService)</a></p><p><a href="http://mozilla.github.io/rhino/compat/engines.html">Tabela z wykazem które funkcjonalności nie są obecnie poprawnie wspierane przez silnik rhino</a><br><a href="https://github.com/mozilla/rhino/issues/326">Rhino: błąd przy deklaracji const wewnątrz pętli for</a></p></td></tr><tr><td>Obsługa błędów</td><td><ul><li>Używaj bloków <code>try-catch</code> w miejscach, gdzie mogą wystąpić wyjątki. W razie wystąpienia błędu, loguj go z użyciem loggera, aby umożliwić łatwe śledzenie problemu.</li></ul></td></tr><tr><td>Czytelność kodu</td><td><ul><li>Kliknij prawy przycisk myszy → wybierz Format Document. Dzięki temu kod będzie bardziej przejrzysty i czytelny</li><li>Usuwaj kod, który jest zakomentowany i już niepotrzebny</li><li>Pisz komentarze w sposób zwięzły i jasny, wyjaśniając trudniejsze fragmenty kodu, intencje i nietypowe rozwiązania. Unikaj oczywistych komentarzy, które jedynie powtarzają to, co jest już czytelne w kodzie.</li></ul></td></tr><tr><td>Powtarzalność kodu</td><td><ul><li>Jeśli powtarzasz kilka razy fragment kodu - stwórz funkcję pomocniczą</li></ul></td></tr><tr><td>Opis skryptu</td><td><ul><li>Tworząc nowy skrypt/walidator - dodaj opis</li></ul></td></tr><tr><td>Testy</td><td><ul><li>Twórz testy jednostkowe zawsze gdy jest to możliwe, uwzględniaj warunki brzegowe.</li></ul></td></tr><tr><td>Bezpieczeństwo</td><td><ul><li>Wszelkie parametry wchodzące do ScriptCode'u traktuj jako niezaufane przy wysyłaniu do usług</li></ul><p><strong>Przykładowy kod:</strong></p><p>Źle:</p><p>Dobrze:</p><ul><li>Nie używaj danych autoryzacyjnych bezpośrendio w ScriptCode</li><li>Pobieraj zdalne zasoby (obrazki, dokumenty, wizerunki kart itd. ) z zaufanego źródła (np. platforma eximee, zasób bankowy)</li><li>Jeżeli musisz użyć w aplikacji jakikolwiek link upewnij się, że jest zaufany a jego użycie wynika wprost z wymagań</li><li>Jeżeli jakiejś funkcjonalności nie ma w platformie to zgłoś zapotrzebowanie - nie korzystaj z zewnętrznych narzędzi</li></ul><p><strong>Dowiedz się więcej:</strong> <a href="/pages/wszkqqe6c2DRybsqS5sC"><strong>OWASP_Application_Security_Verification_Standard_4.0 - scriptCode</strong></a></p></td></tr><tr><td>Operacje matematyczne z BigDecimal</td><td><ul><li>Operacje matematyczne przeprowadzaj z wykorzystaniem z BigDecimal</li></ul><p><strong>Dowiedz się więcej:</strong> <a href="/pages/P84h90zrI100rt53HWBu">Operacje matematyczne w ScriptCode</a></p></td></tr><tr><td>Obsługa wartości falsy</td><td><ul><li>Przed użyciem właściwości lub metod sprawdź, czy wartość zmiennej nie jest <code>null</code> ani <code>undefined</code>, aby zapobiec błędom związanym z brakiem wartości. W sytuacjach, gdy chcesz wychwycić również <code>0</code>, pusty string lub <code>NaN</code>, możesz stosować ogólny warunek <code>if(value)</code>.</li></ul></td></tr><tr><td>Review</td><td><ul><li>Jeśli nie jesteś jedynym low-code developerem w zespole - poproś kogoś z teamu o review kodu.</li></ul></td></tr></tbody></table>

### Materiały <a href="#dobrepraktykiscriptcode-materialy" id="dobrepraktykiscriptcode-materialy"></a>

* [OWASP\_Application\_Security\_Verification\_Standard\_4.0 - scriptCode](/budowanie-aplikacji/logika-biznesowa/scriptcode/dobre-praktyki-scriptcode/owasp_application_security_verification_standard_4.0-scriptcode.md)
* [Operacje matematyczne w ScriptCode](/budowanie-aplikacji/logika-biznesowa/scriptcode/skrypty-scriptservice/api-skryptow/operacje-matematyczne-w-scriptcode.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.eximee.com/budowanie-aplikacji/logika-biznesowa/scriptcode/dobre-praktyki-scriptcode.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
