Intressant - men samma sak som tidigare fattas.
Jag anser att när man programmerar ska ett värde definieras ett enda ställe och alla användningar av det värde ska referera till det ställe.
Du har 4 texter med möjliga kommandon (commands), de kommer i en viss följd. Helt OK.
Sedan har du en tabell (commandsequences) som anger vilka kombinationer som är OK. Helt fint.
Men redan där kan det skita sig!
I detta simpla exempel är det relativt enkelt att se till - manuellt - att inget kommer ur synkronisering men om man i ett större, mindre överskådligt, program råkar peta in en kommandotext i commands och glömmer att synkronisera commandsequence med detta är det skit! Och det är just det skit jag vill undvika!
Jag skulle alltså gärna vilje ha ett sätt att båda definiera en text SAMT lägga en "tag" på den så att jag får ett logisk värde som om att den "satt" i en enum{}.
På det vis kan alla hänvisningar till kommandoordets index skötas automatisk och ingen "mismatch" sker, oavsett hur stort system man skapar.
Grejen är att "alla" vet att hårdkoder man i ett program kommer det värde man hårdkoder in att behöva ändras någon gång. Och då ska man sitta och peta och ha sig och hitta alla ställen. Detta ger fel, inte alltid men i ett större program kan det vara väldigt svårt att hitta alla de hårdkodade värden och ändra dom.
Därför "ska" man alltid ange värden som kan hårdkodas i en gemensam definition och sedan använda den som källa till allt. Och är det "värdet -1" man behöver använder man den beskrivning i programmet, då blir det alltid rätt!
Så jag söker ett automatiserat sätt att göra det på - men just nu får det vara ett tag, det är nattdags.
Fastnat i tankarna
Re: Fastnat i tankarna
Som jag skrev är det hela bara ett basalt koncept.
Jag håller fullständigt med om att saker ska i möjligaste mån definieras på ett ställe.
Hårdkodade otyg ska hållas till minimum och om möjligt genereras i ens byggmiljö av pre-processor eller dsl eller dylikt som används för att sedan generera de variabler, metoder etc. som behövs. Allt för att undvika copy-paste-missar och alla dess släktingar.
Man kan definitivt och bör om möjligt beskriva kommandon i lämpligt dsl för att sedan generera lämplig kod.
Till exempel skulle man enkelt kunna skriva en snutt som tar strängar i form av:
"GET TIME=>gettime()"
"SET TIME=>settime(value)"
"SET DATE TIME=>setdatetime(value1, value2)"
där varje mening består av
"word+ => actionptr(variable?+)"
dvs, godtyckligt antal dock minst ett _word_ som ska lyftas ut och sparas, placeholder => som kastas, _actionptr_ som ska sparas och relateras till följden av _word_ tidigare, placeholder ( som kastas, eventuellt en eller flera variabler som räknas till antalet men som inte benämns vid namn, placeholder ) som kastas.
och sedan automagiskt genererar listan av accepterade ord:
["GET", "TIME", "SET", "DATE"]
samt följden av orden som ger kommandot och vilken funktionspekare som ska anropas samt antal parametrar:
[(0, 1), (2, 1), (2, 3, 1)]
[(gettime, 0), (settime, 1), (setdatetime, 2)]
Då är det enda programmet behöver som input(antingen compile-time eller run-time) listan i början, dvs:
"GET TIME => gettime()"
"SET TIME => settime(value)"
"SET DATE TIME => setdatetime(value1, value2)"
Jag håller fullständigt med om att saker ska i möjligaste mån definieras på ett ställe.
Hårdkodade otyg ska hållas till minimum och om möjligt genereras i ens byggmiljö av pre-processor eller dsl eller dylikt som används för att sedan generera de variabler, metoder etc. som behövs. Allt för att undvika copy-paste-missar och alla dess släktingar.
Man kan definitivt och bör om möjligt beskriva kommandon i lämpligt dsl för att sedan generera lämplig kod.
Till exempel skulle man enkelt kunna skriva en snutt som tar strängar i form av:
"GET TIME=>gettime()"
"SET TIME=>settime(value)"
"SET DATE TIME=>setdatetime(value1, value2)"
där varje mening består av
"word+ => actionptr(variable?+)"
dvs, godtyckligt antal dock minst ett _word_ som ska lyftas ut och sparas, placeholder => som kastas, _actionptr_ som ska sparas och relateras till följden av _word_ tidigare, placeholder ( som kastas, eventuellt en eller flera variabler som räknas till antalet men som inte benämns vid namn, placeholder ) som kastas.
och sedan automagiskt genererar listan av accepterade ord:
["GET", "TIME", "SET", "DATE"]
samt följden av orden som ger kommandot och vilken funktionspekare som ska anropas samt antal parametrar:
[(0, 1), (2, 1), (2, 3, 1)]
[(gettime, 0), (settime, 1), (setdatetime, 2)]
Då är det enda programmet behöver som input(antingen compile-time eller run-time) listan i början, dvs:
"GET TIME => gettime()"
"SET TIME => settime(value)"
"SET DATE TIME => setdatetime(value1, value2)"