Avatar billede luke2009 Nybegynder
28. juli 2009 - 14:54 Der er 22 kommentarer og
2 løsninger

Dim ændrer på variablers egenskaber

Hej

Jeg har denne funktion

Function stripTags( strToStrip )
 
    strToStrip = Trim( strToStrip & "" )
    If Len( strToStrip ) > 0 Then
  strKeyword = Replace(strToStrip,"'","")
  strKeyword = Replace(strKeyword,"''","")
  strKeyword = Replace(strKeyword,">","")
  strKeyword = Replace(strKeyword,"<","")
  strKeyword = Replace(strKeyword,"+","")
  strKeyword = Replace(strKeyword,"[","")
  strKeyword = Replace(strKeyword,"]","")
    End If
    stripTags =  strKeyword
End Function

Der sker en forskel ved at deklarerer variablen strKeyword.

Eks.:

Deklareret

1. kald
stripTags( test )

output = test

2. kald
StripTags( "" )

output = test

-------------------------------------------

Hvis strKeyword ikke er deklareret bliver andet output "". Hvilken den ikke må.

Hvorfor "huskes" hvad strKeyword indeholder fra forrige gang funktionen blev benyttet såsnart variablen deklareres?

Hvordan løses dette. Jeg vil helst ikke droppe deklarationer af mine variabler.
Avatar billede fennec Nybegynder
28. juli 2009 - 15:01 #1
Går ud fra du deklarerer den global?? Altså sådan:

dim variabel

funktion test(para)
  variabel = para
  ...
end function

I modsætning til lokalt i funktionen (som er det du faktisk ønsker):

funktion test(para)
dim variabel
  variabel = para
  ...
end function
Avatar billede softspot Forsker
28. juli 2009 - 15:06 #2
Umiddelbart lyder dit setup ikke optimalt. Jeg antager du erklærer din variabel strKeyword globalt...(?)

I så fald vil den huske indholdet fra forrige kald, såfremt den streng du sender med ind er tom, ellers burde den overskrive indholdet af strKeyword ved næste kald.

Et quickfix kunne være:

Function stripTags( strToStrip )
 
    strToStrip = Trim( strToStrip & "" )
    If Len( strToStrip ) > 0 Then
  strKeyword = Replace(strToStrip,"'","")
  strKeyword = Replace(strKeyword,"''","")
  strKeyword = Replace(strKeyword,">","")
  strKeyword = Replace(strKeyword,"<","")
  strKeyword = Replace(strKeyword,"+","")
  strKeyword = Replace(strKeyword,"[","")
  strKeyword = Replace(strKeyword,"]","")
    Else
  strKeyword = ""
    End If
    stripTags =  strKeyword
End Function

Jeg synes dog ikke det er nogen god idé hverken at erklære variable globalt eller slet ikke erklære dem, da det dels risikerer at give sideeffekter, dels sandsynligvis gør koden langsommere, fordi scopesøgningen for en variabel starter fra det lokale scope og går opad (indtil det globale scope er undersøgt).
Avatar billede softspot Forsker
28. juli 2009 - 15:11 #3
Jeg undrer mig lidt over hvad det er du forsøger med dette:

1. kald
stripTags( test )

output = test

2. kald
StripTags( "" )

output = test

Det ser ud til at du aflæser inputparameteren, hvilket ikke umiddelbart vil fungere. Umiddelbart ville jeg forvente dette i stedet:

1. kald
output = stripTags( test )

2. kald
output = StripTags( "" )

Men det skyldes givetvis at du ikke viser hele din kode... :-)
Avatar billede luke2009 Nybegynder
28. juli 2009 - 15:40 #4
Jo, output var for at beskrive hvad funktionen sender tilbage.

Mht. deklarationer så bør man kun deklarerer variabler i funktioner i selve funktionen?

Synes dog det er noget rod at deklarerer flere steder i et script.

