올림픽 공원이 지금 철쭉꽃이 한창이다. 시간 나시는 분은 카메라 들고 가보시는 것도 괜찮을 듯.
Author: yhbyun
VBScript의 GetRef을 이용하여 간단한 이벤트 드리븐 프로그래밍하기
VBScript는 객체 지향적인 측면에서는 많이 부족한 언어다. 상속이나 다형성을 전혀 제공하고 있지 않아서 클래스를 만드는게 오히려 불현할 때가 더 많은 게 사실이다. 조금이나마 이런 단점을 보안해 줄 수 있는 함수가 하나 있는데 GetRef 이다.
GetRef는 인자로 넘긴 문자열에 해당하는 함수 포인터를 반환하는 기능을 하는 함수이다. 이 함수를 이용하여 VBscript에서 간단하게 이벤트 드리븐(event driven) 프로그래밍하는 좋은 예제가 있어서 소개할려고 한다.
VBScript doesn’t have an event implementation so if you fancy having features like attaching handlers which will respond to specific events on your object you can do it simply by using the GetRef function and a bit of “syntactic sugar”.
I’m using ASP in these examples cos it’s easy.
Example 1 – Simple Events
‘Create a handler
Function MyHandler()
Response.Write “Hello from the handler!”
End Function‘Create an event
Dim OnLoad
Set OnLoad = GetRef(“MyHandler”)‘Fire the event
OnLoad()
Here we’ve created a simple event which takes one handler function and fired the event which in turn has called the function we attached.
To turn this in to a more useful event system we can use an array for the OnLoad event variable thus…
‘Create some handlers
Function MyHandler1()
Response.Write “Hello from handler 1!”
End FunctionFunction MyHandler2()
Response.Write “Hello from handler 2!”
End Function‘Create an event
Dim OnLoad
OnLoad = Array(GetRef(“MyHandler1”), GetRef(“MyHandler2”))‘Fire the event
For Each handler In OnLoad
handler()
Next
Example 2 – Event Arguments
In most event implementations the event handlers take one argument, passed to them by the fired event, which contains things like the type of event and a reference to the object on which it was fired etc.
‘Create a handler which takes one argument
Function MyHandler(e)
Response.Write “Hello from the handler – i was called by ” & e
End Function‘Create two events
Dim OnLoad
Set OnLoad = GetRef(“MyHandler”)Dim OnUnload
Set OnUnload = GetRef(“MyHandler”)‘Fire the events
OnLoad(“Load”)
OnUnload(“Unload”)
Wrapping it up
We’ve established we can do all the basics of events, now all we need to do is wrap it up in a few classes to make it usable.
First we need an Event class that we can instantiate for each event we want. This will have to expose an event arguments property and methods for attaching handlers and firing the event. It will also have to keep track internally of the attached handlers. Lets have a go…
Class clsEvent
‘An array to keep track of our handlers
Private aryHandlers()‘Our event arguments object to be passed
‘to the handlers
Public EventArgsPrivate Sub Class_Initialize()
ReDim aryHandlers(-1)
Set EventArgs = New clsEventArgs
End SubPrivate Sub Class_Terminate()
Set EventArgs = Nothing
Erase aryHandlers
End Sub‘Method for adding a handler
Public Function AddHandler(strFunctionName)
ReDim Preserve aryHandlers(UBound(aryHandlers) + 1)
Set aryHandlers(UBound(aryHandlers)) = _
GetRef(strFunctionName)
End Function‘Method for firing the event
Public Function Fire(strType, objCaller)
EventArgs.EventType = strType
Set EventArgs.Caller = objCaller
For Each f In aryHandlers
f(EventArgs)
Next
End FunctionEnd Class
Next we need an EventArgs class for passing data about the event to the handlers. This just needs three properties; event type, caller and an arguments collection for event type specific things.
Class clsEventArgs
Public EventType, Caller, Args
Private Sub Class_Initialize()
Set Args = CreateObject(“Scripting.Dictionary”)
End SubPrivate Sub Class_Terminate()
Args.RemoveAll
Set Args = Nothing
End SubEnd Class
Next our class that has an event, in this case an OnLoad which fires after the object’s Load method is called. We’ll also create a few handlers and do a trial run.
Class MyClass
Public OnLoad
Private Sub Class_Initialize()
‘Setting up our event
Set OnLoad = New clsEvent‘Adding an argument
OnLoad.EventArgs.Args.Add “arg1”, “Hello”
End SubPublic Function Load()
Response.Write “loading the object here!<br />”‘Firing the event
OnLoad.Fire “load”, Me
End FunctionEnd Class
‘A couple of handling function for the events
Function EventHandler(e)
Response.Write “<h2>EventHandler</h2>”
Response.Write “<p>Event “”” & e.EventType & “”” fired by object
of type ” & TypeName(e.Caller) & “.</p>”
End FunctionFunction EventHandler2(e)
Response.Write “<h2>EventHandler2</h2>”
For Each x In e.Args
Response.Write x & “: ” & e.Args(x) & “<br />”
Next
End Function‘instantiate the object, attach the handlers and call the load
Set myObj = New MyClass
myObj.OnLoad.AddHandler(“EventHandler”)
myObj.OnLoad.AddHandler(“EventHandler2”)
myObj.Load()
Event based programming reverses the responsibility for code execution within your program. In conventional procedural programming it would be the responsibility of the myObj class to make sure the two event handlers were fired when it’s Load method was called. By using an OnLoad event instead myObj doesn’t have to know anything about the environment in which its executing, it just blindly fires the event and any attached handlers will be called. In this way you can add additional functions which run when myObj’s Load method is called without modifying MyClass.
In more complex systems being able to add functionality with a minimum of intrusion into other parts of the system is a big bonus and event based programming is an easy way of achieving it.
출처: http://derek-says.blogspot.com/2006/10/simple-event-driven-programming-using.html
VBScript: URLEncode, URLDecode 함수
ASP에 URL을 인코딩하려면 Server 객체의 URLEncode 메쏘드를 사용하면 된다. 그럼 디코딩은 어떻게 하지? ASP환경이 아닌 환경- 예를 들면 도스창에서 VBScript로 스크립트를 짤 때 – 에서는 Server 객체가 제공이 안되는데 이곳에서는 인코딩이나 디코딩을 어떻게 해야 하는가?
여기에 대한 대안으로 사용할 수 있는 함수인 URLEncode, URLDecode를 소개한다.
Function URLEncode(sStr) Dim i, acode URLEncode = sStr For i = Len(URLEncode) To 1 Step -1 acode = Asc(Mid(URLEncode, i, 1)) If (aCode >=48 And aCode <=57) Or (aCode >= 65 And aCode <=90) Or (aCode >= 97 And aCode <=122) Then ' don't touch alphanumeric chars Else Select Case acode Case 32 ' replace space with "+" URLEncode = Left(URLEncode, i - 1) & "+" & Mid(URLEncode, i + 1) Case Else ' replace punctuation chars with "%hex" URLEncode = Left(URLEncode, i - 1) & "%" & Hex(acode) & Mid(URLEncode, i + 1) End Select End If Next End Function Function URLDecode(sStr) Dim sTemp, sChar, nLen Dim nPos, sResult, sHex On Error Resume Next nLen = Len(sStr) sTemp = Replace(sStr, "+", " ") For nPos = 1 To nLen sChar = Mid(sTemp, nPos, 1) If sChar = "%" Then If nPos + 2 <= nLen Then sHex = Mid(sTemp, nPos+1, 2) If IsHexaString(sHex) Then sResult = sResult & Chr(CLng("&H" & sHex)) nPos = nPos + 2 Else sResult = sResult & sChar End If Else sResult = sResult & sChar End If Else sResult = sResult & sChar End If Next If Err Then LogError "URLDecode(" & sStr & "). " & Err.description End If On Error GoTo 0 URLDecode = sResult End Function '' ' 문자열이 모두 16진수 문자열로 구성되어 있는지 점검 ' @param sStr 검사할 문자열 ' @return 모두 HEX String으로 이루어져 있으면 true, 아니면 false Function IsHexaString( sStr ) Dim nPos Dim sChar Dim bReturn bReturn = True If sStr <> "" Then For nPos = 1 To Len(sStr) sChar = Mid( sStr, nPos, 1 ) If ( sChar < "a" OR sChar > "f" ) And ( sChar < "A" OR sChar > "F") And ( sChar < "0" OR sChar > "9") Then bReturn = False End If Next Else bReturn = False End If IsHexaString = bReturn End Function