Bitwise operators meerdere flags vergelijken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior developer (PHP en VB.NET)

Functie De development afdeling bestaat uit 2 teams. Het productteam (10 developers) is verantwoordelijk voor verschillende applicaties met als doel om zoveel mogelijk te automatiseren en uit te werken tot standaard software. Met diverse Solutions Architecten en ervaren developers denken ze voortdurend mee met hun klanten en bouwen ze de basis van het uiteindelijke maatwerk dat wordt geleverd. Hiernaast hebben ze een maatwerk/projectteam. Dit team bestaat momenteel uit 8 developers (junior tot senior) en is verantwoordelijk voor het maatwerk in hun klantprojecten. Momenteel zijn ze op zoek naar een senior developer die aan de slag gaat in het productteam. Hierin

Bekijk vacature »

PHP Developer Symfony

Dit ga je doen Ontwikkelen van Product Informatie Management (PIM) systemen; Werken aan zowel grotere als kleine projecten voor toonaangevende klanten binnen o.a. de retail. Hier ga je werken Als PHP Developer kom je te werken binnen een vooruitstrevende organisatie die Product Informatie Management (PIM) systemen levert aan hun klanten. Hun klanten zijn toonaangevende bedrijven binnen o.a. de retail. De organisatie zit gevestigd in regio Zwolle en bestaat uit zo'n 35 medewerkers, waarvan 30 IT. Je komt te werken binnen één van de zelfsturende development teams welke ieder verantwoordelijk zijn voor hun 'eigen' klanten. Jouw team bestaat uit 6 backend

Bekijk vacature »

Laravel Developer

Functie omschrijving Voor een gave organisatie in de buurt van Den Bosch zoek ik een PHP developer. Het is van belang dat je kennis/ervaring hebt met het framework Laravel. Jij gaat in deze functie software applicaties ontwikkelen. Deze software projecten zijn heel divers, en deze organisatie maakt software, van A tot Z. Klanten kunnen in elke sector werkzaam zijn, van profit tot non-profit. Andere taken zijn onder andere: documentatie schrijven over applicaties/uitleg geven over software en applicaties/ klantcontact over bestaande applicaties/applicaties optimaliseren. Bedrijfsprofiel Deze organisatie zit in de regio van Den Bosch en is een klein bedrijf. Er werken circa

Bekijk vacature »

Ervaren C#.NET programmeur

Functieomschrijving Voor een moderne werkgever in regio Prinsenbeek zijn wij op zoek naar een ervaren C#.NET programmeur die graag de uitdaging aangaat. Je houdt je bezig met het ontwikkelen van maatwerk webapplicaties voor diverse klanten, waarbij complexe processen optimaal worden ondersteund. Verder ziet jouw takenpakket er als volgt uit: Ontwikkelen en onderhouden van C#.NET-applicaties; Schrijven van hoogwaardige, herbruikbare codes; Schrijven van technische documentatie en gebruikershandleidingen; Bijdragen aan het ontwerp en de architectuur van softwaretoepassingen; Troubleshooten en oplossen van bugs in softwaretoepassingen; Werken met databases en dataopslagoplossingen; Implementeren van beveiligingsoplossingen en het waarborgen van de beveiliging van applicaties en gegevens. Bedrijfsprofiel

Bekijk vacature »

Back-end developer

Functieomschrijving Voor een gewaardeerde werkgever in regio Tilburg zijn wij op zoek naar een gemotiveerde SQL Developer/ functioneel consultant. Jij wordt verantwoordelijk voor zowel het ontwerpen en implementeren van SQL-databases als voor het in kaart brengen van de bedrijfsprocessen van een organisatie en het vertalen van deze processen naar IT-oplossingen. Jouw takenpakket komt als volgt uit te zien: Ontwerp en implementatie van SQL-databases: Je ontwerpt, ontwikkelt en implementeert SQL-databases om de data behoeften van de organisatie te ondersteunen; Analyse van bedrijfsprocessen: Je analyseert de bedrijfsprocessen van de organisatie om de behoeften van de klant te begrijpen en te vertalen naar