softspot:
Du skriver at det ikke er noget god ide at deklarerer globalt. Hvad gør man så med de variabler, der bruges i scriptet ud over funktionen og subs?
Avatar billede luke2009 Nybegynder
28. juli 2009 - 15:44 #5
Hvad med variabler i løkker fx. for i = 0 to 10. Skal i deklareres?
Avatar billede softspot Forsker
28. juli 2009 - 15:47 #6
Der kan naturligvis være situationer hvor der ikke er andre muligheder end at erklære sine variable globalt. Det jeg vil frem til er blot, at det er god skik at erklære sine variable så tæt på det scope, hvori de skal benyttes/virke, som muligt.

Hvis det tætteste du kan komme er globalt, så er det nædvendigvis der de skal erklæres... :-)
Avatar billede luke2009 Nybegynder
28. juli 2009 - 15:49 #7
Et spørgsmål mere:

har jeg funktionen stripTags( strToStrip )
hvor deklareres strToStrip?

Den vil ikke være med til at den deklareres inde i funktionen.
Avatar billede softspot Forsker
28. juli 2009 - 15:50 #8
Man bør som udgangspunkt ALTID erklære sine variable, så fortolkeren slipper for at lede efter et sted at placere dem (hvilket bliver i det globale scope, hvis de ikke er). Hvis du kan komme afsted med det, så benyt Option Explicit i starten af dine scripts, da du så vil få en compilefejl, for variable der ikke er erklæret. Det kan hjælpe dig med at fange dumme stavefejl i variabelnavne og hjælpe dig til aktivt at overveje hvad en variabel skal bruges til.

Løkkevariable bør ligesom alle andre variable erklæres inden brug.
Avatar billede softspot Forsker
28. juli 2009 - 15:51 #9
strToStrip bør erklæres i det scope hvorfra stripTags kaldes.
Avatar billede fennec Nybegynder
28. juli 2009 - 16:00 #10
Luke >>
Tror Softspot vil arbejde meger mere med funktioner i stedet for at skrive koden direkte. Der er for den sags skyld heller ikke noget problem i at tage en hvilken som helst kode du har nu, også smide det hele i en kæmpe funktion, som du så lave et kald til.

Jeg er af den mening at du skal arbejde som du har lyst til, men have et åben sind for hvordan andre arbejder, og hvorfor de gør det på den måde. Overdrevet brug af globale variabler eller udladelse af deklaration er dog ikke godt.

Servere er idag så hurtigere at resurcer ikke er et problem. Så medmindre du laver kæmpe systemer, som skal trække rigtig mange brugere, er der ikke den store grund til at tænke på hvordan variabler bliver deklarerer, og hvilke resurcer det kræver de forskellige steder. Men det skader jo ikke at kende til det :)

Der er dog et par programeringslogiker man bør følge (bemærk "bør", da det ikke er et krav). I dette tilfælde er det at variabler der kun bruges i funktionen også skal deklareres heri, så resurcer frigives så snart funktionen er færdig.

Det næste er så at man bør navngive lokale og globale variabler, så man kan kende forskel på dem. Det kan man f.eks ved at navngive alle globale som g_xxx og lokale som l_xxx. F.eks sådan:

dim g_variabel
function test(p_variabel)
dim l_variabel
  ...
end function
Avatar billede luke2009 Nybegynder
28. juli 2009 - 16:01 #11
Jeg skal lige have det her på det rene.

Så alle parametre erklæres udenfor funktionen og alle variabler kun brugt i funktionen, erklæres i funktionen?
Avatar billede luke2009 Nybegynder
28. juli 2009 - 16:05 #12
fennec:

Nej, det er da heller ikke pga. performance, jeg vil erklære variabler. Men jeg vil gerne gøre det mere ordenligt. Det med at putte et prefix på variabler, har jeg ikke lige set før. Kan ikke se det store formål med det, andet end man kan have to variabler med samme navn men med forskelligt prefix.
Avatar billede fennec Nybegynder
28. juli 2009 - 16:05 #13
NEMLIG :)
Avatar billede fennec Nybegynder
28. juli 2009 - 16:15 #14
Prefixes skal til for at holde styr på hvor variablen kommer fra.
Lige så snart du begynder at skrive store programmer kan du nemt komme op på +100 variabler, også kan det være svært at holde styr på dem alle.

