Diskuze – Lekce 9 - OOP diář v JavaScriptu - Formátování a mazání záznamů
ZpětUpozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.


Ten příklad s jednou hlavní komponentou, která v sobě obsahuje ostatní komponenty je asi ideální OOP. To si dovedu představit třeba u desktopových aplikací i z hlediska předávání argumentů, zapouzdření atd. Krásná práce. Ale u webu, kde mám část jen statický text, část jednoduché komponenty s funkcemi a jinou část, kde probíhají složitější objektové události mi to přijde nereálné. Navíc objekty jsou navázané na elementy v DOMU, což to ještě více komplikuje. Možná na to jdu ale špatně a řeší se to úplně jinak.
Petr Zabransky:19.2.2023 12:41
Jinak stylování komponent teď neřeším. To dělám pomocí SASS + BEM. Řeším vlastně obsluhu těch komponent javascriptem a nejraději bych to měl všechno jako objekty.
Lubor Pešek:19.2.2023 16:28
Mám za to, že tento druh přemýšlení tě jednou zavede na cestu, kdy
budeš muset ať už na straně serveru nebo i na straně clienta držet spoustu
komponent v paměti.
Toho by ses měl na webových aplikací hodně vyvarovat.
Dokonce jsem zjistil, že je lepší nevytvářet přímo nějaké obsáhlé komponenty jako takové, ale vytvářet si jednoduché divy. Ty potom přes třídy v cssku stylovat a pokud možno nervat do nich moc funkcí. Proč? Protože musíš brát v úvahu, že web je interpret. Čím míň toho musí dynamicky načítat, tím je to vždycky lépe.
Proto to třeba zní i šíleně, ale i blbá tabulka vytvářená přes divy
je pro performance lepší, než používat kupříkladu přímo HTML tag
table.
Proto osobně na webu přemýšlím stylem - komponentu si pouze nějak obecně
stylovat pomocí tříd a potom její funkci řešit přes JS.
A teď zkusím tedy návrh. Tak, jak to popisuješ, tak je to v podstatě jednoduché. V jednom jediném JS souboru si nadefinuješ veškeré třídy a na tento soubor se vždy odvoláš, když budeš konkrétní třídu vytvářet. Řešil bych to přes parametry. Musíš najít co nejvíce společných prvků a pak už jen pomocí parametrů ovlivňovat chování každé třídy. Tam, kam bude potřeba, tam narveš statický text. (to bych dal jako první parametr). No a druhým parametrem bys třeba mohl dát pole metod (JS na rozdíl od Javy dokáže pomocí parametru předávat i metody, což se ti zde bude perfektně hodit) a v té třídě už potom tohle chování zpracuješ. Jednotlivé metody opět můžeš mít v dalším separátním souboru a nebo pokud budou příliš unikátní, tak je definuj přímo na místě, odkud to budeš provolávat.
Čili budeš mít potom ve výsledku nějakou funkci, která bude z dalšího
JS soboru spouštět tu danou metodu (případně vytvářet takový objekt),
který potřebuješ.
No a vždycky se budeš odkazovat právě na to jedno centrální místo, odkud
tuhle metodu zavoláš a lišit se to bude už pouze a jenom v těch
parametrech.
Potom je tu ještě jedna věc - jestli si nechceš hrát na Spring
container, který by vytvořil naprosto všechny objekty, ty měl někde
uchované a s nimi pak pracoval... To je dobré právě pro kompilovaný
program, který může tuhle paměť využívat a je i efektivní. Otázka je,
na co by ti to bylo na webu. Ok, můžeš mít třeba pod okno, kterým chceš
pracovat s dřívějším objektem.
Lehká pomoc - v takovém případě nemusíš tahat nic z centrální paměti,
ale objekt, který třeba jen upravuješ nebo ze kterého potom taháš data,
tak si při přepínání stránek přesuneš v nějakém modelu v
parametru.
Ono to takto v podstatě funguje i v praxi. Nikdy si nepamatuješ úplně všechno, ale vytváříš čisté objekty. Data do nich narveš pak třeba z databáze. Ale jakmile dokončíš nějaký proces, tak je zbytečné si cokoliv pamatovat.
Příklad: Když dejme tomu vytváříš nějakého uživatele. Tak
vytvoříš nový objekt a otevřeš nový formulář. Tento objekt naplníš
vloženými daty (rovnou provádíš i validaci - je důležité rozlišovat,
jakou validaci je třeba provést na webu a jakou na backendu. Pokud jedeš jen
web, tak musíš pak provádět všechno samozřejmě). No a dále pak data
uložíš do databáze a tím celý proces končí a ty tento objekt už
nepotřebuješ nijak držet v paměti. Na co?
Potom, když budeš s tímto uživatelem chtít pracovat, tak vytvoříš nový
objekt a pomocí IDčka si dokážeš vytáhnout z databáze data, kterými
nový objekt naplníš. A pak jej používáš pro to, pro co je daný objekt v
tu chvíli určen. A pak jej zase zahodíš.
To samé třeba ty komponenty jako takové. Ty si nepotřebuješ nikde držet
v paměti veškerá tlačítka, která se v aplikaci budou používat.
Mohlo by to mít jeden dobrý efekt a to, že by sis třeba mohl i nějak u toho
kontrolovat, kde všude se daná komponenta využívá. Když potom zjistíš,
že komponentu nevyužívá nikdo, mohl bys její definici smazat. To by mohla
být malá výhoda, ale...
Ber to tak, že dobrý web má různá práva pro jiné uživatele. Kupříkladu
že nějaké tlačítko se zobrazí danému uživateli, ale jinému ne. Nějaký
combo box bude mít takovou nabídku a druhý bude mít zase jinou (na stejné
stránce, ale jiným uživatelům).
Pak bys musel veškeré tyhle informace a data načítat už na startu. Ano,
potom bys to mohl mít teoreticky rychlejší, ale za čas bys měl nesmírný
problém s pamětí.
A to se bavíme jen o tom, že ten web bude využívat jeden člověk. Až bys
dělal web, na kterém ti bude řádit 10 000 uživatelů a každý z nich bude
furt provádět nějaký request, tak se z toho celý systém posere, když už
na začátku vyplýtváš spoustu paměti jen na ukládání všech
komponent.
Dneska se právě řeší, kde všude ušetřit místo, aby se toho v paměti
ukládalo co nejméně.
Těžké je mnohdy i vybilancovat, do kdy má smysl ukládat si statická data z
databáze do paměti, abychom ušetřili čas posíláním requestu třeba z
nějakého výčtu.
Jak jsem psal - spíš se skutečně vše dělá tak, aby komponenta byla co nejjednodušší a v podstatě se vždy vytvářela ve chvíli, kdy bude potřeba.
Lubor Pešek:19.2.2023 16:39
U webových aplikací musíš malinko jinak přemýšlet, než třeba u
desktopu. Tam můžeš zamrdat paměť bez problémů (samozřejmě s rozumem:D)
a kór v dnešní době to nebude až tak vadit.
Ale web je o dynamičnosti. Když budeš používat jednoduché komponenty, tak
ty můžeš vytvářet tehdy, kdy je budeš potřebovat. Na tom jsou právě
frameworky založené. Ty si v HTMLku v konečném důsledku vždy vytváříš
to, co se v dané části na stránce změní. Neměníš už dokonce ani celou
stránku, ale vždy část, která se dynamicky mění.
No a v takovémto případě vážně nemusíš mít vytvořené veškeré
komponenty předem. Na co?
Na co ti je kupříkladu komponenta pro combo box u formuláře, který má jen
textová pole a tlačítko? V tuhle chvíli si zbytečně držíš místo v
paměti komponentou, kterou nepotřebuješ.
A když ji potřebuješ, tak ji v danou chvíli lehce vytvoříš.
Ten centrální přístup, který jsem zde popisoval, tak platí zejména pro
data.
Můžeš takhle z jednoho místa využívat společné metody, kterým se pak
následně právě dostaneš k požadovaným datům.
Příklad, který jsem zde uváděl, tak byl pro návrh programu, který nepočítá s dynamickým rozložením webu, kdy si každá stránka bude vše spravovat sama.
Každopádně pokud bys fakt měl takový návrh, kdy by dejme tomu třeba 20
komponent mezi sebou skutečně moc často komunikovali napříč celou
aplikací a vzájemně se ovlivňovaly, tak samozřejmě takové věci
nejjednodušeji řeší pole nebo ještě lépe mapa.
A klidně pro tvůj přehled (abys nemusel šíleně pracovat třeba s IDčkami
atd.) tak si vytvoř mapu map neboli mapu, která spravuje jednotlivé mapy pro
každé komponenty. Konkrétně bych to viděl tak, že v té hlavní mapě bude
mapa pro tlačítka, pro combo boxy, pro text fieldy, pro color pany atd. No a
potom každá vlastní mapa v sobě si už bude pod nějakými hesly pamatovat
danou komponentu, kterou budeš potřebovat.
No a takhle budeš mít uloženou "lokální databázi" v paměti a budeš moct
s těmi objekty komponent přímo pracovat mezi sebou.
Ale vážně bych se na webu tomuhle řešení snažil vyhnout. Tohle
řešení je buď na desktop a nebo na návrh nějaké webové aplikace, která
je jen na jedné stránce.
Pak ale předpokládám, že těch komponent nebudeš mít tolik, aby to byl tak
závažný problém a nenapadlo by tě použít mapu.
Lubor Pešek:19.2.2023 16:55
Tak beru zpět Podíval
jsem se na tvůj kód a chápu tedy, že všechno máš v jednom souboru a web
jako takový nestyluješ do více stránek.
Sorry, já už jsem asi hodně zkažený frameworkem, takže už deafultně
očekávám, web o více stránkách.
Tak pak ano, tak jestli to máš takhle jednoduché, tak i tvůj dotaz dává smysl a pak je fakt jednoduché řešení mapa a map, jak jsem popisoval. A jsi vysmátý. Každý objekt při vytváření vložíš do této mapy a pak už si jej taháš pouze odsud.
Petr Zabransky:19.2.2023 18:31
Děkuju moc za vysvětlení 👍 To s tou pamětí mě vůbec nenapadlo. Zatim to mám sice jednu stránku a učím se na tom, ale plánuju to rozšířit a chci se to učit od začátku správně a vidět to v širším kontextu. Je to docela složité jak vidím. Možná proto to většina firem řeší těmi frameworky. Ten FW tě přecejen drží v urcitych kolejích a řeší spoustu věcí za tebe a pak je to i čitelnější po druhych. Možná nakonec ustoupím a půjdu s dobou a naučím se ten React. Chtěl bych už někde nastoupit i treba na zkoušku a pak se vyvíjet. Takhle nevím, co se přesně ucit ikdyz tu jsou nějaké osnovy. Tech technologií a variant je spousta a každá firma to ještě řeší jinak a u nás na Ostravsku není zase tolik firem, které by se o juniory praly. Tak ještě jednou děkuju moc za ochotu a tvůj čas 👍🙂
Lubor Pešek:19.2.2023 22:21
Neexistuje "správné" řešení. Máš tu tři faktory. Cenu/čas vývoje,
výkon, čistý kód. NIKDY se ti nepodaří najít takové řešení, které by
bylo dobré pro všechny tyto složky:) Vždycky je to max 2 na úkor
jednoho.
Navíc žádné řešení není správné.
Na to, co jsem psal, tak se podívá 10 programátorů. 2 z nich netuší, o
čem je řeč, 4 se chytí za hlavu, co to píšu za ptákoviny, 4 se mnou budou
souhlasit.
Musíš vždy přemýšlet nad tím, co děláš a jaký bude tvůj hlavní cíl. Ne vždy to tak i dopadne, ale aspoň se od něčeho odrazíš.
Jinak frameworků se neboj. Jak říkáš - pomáhá to nějakým způsobem zjednocovat kód. Hlavně backend je hodně všude podobný. Samozřejmě každá firma si pak následně předělává různé části kódu pro své účely, ale základy se odvíjí od toho samotného.
Když si projdeš zdejší tutoriály, tak budeš mít dobré základy.
Ačkoliv musím přiznat, že co se webových technologií týče, tak určitě
u těch lekcí pročítej vždy i komentáře. Spousta programátorů tam píše
dobré postřehy. Sežere ti to čas, ale každá minuta, kterou investuješ do
svého rozvoje ti přinese nakonec víc, než si myslíš;)
A neboj se experimentovat a hrát si s tím. Hlavně se nelekej, že je něco
těžkého. Když je něco těžké - tak to musíš pochopit a strávit nad
tím víc času, ale vše je pochopitelné.
Tak hodně štěstí a kdybys měl někdy nějaký problém, tak mi klidně i napiš PMko. Když budu vědět, můžeme na problém juknout.
Ahoj, děkujeme všem za podnětné reakce na článek, pracujeme na aktualizaci, tak se na vše důkladně podíváme.
Citace z článku:
Vytvoříme instanci objektu Date z našeho data a použijeme její metodu toLocaleString()
Zřejmě je zde překlep a má být uvedeno toLocaleDateString().
Zobrazeno 10 zpráv z 34.