Bekijk vacature »

Front-end Developer Magento 2/Wordpress

Voor het aantrekkelijk houden en steeds vernieuwen van de huidige websites en webshops en het meedenken in de marketing zijn wij per direct op zoek naar een ervaren Front-end developer met gedegen kennis van Magento 2 (webshops) en Wordpress (websites). Wat bieden wij jou Mooi salaris! Meteen op contract bij de opdrachtgever! Gezellig, Kempisch bedrijf! 35 uur per week! Auto van de zaak! Wie ben jij Van een front-end developer verwachten wij: Een afgeronde Bachelor ICT opleiding met profiel ICT & Media Design. Dat je in het bezit bent van een Magento 2 professional front-end developer certificaat; Je hebt ruime

Bekijk vacature »

Medior Java developer

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

Ambitieuze medior developer

Wat je gaat doen: Heb jij al een paar jaar ervaring als developer maar wil jij naar the next level? In ons NextLevelDev Programma helpen wij jou om de volgende stap te zetten: een mooi programma aan trainingen op het gebied van Java, hippe frameworks, Agile/Scrum, OCP-certificering en optioneel: andere JVM-talen als Kotlin en Scala; Cloud (AWS, Azure, GCP) Soc Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun

Bekijk vacature »

Front-end Developer - React - Data Driven

Bedrijfsomschrijving Onze klant is een snelgroeiende organisatie die een data-driven inspectieapp op de markt hebben gebracht die nu al een aantal jaar door verschillende organisaties wereldwijd gebruikt wordt. Er zijn zo'n 6 mensen werkzaam bij dit bedrijf en ze zijn nu vooral op zoek naar een sterke front-end developer die wil gaan werken aan nieuwbouw applicaties en de uitbouw van de huidige applicaties. De reden dat ze zoeken is omdat er veel werk op komst is en ze hier de juiste capaciteit voor willen hebben. Er heerst hier een hele prettige sfeer waarin respect en eerlijke communicatie belangrijk is. Ook

Bekijk vacature »

Developer Front-end

Functie omschrijving Front-end Developer gezocht! Wij zijn op zoek naar een front-end developer voor een organisatie in de regio Veenendaal die de eindverantwoordelijkheid op zich neemt van alles wat met design te maken heeft. Je hebt in deze functie een adviserende rol hiervoor moet je beschikken over een grote dosis vakinhoudelijke kennis. Je creëert unieke concepten door samen met collega’s en klanten te overleggen over aangeleverde designs. Hiermee draag jij je steentje bij aan de groeiambities van de klant. Jij wordt het vaste aanspreekpunt voor klanten wanneer het gaat over planningen, hierin is het jouw taak om alle betrokkenen goed

Bekijk vacature »

Senior Front-end developer

Functie Als front-end developer ga je aan de slag voor verschillende klanten, waarbij veel rekening wordt gehouden met waar je woont (dit is altijd binnen het uur), en word er gezocht naar een organisatie die past bij jou. Zowel qua persoonlijke ambities als de technische aansluiting. De opdrachten duren gemiddeld 1 à 2 jaar maar dit hangt ook af van je wensen. Je werkt in een teamverband voor een klant en zult nauw samenwerken met zowel eigen collega’s als die bij de klant werkzaam zijn. Ze zijn op zoek naar een technische front-end developer die ruime ervaring heeft in één

Bekijk vacature »

PHP Software Developer

Functie omschrijving PHP Software Developer gezocht! Voor een organisatie in de regio Zeist die zich bezighoud met het verbeteren van de medicatieveiligheid zoeken wij een Software Developer. In deze functie zijn wij op zoek naar een slimme en enthousiaste Developer die interesse heeft in farmacie, logistiek en ICT. Daarnaast beschik je over een goed analytisch vermogen en ben je van nature gestructureerd en resultaatgericht. Je moet in deze functie daadkrachtig, flexibel en communicatief goed zijn. Je verantwoordelijkheden bestaan uit: Object georiënteerd programmeren; Werken in een scrumteam aan de ontwikkeling van een medicatiebewakingssysteem; Meedenken over de mogelijkheden en onmogelijkheden van projecten;

Bekijk vacature »

.NET developer

Functie Als .NET ontwikkelaar ga jij aan de slag bij een van onze klanten actief in de High Tech Industrie. Onze klanten zijn voornamelijk gelokaliseerd in de omgeving van Eindhoven. Wij zijn erg selectief als het gaat om de projecten die wij accepteren en richten ons dan ook alleen op innovatieve en complexe projecten. Omdat onze klanten voornamelijk gespecialiseerd zijn in de machinebouw, werk jij ook vaak dicht tegen de machines aan. Ons team bestaat momenteel uit Embedded engineers, IOT developers en Cloud engineers. Wij werken voornamelijk aan Microsoft projecten waar er gebruik wordt gemaakt van WPF, UWP, .NET Core

Bekijk vacature »

SAP Integratie Ontwikkelaar

Ben jij ambitieus in de verdere ontwikkeling van SAP binnen HANOS, en heb je kennis van SAP PI, CPI (SAP integration suite) en of andere middleware tooling? Dan ben jij mogelijk onze nieuwe SAP Integratie (middleware) Ontwikkelaar! Lees snel verder en solliciteer! Wat ga je doen? Als SAP Financieel Consultant ben je, als deel van een gedreven team van interne SAP consultants, de schakel tussen de gebruikersorganisatie en ICT. Je draagt proactief bij aan een optimale aansluiting van de SAP-functionaliteit (een applicatielandschap met o.a. Suite on HANA, Fiori, Hybris, C4C en BO), op de bedrijfsprocessen. Verder ondersteun je de HANOS

Bekijk vacature »

Front-end Developer

Gezellige team, passie en een groene toekomst! Lees hier de vacature van Front-end Developer bij All in Power! All in power heeft zich tot doel gesteld écht bij te dragen aan de energietransitie. Dit doen wij door de markt voor energie volledig op zijn kop te zetten. Producenten van schone (wind- of zonne-)energie verkopen via ons platform hun energie rechtstreeks aan gebruikers. Of dit nu huishoudens, bedrijven of bijvoorbeeld laadpalen zijn ons platform maakt het uitwisselen van energie mogelijk. Zo maken we de business case van onze klanten veel sterker en loont het om (meer) te investeren in vergroening voor

Bekijk vacature »
Johan K

Johan K

28/08/2015 16:43:10
Quote Anchor link
Edit:
Ik heb al wat gevonden, eigenlijk heel makkelijk:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php if(!$result & self::R_INVALID_FORMAT_EMAIL + self::R_INVALID_FORMAT_PASSWORD){ ?>

----

Ik ben nu bezig met de output van verschillende functies in binairy terug te laten geven zodat ik in 1 keer meer fouten kan terug geven als er iets aan de hand is.
Nu werkt het wel, maar mijn vraag is of het te vergemakkelijken met (korter te maken) is.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
  class User{
    const R_INVALID_FORMAT_EMAIL    = 1;
    const R_INVALID_FORMAT_PASSWORD = 2;
    const R_UNKNOWN_CREDENTIALS     = 4;
    const R_CAPATCHA_INVALID        = 8;
    const R_ATTEMPT_TIMEOUT         = 16;
    // etc.
  
    
    public function login($email, $password){
      $result = 0;

      if(!Validate::email($email)){
        $result += self::R_INVALID_FORMAT_EMAIL;
      }


      if(!Validate::password($password)){
        $result += self::R_INVALID_FORMAT_PASSWORD;
      }
      
      
      // Met name, deze lijn met code.
      if(~$result & self::R_INVALID_FORMAT_EMAIL && ~$result & self::R_INVALID_FORMAT_PASSWORD){
        // since we now must query the database, only do this when both email and password format is correct.
      }

      return $result;
    }
  }

?>
Gewijzigd op 28/08/2015 20:36:01 door Johan K
 
PHP hulp

PHP hulp

07/05/2024 07:21:56
 
Ozzie PHP

Ozzie PHP

28/08/2015 17:03:06
Quote Anchor link
Wat is dit?

~$result
 
Johan K

Johan K

28/08/2015 17:17:37
Quote Anchor link
~ is een inverse (not) operator, het draait de nulletjes en eentjes om.
Net zoals ! op een boolean doet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
  echo sprintf("%b</br>", 10);  // 1010
  echo sprintf("%b</br>", ~10); // 1111111111111111111111111111111111111111111111111111111111110101
?>
Gewijzigd op 28/08/2015 17:25:15 door Johan K
 
Ozzie PHP

Ozzie PHP

28/08/2015 17:20:48
Quote Anchor link
Euhm ... ik snap 'm niet echt :-s

>> het draait de nulletjes en eentjes om

Kun je dat eens iets uitgebreider uitleggen. En vraag 2 ... wat kun je ermee?
 
Johan K

Johan K

28/08/2015 17:38:18
Quote Anchor link
Neem deze code, stel dat de gebruiker inlogd met "ozzie" en als wachtwoord "test".
Validate::email("ozzie") -> false (geen email aderes).
Validate::password("test") -> false (omdat minimal string length 6 moet zijn)
De waarde die word terug gekeerd is in dit geval 1 + 2 = 3.

Deze login request word door een ajax request gedaan en stuur 3 door via json.
Nu weet ik door 1 getal dat zowel de username en password fout zijn door de binaire representatie: "00000011" en kan dit direct aanpassen in het login form.

Tweede voorbeeld:
Neem deze code, stel dat de gebruiker inlogd met "[email protected]" en als wachtwoord "test".
De waarde die word terug gekeerd is in dit geval 2 in binair "00000010"
Nu weet ik dat het wachtwoord foutief is, en de email correct.

Dus wat je er eventueel met de "~" mee zou kunnen doen is kijken of alle "flags" goed zijn, behalve het wachtwoord. Het is een not operator op meerdere booleans. In mijn geval, draai ik "0" de standaard waarde van result om in alles. Ik kan ook de result de waarde geven van (16*2) - 1 om alle flags als 1 te zetten.
Beetje hetzelfde als de E_ALL constant.
Gewijzigd op 28/08/2015 19:36:02 door Johan K
 
Thomas van den Heuvel

Thomas van den Heuvel

28/08/2015 17:41:36
Quote Anchor link
Ik weet niet of bitmaskers heel erg toepasselijk zijn voor deze manier van valideren. Waarom doe je dit niet gewoon zonder? Als je dit gebruikt om bij te houden wat valideert, houd dit dan gewoon per veld bij, in plaats van deze opzet?
 
Johan K

Johan K

28/08/2015 17:51:25
Quote Anchor link
Thomas van den Heuvel op 28/08/2015 17:41:36:
Ik weet niet of bitmaskers heel erg toepasselijk zijn voor deze manier van valideren. Waarom doe je dit niet gewoon zonder? Als je dit gebruikt om bij te houden wat valideert, houd dit dan gewoon per veld bij, in plaats van deze opzet?

Mijn opzet is dat alle code wat in het systeem draait taal onafhankelijk is, dus strings terug geven met daarin de fout is dus een no-no. Als ik booleans ga terug keren dan is de vraag, wat is er fout? Bitmasks past perfect in dit plaatje en het is nog erg snel ook.

Als ik eerlijk mag zijn heb ik vrij weinig met bitwise operators gewerkt, daarom mijn vraag ook. Ik neem aan dat ik iets van if($result & (FLAG_A & FLAG_B)){} kan doen maar wat ik ook probeer het resulteerd in of allebij true of false.
 
Thomas van den Heuvel

Thomas van den Heuvel

28/08/2015 18:02:48
Quote Anchor link
Het leent zich gewoon niet echt voor formulierdata in het algemeen, het is uiteindelijk toch de bedoeling dat alle velden die op een of andere manier een validatie hebben succesvol moeten valideren. De introductie van een bitmasker die zoveel doet als "alles moet valideren" lijkt mij een overcomplificering. Dit zou je ook kunnen reduceren tot één boolean.

Als je formulier ook wat uitgebreider wordt of wanneer je velden van volgorde gaat veranderen is het overzicht al snel weg denk ik (de constanten die machten van 2 zijn worden al snel vrij groot). Daarom stelde ik voor dat je gewoon per veld (en bij het veld zelf, en niet met allerlei hardcoded numerieke waarden) bijhoudt of deze geldige inhoud bevat of niet.

Ook snap ik niet helemaal wat dit in een user Class doet. Wat zou de login() methode moeten teruggeven, en wat betekent dat? Ik zou verwachten dat een login() methode van een User class iets doet met "inloggen", maar dit controleert enkel (het format van?) invoervelden, en verder niets?

Bovenstaande syntax ziet er al vrij complex uit. Als er iets helder en transparant moet zijn is het wel je loginroutine... Booleans debuggen lijkt mij nog altijd makkelijker dan zoiets terugkrijgen: "010101100101111010111101011111010111110001111" en dat je dan zegt "Ooooh, er staat een 1 op positie 28 verkeerd, dat ik dat niet eerder zag".

:)
Gewijzigd op 28/08/2015 18:04:06 door Thomas van den Heuvel
 
Johan K

Johan K

28/08/2015 18:51:28
Quote Anchor link
Thomas van den Heuvel op 28/08/2015 18:02:48:
Ook snap ik niet helemaal wat dit in een user Class doet. Wat zou de login() methode moeten teruggeven, en wat betekent dat? Ik zou verwachten dat een login() methode van een User class iets doet met "inloggen", maar dit controleert enkel (het format van?) invoervelden, en verder niets?

Bovenstaande syntax ziet er al vrij complex uit. Als er iets helder en transparant moet zijn is het wel je loginroutine... Booleans debuggen lijkt mij nog altijd makkelijker dan zoiets terugkrijgen: "010101100101111010111101011111010111110001111" en dat je dan zegt "Ooooh, er staat een 1 op positie 28 verkeerd, dat ik dat niet eerder zag".

:)

Dit is ook maar een sample code, het weglaten van dingen die er niet toe doen aan de vraag en ik had voor dit voorbeeld de waardes simpelweg aangepast.

Over het debuggen, daarom werk je ook met constanten en niet echt met binaire data. Je kijkt alleen of er een constant actief is in het getal, niets gecompliceerd aan het is alleen een andere werk methode.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
if(($r = User::login($user, $pass)) !== true){
  if($r & User::R_INVALID_FORMAT_EMAIL){
    echo 'Some javascript code to mark the email field red with an error message perhaps.';
  }


  if($r & User::R_INVALID_FORMAT_PASSWORD){
    // Oh, what specifically went wrong with the password?
    $t = Validate::password($pass);

    if($t & Validate::R_PASSWORD_LENGTH_MIN){
      // password is shorter then minimum length
    }

    if($t & Validate::R_PASSWORD_NO_SYMBOL){
      // password does not contain symbols.
    }

    if($t & Validate::R_PASSWORD_NO_DIGIT){
      // password does not contain any digits.
    }
  }

  
}


//in plaats van:
if(!User::login($user, $pass)){
 if(Validate::email($user)){
  if(emailExists($user)){
   //etc
  }
 }


 if(Validate::password($pass)){
  // etc
 }
}

?>

Je vergelijk je alleen de flags/constants en zit je niet te kloten met functies of andere input data want alles word al behandeld in User::login(). Dit resulteert alleen maar in kortere, snellere (omdat je niet twee keer dezelfde functie hoeft aan te roepen) en meer overzichtelijke code naar mijn idee.

Deze code (login) gaat waarschijnlijk nog wel een andere locatie of andere constant namen krijgen, ik zit er gewoon momenteel even mee te "spelen" wat het lekkerste werkt.

En niet alleen deze functie gaat zo lopen, bitwise operators zijn heel krachtig en kunnen op veel plekken gebruikt worden. Het is ook niet de vraag waarom, maar hoe. Ik wil er wat meer ervaring mee op doen en hoopte dat iemand hier dat ook had en of hij of zij dit iets anders zou schrijven.
Gewijzigd op 28/08/2015 19:30:02 door Johan K
 
Ozzie PHP

Ozzie PHP

28/08/2015 20:27:25
Quote Anchor link
Hmmm, ik had een opmerking geplaatst, maar die lijkt niet te zijn doorgekomen ... nogmaals:

>> De waarde die word terug gekeerd is in dit geval 2 in binair "00000010"

En waarom dan binair? Waarom niet gewoon 2?

>> Mijn opzet is dat alle code wat in het systeem draait taal onafhankelijk is, dus strings terug geven met daarin de fout is dus een no-no. Als ik booleans ga terug keren dan is de vraag, wat is er fout?

Je kan toch met exceptions werken en dan bijv. foutcodes meesturen?
 
Johan K

Johan K

28/08/2015 21:32:42
Quote Anchor link
>> En waarom dan binair? Waarom niet gewoon 2?
Als je kijkt naar het script, geef ik ook gewoon een getal terug.
Waar het om gaat is hoe bitwise operators werken, die vergelijkt de bitjes van het getal en niet direct de waarde.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
  $a
= 1; // 0001   3 = 0011
  $b = 2; // 0010   5 = 0101
  $c = 4; // 0100   6 = 0110
  $d = 8; // 1000   7 = 0111

  echo 3 & $a; // aangezien het laatste bitje van 1 overeenkomt met het laatste bitje van 3, geeft hij de bitwaarde van 0001 terug dus in ditgeval het getal "1".
  echo 6 & ($b | $a); // de waarde van 6 komt niet overeen met de bitjes van $a (1), wel van $b (2), ik vergelijk dit met $a of $b, in dit geval $b dus "2".

  // In het voorbeeld kan je 3 terug krijgen van de functie (0011) als je wachtwoord en email fout zijn, nu met deze code kan je kijken wat er fout is.

  if(3 & 1){
    echo 'bitje van 3 (0011) zit ook in 1 (0001).';
  }

  if(3 & 2){
    echo 'bitje van 3 (0011) zit ook in 2.(0010)';
  }

  if(3 & 3){
    // deze is overbodig want dit word nu dubbel uitgevoerd omdat 1 & 2 dit al hebben gedaan.
    echo 'bitje van 3 (0011) zit ook in 3 (0011).';
  }

  if(3 & 4){
    echo 'bitje van 3 (0011) zit -niet- in 4 (0100)';
  }
    
?>


>> Je kan toch met exceptions werken en dan bijv. foutcodes meesturen?
Dat kan, je kan ook met arrays werken je kan van alles doen en laten wat je zelf wilt.

Maar is het snel? Een heel object aan te maken om alleen maar een getal terug te sturen? Wat ik hier doe is op bit niveau, geen objecten gewoon getallen.
Persoonlijk gebruik ik alleen exceptions op kritische fouten en niet voor return values.

Hoewel je nu het praktische nut er misschien niet van ziet, bekijk dit scenario.
ik verstuur een mail naar de inbox van een gebruiker en heb de volgende kolommen in de database. (id, message, status) de status staat standaard op 0.

Nu print ik deze mail uit in een tabel en kijk op status.
Status: 0 = unread, 1 = read, 2 replyed, 4 trashed

Als de gebruiker het bericht opent, zet ik de status op +1.
Wanneer de gebruiker antwoord geeft op het bericht, zet ik de status op +2 (3)
Wanneer de gebruiker het verwijderd, gaat de status naar +4 (7) in dit geval.

Met bitwise operators kan je heel makkelijk kijken wat de status is.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
  const UNREAD = 0;
  const READ = 1;
  const REPLYED = 2;
  const TRASHED = 4;
  const READ_AND_TRASHED = TRASHED + READ;

  if($status & UNREAD ){ //unread }
  if($status & READ ){ //read }
  if($status & REPLYED ){ //replyed }

  if($status & 3 ){ //read and replyed }
  if($status & (READ + REPLYED) ){ //read and replyed }

  if($status & TRASHED ){ //unread and trashed }
  if($status & READ_AND_TRASHED ){ //read and trashed }
  if($status & 6 ){ //replyed and trashed }
  if($status & 7 ){ //read, replyed and trashed }
  // Je kan met 0, 1, 2, 4 een maximale waarde maken van 7.

?>
Gewijzigd op 28/08/2015 21:53:14 door Johan K
 
Thomas van den Heuvel

Thomas van den Heuvel

28/08/2015 23:27:14
Quote Anchor link
De snelheid is in dit geval geen doorslaggevend critrium omdat de checks niet elke page-access worden gebruikt (even uitgaande van het oorspronkelijke voorbeeld, de login() methode van de User class, waarvan mij het nut nog steeds bijster is). Een login mag best 10ms langer duren hoor. De leesbaarheid van zo'n routine lijkt mij belangrijker dan performance. In jouw opzet wordt het ook verdomd lastig om meerdere keren eenzelfde veldtype in een formulier te hebben? Dat is helemaal niet ongebruikelijk hoor.

Ik zeg ook niet dat je een geneste structuur moet gebruiken voor validatie, dat lijkt mij (ook) niet de goede weg. Het enige wat ik denk is dat je met het bovenstaande gebruik de verkeerde weg bent ingeslagen.

Je hoeft ons denk ik ook niet uit te leggen hoe bitwise comparators werken...

Een voorbeeld van juist gebruik van wanneer je zo'n optelsom van binaire waarden als getal opslaat en hiermee vergelijkt is denk ik als je een bepaalde configuratie compact wilt opslaan en hiermee een soort van "status" van een object beschrijft. Deze kun je dan weliswaar ook makkelijk raadplegen maar je moet dan tegelijkertijd heel goed vastleggen:
- wat al deze waarden betekenen
- welke combinaties zijn toegestaan

EDIT: Daarnaast moeten deze verschillende "statussen" tezamen ook een soort van zinnige combinatie vormen die mogelijk een speciale betekenis heeft waar je vervolgens iets mee doet. Het enige wat ik tot nu toe gezien heb is dat je ofwel kijkt of alles goed is (1111111111) of toestanden alleen maar mutual exclusive op kunnen treden, dus
0001 of
0010 of
0100 of
1000) dan lijkt deze hele bitwise business mij toch echt een enorme overkill van complexiteit waarbij je nauwlijks het potentieel benut... omdat je deze niet nodig hebt!

Om het bovenstaande voorbeeld aan te halen: dit kun je reduceren tot twee boolean velden: read en trashed (of deleted ofzo). Of er op gereageerd is is redundante (afleidbare) informatie. Met jouw aanpak krijgt de leesbaarheid een enorme opdoffer en je introduceert tegelijkertijd enorm veel magic numbers (in de vorm van constanten). Je moet met behulp van documentatie dan gaan reverse-engineeren wat de betekenis daarvan is. Gebruik je echter twee kolommen met omschrijvende namen dan zijn deze al bijna volledig zelf-documenterend. Deze zijn op een natuurlijke manier al zonder moeite te ontcijferen.

Ik denk dat je op dit moment een beetje overenthousiast bent over wat je met bitwise vergelijkingen kunt doen en daarmee het praktische aspect een beetje uit het oog verloren bent.

Maar voel je vrij om deze "tangent" verder te verkennen, het lijkt er niet op dat we je enthousiasme met argumenten kunnen beteugelen.
Gewijzigd op 28/08/2015 23:41:54 door Thomas van den Heuvel
 
Johan K

Johan K

29/08/2015 00:35:59
Quote Anchor link
>> Je hoeft ons denk ik ook niet uit te leggen hoe bitwise comparators werken...
Was ook meer voor Ozzie.

>> Een login mag best 10ms langer duren hoor. De leesbaarheid van zo'n routine lijkt mij belangrijker dan performance.
Helemaal mee eens :) Daarbij kost zelfs bitwise comparisons meer rekenkracht omdat (funca() & funcb()) allebij worden uitgevoerd zelfs als funca() false geeft.

>> In jouw opzet wordt het ook verdomd lastig om meerdere keren eenzelfde veldtype in een formulier te hebben?
Ik snap niet echt wat je hier mee bedoeld, in m'n CMS systeem word er een event afgevuurd wanneer er iemand op "login" drukt in een bepaald formulier id. Deze event laad de user->login() met daarbij eventueel plugin code die daarop geregistreerd staan.

>> Gebruik je echter twee kolommen met omschrijvende namen dan zijn deze al bijna volledig zelf-documenterend. Deze zijn op een natuurlijke manier al zonder moeite te ontcijferen.
Klopt, het is zeker moeilijker uit te maken wat-wat is ik zou dus telkens de class constants erbij moeten pakken om te kijken hoe-of-wat.

Maar of ik de verkeerde weg ben opgelopen, ik sta altijd open voor suggesties maar als ik eerlijk ben zie ik geen mooiere uitweg.

In login worden plugins geladen, waaronder Capatcha (of eventuele andere dingen zoals een nieuwsbrief checkbox wat ik nog zou moeten maken) dit is dus instelbaar. Deze plugin wordt ingeladen door &$result te voeren aan de initializer van de plugin en voegt daar zijn eigen flags aan als er iets fout is.

Het werkt prima en is hierdoor heel dynamisch, alleen mag ik niet meer dan 32/64 flags hebben :p
Qua documentatie, ik hou alles prima bij en het gaat toch een systeem worden die ik zelf ga gebruiken.

Maar ik ga er een nachie over slapen, want je hebt zeker gelijk dat het debuggen uit de hand kan lopen, vooral met plugins & code opsplitsingen. Misschien constanten dynamisch laten aanmaken zodat deze van constant naar naam vertaald kan worden en een error kan worden gegeven als er geen ruimte meer is voor nieuwe flags.

Het zit nog allemaal in het begin fase, dus als je een beter idee hebt laat maar horen.
 
Thomas van den Heuvel

Thomas van den Heuvel

29/08/2015 14:15:23
Quote Anchor link
Johan K op 29/08/2015 00:35:59:
Daarbij kost zelfs bitwise comparisons meer rekenkracht omdat (funca() & funcb()) allebij worden uitgevoerd zelfs als funca() false geeft.

Euh, vergeet niet dat je numerieke waarden vergelijkt bij bitwise comparisons, geen booleans. Het zou heel vreemd, en naar alle waarschijnlijkheid gewoon fout, zijn als je een boolean in zo'n vergelijking gebruikt. De uitkomst van een bitwise comparison zou wederom een getal moeten zijn.

Het is trouwens CAPTCHA, niet CAPATCHA.

Johan K op 29/08/2015 00:35:59:
Het zit nog allemaal in het begin fase, dus als je een beter idee hebt laat maar horen.

Als je aan kunt geven wat je nu precies probeert te bereiken kunnen we wellicht tot een betere aanpak komen.
Gewijzigd op 29/08/2015 14:16:38 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.