Hvis du nu har lavet en global variabel som hedder username (hvor man gemmer brugernavnet), og du i en funktion skal arbejde med brugernavne, også kommer til at bruge denne variabel (og har glemt at erklære den i funktionen), får du ingen kompiler fejl, men vil sikkert opleve problemer da den globale variabel bliver overskrevet uhensigtsmæssig.

I små programmer oplever man næppe dette, og det er ikke noget man behøver at gøre, da man godt kan holde styr på det lille antal variabler man har. Kommer du til at arbejde med store programmer (måske i et firma), vil du opleve at du får udleveret en programmerings manual, hvor navngivning af variabler og funktioner er dikteret hvordan man gør. Det er ofte helt ned til hvad der skal være store og små bogstaver.
Avatar billede fennec Nybegynder
28. juli 2009 - 16:17 #15
... Uddybende kommentar...
Havde du navngivet den globale variabel g_username og den lokale l_username, ville du få en kompiler fejl, fordi l_username ikke var oprette.
Avatar billede fennec Nybegynder
28. juli 2009 - 16:19 #16
Ved ikke om du har det allerede men "Option Explicit" er din variabel ven. Hvis den står i toppen af din side, kræver kompileren at alle variabler SKAL erklæres. Jeg har f.eks. dette i toppen af alle mine sider:

<% @LANGUAGE = VBScript %><%
Option Explicit
Response.CacheControl = "no-store"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1
session.codepage=1252
session.LCID = 1030
Avatar billede fennec Nybegynder
28. juli 2009 - 16:28 #17
Så lige din parameter kommentar...

Parametre navne i funktioner skal IKKE erklæres, men variabler der sendes ind skal selvfølgelig. Altså sådan:


dim g_SkalErklæres
call test(g_SkalErklæres)

function test(p_SkalIKKEErklæresNogenSteder)
...
end function
Avatar billede softspot Forsker
28. juli 2009 - 16:30 #18
Det er vigtigt at notere sig, at jeg på intet tidspunkt har sagt at man SKAL gøre som jeg siger, men at det er god skik (dermed også forstået at du selv vælger). Dog vil jeg påstå at sandsynligheden for at din kode også vil være mere læsbar for andre, hvis du følger nogle simple regler, er større. Orden i koden og stilen er efter min mening en vigtig faktor ifht. hvor let det er at vedligeholde sin kode senere. Vigtigst er det nok at man holder den samme form/stil overalt, så det er konsekvent hvordan tingene gøres (dog bør der jo stadig være en vis orden). Det er dog vist ved at være lidt udenfor emnet, så jeg vil bare lade det stå som en sidebemærkning... ;-)

Jeg er principielt uening med fennec i at man ikke skal tænke på performance når man koder, specielt hvis det er noget som kan hentes blot ved at have nogle gode vaner fra starten - det er jo gratis gevinst! :-)
Avatar billede softspot Forsker
28. juli 2009 - 16:31 #19
Og grunden til at parametre ikke skal erklæres er naturligvis fordi de allerede er erklæret i parameterlisten (og dermed fungerer i det lokale scope) :-)
Avatar billede fennec Nybegynder
28. juli 2009 - 16:46 #20
softspot >>
Selvfølgelig skal man tænke på performance når man koder. Spørgsmålet er bare hvor man vil finde denne performance.

Her mener jeg at erklæring af variabler (om det er global, lokal eller slet ikke) er et meget lille sted at kigge efter performance. Der er meget mere at hente ved at kigge på løkker, databasekald osv. Men selvfølgelig er det gratis gevinst at erklære variabler, så man bør gøre det "rigtigt".

Jeg ser dog mere erklæring af variabler som en sikkerhedsprocedure, så man ikke kommer til at "genbruge" variabler de forkerte steder.

Men gode vaner er helt klart en rigtig god ting at have fra starten :)
Avatar billede luke2009 Nybegynder
03. august 2009 - 11:43 #21
Tak for rådene og hjælpen. Hvis nogen af jer ønsker pointene så læg et svar.
Avatar billede fennec Nybegynder
03. august 2009 - 11:51 #22
.o) <-- One Eyed Jack
Avatar billede softspot Forsker
03. august 2009 - 14:10 #23
:-)
Avatar billede softspot Forsker
03. august 2009 - 16:21 #24
Tak for point :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester