Stateless klasa i array

Sad nisam siguran da li je ovo gore dobro.
Stateless klasa bi trebalo da bude trigger-ovana spolja ali tako da taj spoljni faktor ne očekuje ništa zauzvrat.
Tj. dalja egzekucija koda u spoljnom faktoru ne zavisi od return-a “stateless” klase.
Radio sam nešto slično sa webhook rutom.
Pravio sam aplikaciju za Shopify i pri deinstalaciji Shopify će da pošalje signal tvom serveru na adresu koju si naveo ne očekujući ništa osim response koda 200.
Služi da tvoja aplikacija na serveru primi informaciju da je mušterija deinstalisala aplikaciju iz svog shop-a i da se na serveru upotpuni šta bi trebalo u odnosu na tu informaciju (tipa da promijeniš mu status, obrišeš iz baze ili bilo šta treće).
Dakle Shopify samo pošalje signal da se mušterija skinula sa aplikacije i ne zanima ga šta ćeš ti sa tim saznanjem - ne utiče na dalji rad ni Shopify kompanije ni mušterije nezadovoljne (?) tvojom aplikacijom. Ako mu (Shopify-ju) ne vratiš status 200 slaće opet nekad u toku dana ali to je to, mušterija nema više veze sa tvojom aplikacijom bez obzira dao ti do znanja da ti je jasno (status code 200) ili ne.
To bi bio stateless.
A sa druge strane ni ovaj kod gore ne zavisi od session-a ili čega drugog već samo očekuje fajl.

Ajmo ovako, obzirom na ovo što si napisao, i na osnovu mog razmišljanja kako to napraviti (opet govoreći o tom famoznom patternu čije ime neću više spominjati):

$t = new  SortirajFajl("in-file.txt", "out-file.txt")

Klasa SortirajFajl{
__construct ($inputfile, $outfile)
{
    $this->fileUArray();
    $this->sortirajArray();
    $this->spremiFile($outfile);
}
}

bi bilo neispravno?

Imaš syntax error :stuck_out_tongue: ali to je otprilike šta sam stavio gore osim naziva output fajla kojeg sam ostavio auto generatoru.
Mislim da je to to i samo proslijediš out file kome treba (u slučaju da nije trigerovan error/exception).

Syntax error… :smiley:
Pišem preko moba, ideju črčkam, ne kod.
Dakle, to bi zapravo bilo ispravno, bez obzira što se array sortira u “memoriji” unutar klase?
To je taj s. dio koji ne shvaćam. Dozvoljeno je vrtiti array unutar klase a da se poštuje? Stateless klasa zapravo ne smije “vraćati” nikakvo stanje objekta? Odnosno, ta klasa ne ni smjela imati svoje stanje, ali unutar sebe može baratati podacima kako želi, uključujući i čitanje datoteke, držanja arraya (koji ne smije biti dostupan van klase) i pisanje po disku? Jel to?

Pa ti definitivno moraš da trošiš neku memoriju unutra da čitaš sadržaj fajla.
Šta s’ se stis’o za memoriju? :joy:
I nemoj ostavljati u varijabli $t već samo izvrši egzekuciju.
I to u try catch bloku a u klasi idi sa throw new \Exception kad god ti nešto ne odgovara.
Ja sam tako nešto ostavio gore a ovaj dodatak sa davanjem imena output fajla je odličan.

Gdje god da pozivaš ovu funckcionalnost:

try {
    (new \namespace\to\SortirajFajl("string1", "string2"));
} catch (\Exception $e) {
    // not executed
}

Ma nije što sam škrt na memoriji, nego mi je taj shitless pattern misterija.
Jesam li dobro shvatio s pattern? (prethodni odgovor)?

Mislim da bi tako trebalo.
Btw. vidi kako (npr u Laravelu) funkcioniše event/listener par a isto tako queues. To je isto primjer stateless-a. Stateless je u principu kad ne zavisi od session-a.

1 Like

Haleluja, aleluja i Alahu akbar u isto vrijeme!!!
Napokon da shvatim što je to. Brz sam ko Forest Gumb.
Sad je lakše, dalje nije frka :slight_smile:

Ne spamuj. Ima tema.

1 Like

Ustvari i mislim (sad kad se zamislim :smiley: ) da možeš smatrati stateless procesom onaj koji možeš da strpaš u queue (recimo da ga server odradi poslije). Ne kažem da mora biti delay u odradjivanju niti da to treba biti patern. Ali ako je priroda koda takva da možeš da ga staviš na čekanje da bi se odradio, mog’o bi se smatrati za stateless.

Ako tako gledamo, onda ovakav kod sa ovakvom klasom možemo strpat u queue bez problema.
Obzirom da je stless, smije li ona vratiti (stanje) true ili false, ili explicitno ne smije vratiti ništa?
Ovo je čisto pitanje iz znatiželje.

Ako uzmemo nešto iz queue-a (recimo slanje mejla), izgledalo bi ovako nekako:

if (false === $this->mailSent()) {
   \Log::error("Some notice. " . time());
}

Mada više volim raditi sa \Exceptions, try catch blokom i throw. Nekako mi zgodnije i čitljivije a i lakše.

try {
    true === $this->mailSent();
} catch (\Exception $e) {
    // write log about it
}

Ako je u queue-u, nema kome vratiti.
Zato i kažem, ako je za queue stateless je.

1 Like

@krcmar @creatifcode slažete li se sa zaključkom “što je stateless klasa” ili imate što za dodati, napomenuti, ispraviti nas?

A stateless/immutable class is said to be stateless when it doesn’t have any mutators

Mislim da je pravo pitanje “zašto tako izvesti”, umjesto “kako to izvesti”.

Na pitanje “kako?”
U tvom slučaju ne vidim problem da unutar sort metode kreiraš lokalnu varijablu koja će ti poslužiti za sortiranje.
Također ne vidim problem da metoda stateless klase vraća output.

Na pitanje zašto?
Nisam baš našao jasne odgovore, ali koliko vidim tu se čak spominje problematika optimizacijske prirode. Ako imaš stateless/none-mutabile klasu, onda je engine u pozadini rasterećeniji…i nas obične smrtnike boli k* za to, ali nekome su ti djeca i brine o svakom taktu procesora :smiley: :smiley:

Druga stvar, ako nije stateless…i ako netko baš traljavo rješi stvar…onda bi moglo biti i thread-none-safe.
Recimo, tvoj file koji mijenjaš bi se mogao tretirati kao state…i onda recimo da udare dva paralelna poziva, a ti da hendlaš samo jedan file…mogla bi se stvar skršiti.

Možda sam sve ovk bubnuo ko padobranac :smiley: …ali ovo malo što pročitah o statelessu, dobio sam ovakav dojam.

1 Like

Dobro je što si uletio :slight_smile:
Dakle, klasa bi trebala biti ili singleton, ili napraviti ovakvo rješenje:

  1. new SortirajFajl (inputfile.txt, outputfile.txt)
  2. (u klasi):
  • provjeri postoji li file _inputfile.txt

  • ako ne postoji napravi _inputfile.txt koji je kopija inputfile.txt

  • ako postoji, provjeri koliko je star, ako je stariji od (recimo) 2 sekunde, obriši ga i napravi novi _inputfile.txt koji je kopija inputfile.txt

  • ako je noviji od 2 sekunde baci exception da je file in use i prekini

  • napravi sort

  • spremi sort u outputfile.txt

  • obriši _inputfile.txt

To bi (po mome) riješilo problem kojeg si DOBRO primjetio, klasa bi ostala stateless, a ne bih morao koristiti singleton.
Mišljenja?

Ja iz ovog ne vidim ništa tu šta si sad naveo.
Je li moguće da postaviš kompletan zadatak?
Pa i ako ne želiš rješenje, da tek znamo šta je zahtjev.
Meni misli lutaju lijevo desno svakim novim postom u situaciji kad ne znam šta je zahtjev.
:unamused:

Ne slazem se. Web je sam po sebi statless, dakle opalis request i nemas vise pojma sto se dogadja. Statless je sve sto nesprema trenutni status i gdje ne mozes pratiti state(status) svoje aplikacije. Zato su dobri ljudi izmislili Sessions, cookies, cache itd.

Moglo bi se u kratkim i jednostavnim crtama reci da je na webu sve sto ne koristi nekakav session storage stateless.

Ono sto mi se u ovom zadatku cini da ti moras u raditi je API Endpoint koji ce primiti jedan parametar i vratiti resultat.

Ne.

Zaprimi request, obradi request i vrati response, nema provjere dali postoji to nesto vec jer onda vise nije stateless.

Ovdje se radi 99% posto o APIju

1 Like

Jel cilj rješiti nekakav zadatak po specifikaciji …ili imaš konkretan problem?
Čini mi se da je ovo prvo? Jer ako je konkretan problem, sumnjam da bi sam sebe ganjao u eksplicitni teoretski stateless?

Ja sam se ubacio samo da dam svoje mišljenje o svrsi stateless patterna.
A zaboravio sam reći ono valjda najglavnije…ako je klasa stateless, onda je output/input = const.
Čim klasa ima neku unutarnju promjenu/mutaciju …to se vjerovatno nekako preslikava i na output/input.

Kako se spomenula web stranica da bi bila stateless modul kad nebi imala coockie niti sessione…valja dodat da nebi smjela imati ni bazu podataka niti ikakvo trajno spremanje u bilo kakvu memoriju…da bi se ponašala stateless.
I ako ćemo o teoriji, u tome moguće leži kvaka. Bitno različito bi bilo testirati module koji su stateless i koji nisu…

1 Like

A u praksi se uvijek sudarimo s činjenicom da je jedina konstanta promjena :smiley:

1 Like