Flags as string

Potakla me tema Boolean controler koju sam nekidan otvorio da skužim jednu zanimljivu stvar, pa ću i to da podijelim.

Kopirat ću sljedeći dio na koji se osvrćem:

E sad, dalo mi je to misliti zašto je nekada taj pristup ok, a zašto nekada nije?
Jer ako je to OK pristup, zašto nam svi parametri nebi izgledali tako? hehe

Pa fora je sljedeća, takav parametar ima sposobnost opisati samo digitalna stanja na ulazu.
Primjer digitalnih/binarnih stanja npr. jednog grada:

//grad
{
    vodovod:1,
    kanalizacija:1,
    elektrana:0,
    telefon:1,
}

…i ono što se ne da opisati digitalnim stanjima:

//auto -
{
    godiste:1998,
    total_km:225000,
    vrata:5,
    ...
}

Što me navodi na sljedeći cool ideju. (barem meni cool ideju :slight_smile: )

Svaki puta kada imamo parametar koji je skup digitalnih stanja, on se može opisati jednim flag-stringom.
Npr. gornjem gradu bi bio ekvivalent stringu: “vkt”. Drugim riječima, “vkt” nam može biti dovoljna informacija da ga extractamo u:

{
    vodovod:1,
    kanalizacija:1,
    elektrana:0,
    telefon:1,
}

…ako smo negdje ranije definirali (inicijalizirali) naš digitalni-flag parametar, gdje bi njegova definicija izgledala ovako:

var digitalFlagTemplate = {
    vodovod:1,
    kanalizacija:1,
    elektrana:0,
    telefon:1,
    __shorthands__:"vket"
}

Što nam ta definicija govori? Govori nam par stvari:

  1. pokazuje koja sva digitalna stanja sadrži parametar. To su (vodovod, kanalizacija, elektrana, telefon)
  2. pokazuje nam koja su defaultna stanja tih parametara, redom to su “1 1 0 1”.
  3. pokazuje nam koji su shorthands alias karakteri za ta digitalna stanja, redom to su “v k e t”

Sada kada imamo to, imamo sve potrebne informacije da transformiramo zadani flag u string formatu u potpuni parametar koji dalje može ići kompletan na upotrebu. Npr. evo par transformacija:

Flag: undefined ->
{
    vodovod:1,
    kanalizacija:1,
    elektrana:0,
    telefon:1
}
//flag undefined će rezultirati defaultnim stanjem prema inicijalnoj definiciji parametra


Flag:"vk" ->
{
    vodovod:1,
    kanalizacija:0,
    elektrana:1,
    telefon:0
}

//flag "ve" postavlja samo true stanja vodovodu i elektri.

//Nadalje, unziper flag stringa bi mogao razumjeti neke dodatne naredbe. Npr. ako flag prethodi minusom, da samo oduzme ta stanja iz defaultne definicije, tako npr:
Flag:"-v" ->
{
    vodovod:0,
    kanalizacija:1,
    elektrana:0,
    telefon:1
}

//...postavlja sva stanja kao što su defaultna, osim vodovoda koji je oduzet.
// Istim pristupom možemo imati pravilo za dodavanje stanja na defaultnu definiciju:

Flag:"+e" ->
{
    vodovod:1,
    kanalizacija:1,
    elektrana:1,
    telefon:1
}
// u ovom slučaju opet imamo sve kao što je defaultno stanje, osim što smo dodali "e" i tako zadali da je i elektrana true.

Uvođenjem ovako nečega, funkcije koje primaju parametar koji je sačinjen od digitalnih stanja…moglo bi im biti sasvim svejedno jel onaj tko je pisao input, napisao ga u “flag as string” formatu…ili je tipkao kompletan objekt sa svim ključevima i pripadajućim binarnim stanjima.

Btw. prije nego zaskoči netko da je pristup glup.

  • JS nativno u nekim metodama koristi ovaj pristup zadavanja parameta. Npr flagovi u regularnim izrazima su upravo to. Flag “gi” tako kaže:

  • g - radnja je globalna

  • i - radnja je case insensitive

I to je full praktično kontroliranje takvih (digitalnih) ulaznih parametara, što se i meni pokazalo na nekim funkcijama koje sam na taj način parametrizirao.

Samo mi se sada upalila lampica kako to dići na viši nivo.
I onda slijedi odgovor na uvodno pitanje

Jer ako je to OK pristup, zašto nam svi parametri nebi izgledali tako?

Možemo ići ovim pristupom za svaku situaciju gdje je ulazni parametar sačinjen isključivo od digitalnih stanja. Ako ga uvedemo na način kako sam gore opisao, onda smo developeru ostavili fleksibilnost hoće li taj parametar tipkati na klasičan način (navođenjem punog imena svakog ključa parametra), ili će se poslužiti “shorthand” sintaksom, gdje je dovoljno da sa svega par karaktera opiše puno toga. :slight_smile:

NormJS just get new toy. :slight_smile:

Ja da sam religiozan, svaki dan bi’ prinio kozu pod totem što ne moramo raditi na zajedničkom projektu.

3 Likeova

Lol pa cemu to sve, procitao sam polovicu i bilo mi je dosta. Pa sta imas od toga ako izmisljas stvari koje vec postoje?

I da dodam još kako bi to u praksi izgledalo kod pisanja funckije/metode koja prima flag_as_string parametar, pa nešto ovakvo:

function getWidth(flag_as_string){
    
    var r = unzipFlagAsString(flag_as_string, {
        inner:1,
        padding:1,
        border:1,
        margine:1,
        __shorthands__:'ipbm'   // __shorthands__ bi mogao biti zadan i samo kao true, ako referira na prva slova za svaki ključ. 
    });

    // nakon unzipFlagAsString() inicijalizacije, svejedno nam je jel onaj tko je koristio funkciju tipkao puni parametar ili je tipkao samo nešto poput: "ipm"
    // neću pisati što bi se trebalo nalaziti unutar metode unzipFlagAsString(), ali je poprilično trivijalan code za složiti ju.


    if(r.inner)   //...do what you want...
    if(r.padding) //...do what you want...


}

Samo pisanje funkcije se ne otežava…štoviše dobije se preglednost da se točno vidi koja digitalna stanja imamo, koja su im defaultna stanja…i koji su shorthandsi za pozive istih.

A onom tko poziva takvu funkciju, sigurno da je lakše pisati:

var width = getWidth(element, "ip");

umjesto:
var width = getWidth(element, {inner:true, padding:true, border:false, margine:false});

Đe ovo postoji? Mislim, bilo bi mi drago ako postoji. :slight_smile:

Pada mi napamet jedino ENUM tip varijable koju je uveo C# …on tako ima negdje mali engine koji to obrađuje, što bi bilo ekvivalent ovoj metodi: unzipFlagAsString() …samo on to odradi na razini kompajlera.

Ali ENUM je jedno…za ovako nešto nisam sreo da postoji?

A što se tiče ovog djela pitanja. Pa započetak, mnogo se zabavljam slaganjem lego-kocki programerskog svijeta.

Za mene je to isto što i lego-kocke, samo malo doraslije našoj dobi.

S druge strane, plaćaju me još da se igram…pa što se nebi igrao. :smiley: :smiley:

1 Like
function getWidth(
  {
    inner = 1, 
    padding = 1,
    border = 1,
    margin = 1,
    ...rest
  } = flags
 ) {
    console.log(inner, padding, border, margin, rest);
}

getWidth({inner: 5})

Mozes mi se zahvaliti kasnije, i dobrodosao u ES6 :slight_smile:

Entuzijazam je pohvalan, mozda pogledaj typescript, to je superset javascripta ( podrzava cak i enume ) ili sto kaze belmin barem ES6. Puno stvari vec postoji, i nema potrebe raditi to na svoj nacin.

Haha, zanimljivo mi je kada moje rješenje pronađete kod nekoga drugoga…onda valja. Ako je malo ispred vremena, onda ne valja, haha.

Pa većina toga što sam ja izmislio se prije ili kasnije pojavilo na neki način.
Nebitno što sam neke stvari izmislio, a da su paralelno bile već izmišljene. Sigurno nisam izmišljao stvari koje postoje već 20 i kusur godina (a i te su mlade, ako ćemo realno)…tako da ako sam nešto izmislio što je par godina na sceni…mene to nimalo ne boli. Štoviše, meni su takve situacije izrazito drage, jer mi pokazuju da gazim ispravnim putem. :slight_smile:

Druga stvar…ponekada sam i svjestan da razvijam nešto što postoji ili postoji dobra šansa da postoji.
I tada isto volim prvo kreirati svoje rješenje…pa tek onda se zagledati kako su to drugi rješili.

Zašto?
Pa zato ako prvo pogledaš tuđa rješenja, sva potencijalna kreativnost kolapsira u tuđe ideje…i slijep si onda uočiti ono što bi uočio da si gazio nekim svojim putem.

