Sintaksa za provjeru strukture objekta

Kužim što pričaš, imam to rješeno pošto postoji mogućnost registracije custom single typeova.

Recimo, bez registracije custom typova da moramo validirati objekt koji je garaža…koji je array auta, to bi bilo:

//valiator za garažu:
"array<object[brojVrata:int, vozac:objekt, volan:string[left|right]]>"

//Znači samo auto nam je: 
"object[brojVrata:int, vozac:objekt, volan:string[left|right]]"


//I sada ako imamo objekt koji ima više garaža morali bi pisati:

"object[
    garaza1:array<object[brojVrata:int, vozac:objekt, volan:string[left|right]]>
    garaza2:array<object[brojVrata:int, vozac:objekt, volan:string[left|right]]>
]"

//što je glupo, jer želimo pisati:

"object[
    garaza1:array<auto>
    garaza2:array<auto>
]"

//ili još bolje, želimo pisati:

"object[
    garaza1:garaza,
    garaza2:garaza
]"

// Pa se to postiže vrlo jednostavno i po već poznatom principu deklaracija klasa. Tako da sintaksa koja će istovremeno deklarirati klasu i koristiti je za validaciju izgleda:


"
@auto:object[brojVrata:int, vozac:objekt, volan:string[left|right]]
@garaza:array<auto>

object[
    garaza1:garaza,
    garaza2:garaza
]"


// ..i sada ako kontroliramo strukturu nekog objekta sa gornjom validacijom, onda prolazi samo za objekt koji na ključu garaza1 ima garazu, te na ključu garaza2 ima garažu.
// I to je točno ovo što ti pričaš, samo u tvom slučaju imamo nešto tipa:

"
@myPassword: string{20-30}
object[pass:myPassword, key2:..., key3:...]"

I na ovaj način pisano, to su lokalne deklaracije klasa. Dok postoje i globalne, koje se mogu registrirati putem metode za registraciju novog singleType-a.
I kao što sam dao u uvodnom primjeru, registracija novog tipa se ne mora slagati samo iz komibnacije postojećih tipova, nego se pomoću funkcije može customizirat da bude bilo što. Primjer:

ADDING CUSTOM TYPES

    addCustomControlType("strlen4", function(x){return isString(x) && x.length==4});
    array<strlen4>  -> za ulaz ["abcd", "efgh"]  -> vraća true

Meni se uglavnom čini vrlo koristan alatić. :slight_smile:
Inspired by C#, hehe.

…a i bit će još toga, uvest ću relaciju “this”, tako da se može raditi komparacija na razini objekta, nešto tipa:

objekt[key1:string, key2:array{this.key1.length}]

isto tako i relaciju “this.parent”, kako bi se mogla raditi komparacija na različitim razinama objekta.

Recimo u gornjem primjeru sa autom i garažom, da se može postaviti uvjet da auto ispunjava nešto što garaža zahtjeva da ispunjava svaki auto koji joj pripada.

Pala mi je na pamet u međuvremenu još jedna primjena.
Ako se malo razmisli, jedan ovakva sintaksa nosi u sebi sve potrebne meta-podatke da se konstuira input forma.

Tako da bi za neke komponente to mogao biti jedan od ulaznih parametara po kojem će one izbaciti kompletnu input formu. :slight_smile:

Ma primjene su razne. :slight_smile: …i zato sam smatrao da je korisno izvući tu sintaksu iz razine compilera, i upogonit je u “ručnu” upotrebu. Kako će je netko koristiti, na njegovu volju.

Loša struktura ispliva sa 15 linija koda (vjerovatno zato i palamudiš u tomovima bez ikakvog koda).
Niti garaža niti auto ne treba da sadrži property vozač. Bilo bi zanimljivo vidjeti ostale akrobacije sa logikom relacija medju entitetima.

Postoji vec form validation na backend strani u skoro svakom boljem frameworku.

Nisam mislio na form validation na backend strani :slight_smile: …nego sintaksa za automatsko kreiranje/generiranje forme + odmah dobiješ i validaciju koju spominješ.

Jer ako napišeš:

"
@auto:object[brojVrata:int, vozac:objekt, volan:string[left|right]]
@garaza:array

object[
garaza1:garaza,
garaza2:garaza
]"

  • definirao si model auto i pravila njegovih propertya.
  • definirao si model garaza i pravila njegovih propertya, gdje se vidi da je to relacija jedan naprema više, tj. da svaka garaža može imati koliko god auta.

Nadalje, konačno si rekao da tvoja forma traži da se unesu dvije garaže. …a svaka od tih garaža treba dopustiti da se unese n broj auta.

I sa vrlo malo sintakse smo kreirali podosta kompleksnu formu…naravno, mora postojati engine koji će gornju sintaksu prevesi u gotov HTML forme i dodati dinamiku toj formi da se omoguće relacije.

Nešto malo bi se gornja sintaksa samo morala proširiti…sa odgovarajućim labelsima i descriptionima…ali ono bitno je da se zadaju relacije i validacije polja koje forma mora osigurati prilikom unosa.

Što se ne prijaviš negdje za komičara, vidim dobro bi ti išlo. :smiley: :smiley:

Jos jedan doprinos temi, ali vjerujem da je i ovo za autora teme previse verbose :sweat_smile:

E moj belmine, upisao se i ti među “probranu” ekipu. Hvala.

Pa da. Imas sve u kompletu.

Evo za laravel.

https://laravel.com/docs/5.8/validation

1 Like

Daj navedi clanove te ekipe, vjerujem da je @tpojka prvi na listi :smiley:

Salu na stranu, sta sam ja to rekao, a da ti to nisi ? JSON, XML i sve ostalo ti je ili previse ekspresivno, ili ima neke “probleme”, samo je tvoja sintaksa savrsena ?

Yup inace ima jako fin API i ja koristim primarno za validaciju forme a moze biti koristen za bilo kakvu validaciju objekta.I da sintaksa mi izgleda poznato, jer se radi o JS-u.

Opasno si tanak sa strukturom.
Ako ne kapiraš kako garaža ili auto ne treba strukturalno uopšte da u sebi imaju [zaključanog] vozača i da ostatak klase/objekta zavisi od toga (nevezano za to kol’ko bi rewrite trenutnog koda košt’o) - ima knjiga na Amazonu. Bar knjige nisu skupe, jbga.
Evo za početak da se upoznaš sa par termina:

Nije uopce fora u tome…
Kad ja pricam o normJSu, tebe boli Pero iz priče i nj. komponenta.
Kad pričam o “warperima” …tebe boli što je wraper a ne warper.
Jednom su te pak mučile lambda strelice u temi o nečem stotom.

Sad ovdje te muči objekt vozač unutar auta gdje pričamo o sintaksi za validaciju, a nikakvim drugim bakaračima.

Da si ironičan, bilo bi zabavno…ovako je crayzimatično.
Za sve ćeš se pokušat uhvatit, samo da ne moraš upregnut dvije vijuge i pokušat shvatit o čemu je tema.

Ja sam se hvat’o jedino za ono što si ti predstavlj’o .
S tom sitnicom da šta god pitam tebi je odgovor nije fora u tome.
Koji moj postavljaš nešto u čemu nije fora? Nema tu mesa. Samo kosti. Zato velim - tanak.
I savršeno čitam bitno iz detalja. A ovde se vidi da ti je uobičajena ona ista struktura koja je postavkom pogrešna. Ne treba da se jedeš, jednom ćeš shvatiti da je ta struktura pogrešna.
Što prije kreneš da čitaš ono što smo ti neki drugi (cijenim - većina s onog™ tvog spiska) i ja ponudili i predlagali - prije ćeš poput mene uočavati arhitektonske, domenske, strukturalne i ine greške.

Btw…pročitao malo s linka. Nadam se da primjećuješ da pojam decoupling upravo opisuje ono što uvodi normJS. Znači rasterećuje aplikaciju da “previše poznaje” komponente frameworka, te komunikaciju između aplikacije i komponente svodi na propisani broj metoda koje su propisane standardom.

Tako da još jedan plus za normJS, ovog puta od tebe :slight_smile:

Nego, ne vidim kako gornji link pojašnjava da klasa auto nebi trebala imati referencu na klasu vozač? Jesi ti to malo napamet bubao gradivo pa sada bacaš linkove tek tako, samo da kvocaš kao uobičajeno?

Aman ti baš ništa ne kapiraš?
Posl’o sam ti link za code decoupling da pokušaš svariti zašto je nepravilna struktura ova dva objekta odnosno zašto nije pravilno da drže u sebi objekt vozač. Takvu strukturu je mog’o napraviti samo neko bez:

  1. znanja
  2. iskustva
    (ne nužno tim redom)

Kakav normJS, kakvi bakrači. U kulturnom svijetu ne razgovaramo o tome. :relaxed:

Zato jer pričaš o principima. Upravo onima koje uvodi normJS da raspetlja preveliku zavisnost aplikacije i frameworka koji se koristi.
Valja razumjeti princip koji guraš na stol. Ja ga očito odavno razumijem kada me isti čak potakao na razvoj normJSa. Nebitno što nisam znao pod kojim nazivom se taj princip pronalazi. Nazivi su nebitni…logika principa je bitna.

Tanjež.

Shvatit ću to kao “Shvatio sam, možemo se vratiti na ovu temu” xd xd

Sintaksa je proširena sa par zanimljivih noviteta:

ADDING LOCAL CUSTOM TYPES

    "
    @garaza: array<auto>  
    @auto: object[volan:string[left|right],vrata:int, vozac:vozac]
    @vozac: object[ime:string, age:int]
    "

    //U ovom primjeru, stringType sadrži tri clase: garaza, auto i vozac. Auto i vozac su lokalne klase koje su potrebne za potpunu definiciju klase garaza.
    //Klasa koja služi za testiranje strukture objekta, je uvijek prva navedena klasa.


CONTROL INNER REFERENCE AND Where statement

    objekt[data:array, data2:array] Where {this.data2.length == this.data.length}
    objekt[data:array, data2:array] Where {this.data2.length == this.data.length || this.data.length==0}
    objekt[data:array, data2:array] Where {this.data2.length == this.data.length || this.data.length==0} OR {this.data.length==0 && this.data.length==100}  //na ovaj način pisanja OR statementa razdvajamo logične cjeline Where statementa (svaki se nalazi u svojoj zagradi), što ostavlja prostora da kontroliramo koji WHERE statement je prošao, također je moguće kvalitetniju dokumentaciju kreirati, ukoliko postoje WHERE uvjeti kao zasebne cjeline.

//referenca to parent:

    array<array<int> where {this.length==this.parent.length}>


SHORTHANDS:

    {name:string, age:int}          -> is same as:  object[name:string, age:int]
    'left|right'                    -> is same as:  string[left|right]
    "left|right"                    -> is same as:  string[left|right]
    {side:'left|right|up|down'}    -> is same as:  object[side:string[left|right|up|down]]