Hallo zusammen,
ich habe da mal eine Frage. Ich versuche das Observer-Pattern in AutoIt umzusetzen.
Bisher funktioniert das ganze auch, nur bin ich mit meinem Code noch nicht zufrieden.
Spoiler anzeigen
AutoIt
#include <Array.au3>
Func Array()
local $arr = []
_ArrayDelete($arr, 0)
return $arr
EndFunc
Func Dict()
local $dict = ObjCreate("Scripting.Dictionary")
$dict.CompareMode = 1
return $dict
EndFunc
Global $Subscribers = Dict()
Func Subscribe($fFunction, $sChannel = "any")
If Not $Subscribers.Exists($sChannel) Then
$Subscribers.Add($sChannel, Array())
EndIf
local $arr = ($Subscribers.Item($sChannel))
_arrayAdd($arr, $fFunction)
$Subscribers.Item($sChannel) = $arr
EndFunc
Func Publish($sMsg, $sChannel = "any")
For $fn in ($Subscribers.Item($sChannel))
ConsoleWrite("Calling function " & FuncName($fn) & " on channel " & $sChannel & @CRLF)
Call($fn, $sMsg)
Next
EndFunc
Func me1($data)
ConsoleWrite("[me1] Got message: " & $data & @CRLF)
EndFunc
Func me2($data)
ConsoleWrite("[me2] Got message: " & $data & @CRLF)
EndFunc
Subscribe(me1)
Subscribe(me2, "events")
; Array Inhalt nur "lesbar" wenn die Function als String subscribed wird
; Subscribe("me1")
_ArrayDisplay( ($Subscribers.Item("any")) )
_ArrayDisplay( ($Subscribers.Item("events")) )
Publish("Hello, World!")
Publish("Let's get started!", "events")
Alles anzeigen
Besonders die Subcribe() Function gefällt mir noch nicht.
Habt Ihr generell einige Tipps oder Denkanstösse wie das ganze eleganter laufen kann?
Danke & Gruß