Slično kao kada hodaš kroz visoku travu…pa naiđeš na nečiji utabani trag…i onda te taj trag vodi, pa si ograničen biti taj koji je “stvarao i birao put”.

A nakon što iznjedrim svoja rješenja, ja uvijek volim baciti oko kako su to drugi rješili…i onda redovito nađem:

  • skup preklapanja. (Isto što sam napravio ja i što su napravili oni)
  • skup njihovih kvaliteta (Ono što su se sjetili oni, a ja nisam)
  • skup svojih kvaliteta (Ono što sam se ja sjetio, a nisu oni)

…i onda tek u konačnom koraku nastojim objediniti prednosti jedne i druge strane, te na taj način ponuditi najbolje rješenje koji je takav pristup iznjedrio.

Tako da…svjestan sam poprilično što radim i kada u očima drugih izmišljam “toplu vodu”. :slight_smile:

A sada konkretno što se tiče ovoga gore djela code-a.

Volim kada imam rješenje koje može biti reciklirano između više različitih jezika sa minimalnim izmjenama…do nikakvim izmjenama.

Što često nije slučaj kada je stvar rješena na razini sintakse pojedinog jezika…a može biti rješena metodom koja radi isto.

Ne kažem da je loše za jezik što to ima rješeno na levelu sintakse, ali za recikliranje pristupa između različitih jezika je to ograničenje.

Barem za sada dok svoj normirani library ne provlačim kroz kompajler. Kada ću i to raditi, onda ću moći normirati različite jezike i na razini sintakse.

Btw. već neke jezike provlačim i kroz vlastiti kompajler…što mi omogućava da bogatim sintaksu i na toj razini, te da idem izvan okvira sintakse koju je ponudio sam jezik.

U budućnosti planiram napraviti kompajler koji će tu sintaksu prevoditi u sve jezike (koji će mi biti zanimljivi), pa će to biti onda jedan fini korak unificiranju onoga što se može unificirati.
Za sada se time ne zamaram.

P.S. dali tvoj code gore omogućava da se input zada na način:
getWidth("ipbm") …ili bilo što slično što spada pod “shorthands” za jednostavni unos tih flagova?

Jer u suprotnom imaš flagove, ali nemaš to pojednostavljenje unosa parametara koje navodim.

haha sta si ti izmislio ? destructuring, rest/spred i defaultne parametre ? daj nemoj me nasmijavati, pogledaj malo kod koj sam ti dao i kod koji si ti napisao i sta rade tj. na koliko elegantan nacin rade to sto rade :smiley:

Ne, i moj kod nece nikad raditi nesto tako slicno.Cak sta vise taj kod bi dobio lagan reject kad dodje kod mene na code review.
Ja kad vidim poziv na funkciju sa getWidth("ipbm") ili sta vec, apsolutno nemam pojma sta to ipbm treba da znaci u tom momentu, nego moram pronaci definiciju funkcije i provaliti sta te skracenice znace ,
dok getWidth({inner: 5}) jasno govori sta sam ja proslijedio u tu funkciju.
Da ne spominjem cinjenicu sta ako imas key-eve koje pocinju sa istim slovom, pa moras onda paziti na redoslijed tih karaktera kad ih proslijedjujes u funkciju.

Nije to nikakvo pojednostavljenje, vec je to obicni code-smell i ko god smatra da je ovo pojednostavljenje treba da pod hitno kupi knjigu Clean Code

Ako mislis da ovdje niko nema pojma, otidji na Code Review - Stack Exchange pa im postavi ovaj tvoj kod i ideju na review - mislim da bi bili jako odusevljeni :smiley:

Ja ti skidam kapu zbog toga sto te neko placa da se bavis ovim i izmisljas ove stvari.Ne znam sta si im rekao, i kako si im prodao ovo, ali svaka cast moj naklon do poda :slight_smile:

3 Likeova

Nisam ni rekao da sam izmislio sintaksu var x = y

Pogledao sam code koji si dao. Omašio si cijeli footbal sa njime. Nije tema o tome kako zadati defaultne parametre…a dao si samo to.
Zanimljivo je kada sam o tome pisao još tamo negdje davne 2014-te, kako se mogu elegantno zadavati defaultni parametri + opcionalni parametri, onda je @tpojka vrištao kako sam lud…kako opcionalni parametri nemaju mjesta u kvalitetnom programiranju.
Džabe su bili moji napori da mu ukažem da Google upravo radi to sa svakim svojim API-em gdje prima takav set parametara…džabe mi bio trud svirači.

A onda 2015-te to ECMA6 uvodi. :smiley: :D.
Naravno, nisam ni to izmislio…opcionalni parametri su tu praktički otkada je i programiranja. Ja sam samo tada pokazivao kako se to elegantno može izvesti u bilo kojem jeziku, neovisno od sintakse jel to jezik nativno omogućava ili ne.

Onda očito ne možeš koristiti niti nativni javascript …jer ako pogledaš kako se npr. zadaju flagovi u regularnim izrazima, zadaju se upravo kako tvrdim da je praktično:

Npr.
var regPattern = new RegExp("selector", "gi");

Znači “gi” ti je upravo flag_as_string :stuck_out_tongue:

  • g - stands for global selection
  • i - stands for incase sensitive selection
    Možda je vrijeme da promjeniš jezik, vidim da ni JS kod tebe ne prolazi :stuck_out_tongue:

Tebi ako je ljepši code da uvijek pišeš sve…pa idi u assembler, pa ispucaj dušu koliko ćeš morati toga finoga napisati. :slight_smile:

Više manje, dokumentaciju moramo znati za bilo koju funkciju. A zapamtiti da je “i” flag od “inner”, je isti klinac kao da si zapamtio i “inner”. Naravno da pamtiš cijeli smisao riječi, a flagovi su uvijek neko slovo koje je karakteristično toj riječi.Najčešće prvo slovo riječi. A to nije nauka znati. Tako da ako možeš zapamtiti ključ, možeš znati i koje je prvo slovo ključa. :slight_smile:

Ne moraš paziti na redosljed nikada kod flagova!
Ako bi baš imao dva ključa koja počinju istim slovom…ili bi se izbjegavalo odabrati tavke ključeve da počinju istim slovom, ili bi flag bio neko drugo karakteristično slovo ključa, ne mora biti nužno prvo.
A može biti i prva dva slova, pa da se flag zadaje npr. na sljedeći način: "[au]a"

Gdje se

  • “au” odnosi na jedno binarno stanje,
  • “a” odnosi na drugo binarno stanje

(Al ja osobno nebi flagove komplicirao sa više od jednog znaka.)

Reci to onda i ovoj ekipi iza ECMA da ne pomišljaju više na takve stvari. :smiley:

Ne prodaješ riječi, prodaješ djela. :wink:

Tako da im nisam ništa rekao što točno radim, vjerujem da nebi ni shvatili.
Oni samo vide kakav napredak donosim firmi i na osnovu toga su mi razrješili ruke da radim samo ono što ja smatram da je bitno raditi. Štoviše, po dogovoru više nemaju niti pravo me uključivati u client-projekte, nego sam samo prisutan da generalno unaprijeđujem radnu okolinu i da ih postavljam na “eksponencijalni graf” ubrzanja produktivnosti.
Pri tome sam postavio još uvjet da rješenja na kojima ću raditi, se neće ticati specijalno njihove radne okoline, nego ta rješenja moraju moći biti generalno lako reciklirana. Što znači da i moja firma od istih rješenja mora moći imati direktnu dobit.

Pri tome, to nije mala firma. Broji par milijona kuna dobiti svake godine.

A tvoj hejt spada u istu kategoriju onoga što sam napisao zašto ljudi teško mogu smisliti Rimca: Zasto Hrvati ne vole Rimca - #28 od bozoou

Potpisujem.

Početnik, il’ čak neko ko se prvi put susreće s tematikom, da uradi apsolutno sve suprotno od svega što propagiraš, definitivno ima puno veće šanse da napiše nešto ispravno i da valja.

Vidi, ti se needukoavan i time se dičiš, nebrojeno puta si dao do znanja da izbjegavaš i preskačeš dokumentaciju. Industrijski standard i dobra praksa za tebe je špansko selo.
Ti si otprilike D. Bergam na steroidima (razlika je što on piše kako piše i ne smara svijet okolo).

2 Likeova

I još da nadodam. U mojoj vlastitoj firmi mi je satnica jedno 2-3 puta veća nego u toj vanjskoj firmi. A u toj vanjskoj firmi imam satnicu među najvišima. Samo neke starješine imaju veću od mene…jer ja sam tamo tek 2g.

Što onda uopće radim tamo?
Pa kad pogledaš, oni više trebaju mene…nego ja njih. Ako ćemo kalkulirati matematički, ja ih nit ne trebam.
Ali ja nisam nikada u ovom bio radi novca, pa neću nikada ni biti. Od prvog dana programiram radi ljubavi prema tome, a novac se pojavio samo kao nus produkt. Koji će svakako pomoći za naredne planove koje imam.

No osim te financijske kalkulacije, vjerujem da će moja rješenja lakše ugledati globalno svjetlo dana kroz tako veliku firmu…nego kroz moju, koja je u svojim počecima.
Al svakako ću se pobrinuti da se sazna da su ta riješenja originalno došla od firme TechnoAngels…a još originalnije od samih Anđela koji me vode. :slight_smile:

Moj put bi bio totalno nezanimljiv da nemam vas sa vašim opaskama…i da se nemam priliku ka tome osvrtati u prošlost.

Iste stvari ponavljate otkada nisam znao što je “Host” …kao i sada kada sam tu gdje jesam.
Kako je meni to cool. :slight_smile:

Ne govori li ti to nešto?

Najveća umjetnost i vještina je znati šta ne znaš.
Ti ne da se ne postavljaš na taj vektor već bježiš od njega k’o djavo od krsta.
U to ime još jednom:

https://i.imgur.com/NDX1Pf9.png

Pročitaš li i ostale odgovore s teme još koji put nećeš si naškoditi.

Kako sam omasio cijeli fudbal kad si ti napisao sljedece:

Oko tih skracenica se ne zelim uopste zamarati, jer mi je ideja totalni nonsense.

Regex u JS-u ima 6 flagova, od kojih se 3 koriste maksimalno.Objekat moze imati dosta vise key-eva i samim tim tvoje skracenice mogu postatiti ono o cemu cijelo vrijeme pricam - tj. ono sto vec jesu.

Meni je najljepsi kod koji se jednostavno cita i ima smisla.Na zalost ipbm mi nema apsolutno nikakvog smisla.

To se inace scale-a odlicno :smiley: Nakon nekog vremena neces znati sta jedan flag znaci, a kamo li pet ali hajde :smiley:

LOL

LOL opet, izgradi ti novu sintaksu i ovdje :smiley: Na kraju ce Regex biti laksi od ovih tvoji zafrkancija.

Gdje to se to u ECMAScript specifikaciji moze naci ovo sto ti radis ? Mozda je bolje da se ti pridruzis TC39 i das im proposal da uvrste ovo savrseno rijesenje u ECMAScript :smiley:

Ja prema tebi nemam apsolutno nikakav hejt, cak si mi simpatican sa ovim idejama.
To sto se nekom ne svidjaju tvoja rijesenja ne znaci da je to bilo kakav hejt.Cak sam ti i argumentovao, a to sto si ti umislio da si popio svu pamet svijeta i neces da cujes kritiku to nije moj problem :slight_smile:

Ok, ovo postoji i koristi se (“Y-m-d H:i:s” npr.)
Druga stvar je što ga uopšte ne argumentuje tako.

Al’ ovo je zato za +1
Blaženi su svi koji ne moraju da ga slušaju i gledaju šta je napis’o.

I kad nabode nešto k’o ćorava koka (što se da budem iskren izuzetno rijetko dešava: sa ovim ukupno drugi put da pamtim na forumu), on uopšte nije svjestan da je nab’o. Loose cannon.

Jesi l’ im rek’o da za iste pare mogu uzeti nekog k’o ima pojma?

2 Likeova

A kako će se dvije osobe (od kojih je samo jedna nezna da nezna) …dogovoriti koja je to koja nezna da nezna?

Kada logično obje smatraju da upravo ona zna? Ali jedna očito griješi, te svaka misli za onu drugu da ta druga griješi. :slight_smile:

Za razrješiti taj problem očito treba neko objektivno opažanje, koje je dokaz tomu da netko radi “dobro” ili “loše”.
Također pod pretpostavkom da radi “dobro” ona osoba koja ne živi u neznanju.

Nadam se da iznošenje mojih postignuća niste shvatili kao pumpanje ega …nego vam upravo stavljam pod nos objektivne činjenice koje nastaju kada netko radi “dobro”. Tako da ja vjerujem za sebe da nisam onaj koji nezna da nezna. A vi ste dobivene dokaze i priliku da osvjestite svoje neznanje…vrlo olako “gurnuli pod stol.”
Malo sprdnje bacili na to i tjerate dalje po svom.
Ignorirate uočiti da sam samo unutar dvije godine nakon zaposlenja napravio poprilično lud odmak od toga kako bi u prosjeku to izgledalo.
Tim je luđe što mi je to prvo zaposlenje u životu u IT sektoru. …a nakon samo 2mj. rada mi je plaća narasla za skoro 100%…itd itd.

Ali ja sam taj koji nezna da nezna… :slight_smile: