Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе
Execute "anotherGlobalVar = " & parameter
resultofFunction = anotherGlobalVar
Зачем так? Execute же работает только с публичными переменными и функциями.Код:Execute "anotherGlobalVar = " & parameter resultofFunction = anotherGlobalVar
Если речь о глобальных переменных, то вместоЗадался таким вопросом.
Функция возвращает значение глобальной переменной. Имя переменной вычисляется во вне и передается в функцию как параметр.
Как бы это сделать?
someVarable = myFunctionGetGlobalVarByName("GlobalVarName")
someVarable = GlobalVarName
правильно понял. Но я не помню, как иначе - не уверена, что правильно сработает присваивание результата обычной ф-ции напрямую без переменной в экзекьюте. насколько помню, юзала через глобальную переменную (public). Если работает - пожалуйста, расписываюсь в своем неведении =)Зачем так? Execute же работает только с публичными переменными и функциями.
По идее anotherGlobalVar должна быть публичной
Или я чего-то не понял?
anotherGlobalVar - глобальная переменная в том же модуле и служит для передачи значения.Зачем так? Execute же работает только с публичными переменными и функциями.
По идее anotherGlobalVar должна быть публичной
Или я чего-то не понял?
Проблема в том, что имя переменной заранее неизвестно и передается как параметрЕсли речь о глобальных переменных, то вместо
someVarable = myFunctionGetGlobalVarByName("GlobalVarName")
не проще ли написать:
someVarable = GlobalVarName
???
Property Get getConstant(xName As String) As String
'! переменные
Dim xRet As String
Select Case xName
Case "CFGFIELD_NSI": xRet = CFGFIELD_NSI
Case "CFGFIELD_LOG": xRet = CFGFIELD_LOG
Case "CFGFIELD_INVOICE": xRet = CFGFIELD_INVOICE
Case Else : xRet = {}
End Select
getConstant = xRet
'! конец property
End Property
Property Get getConstant(xName As String) As String
'! начало property
Execute ({xRet = }+xName)
getConstant = xRet
'! конец property
End Property
Execute ({xRet = getConstant( "CFGFIELD_NSI" ) })
Ну чего, для общего развития интересноесть задачи где возможно использование Execute...
например:
- не хочется залезать в код, а поменять набор переменных в декларациях
- отображение имен переменных и их значений (совместно с первым пунктом)
- сделать что-то типа плагинов
....
в основной массе задач - не вижу смысла заморачиваться
Глобальные переменные и Execute, будучи использованы независимо, обеспечат незабываемый головняк на протяжении всего жизненного цикла приложения. А замешав их в одной флаконе, можно добиться вообще феерических результатов.Задался таким вопросом.
Функция возвращает значение глобальной переменной. Имя переменной вычисляется во вне и передается в функцию как параметр.
Как бы это сделать?
' Абстрактный контекст выполнения
' Переопределяется в клиентах библиотеки
Class TContext
Public Function getSomething As String '
Error 1001 , Typename(Me) & {.} & Getthreadinfo(1) & { is abstract }
End Function
End Class
' Класс, выполняющий основную логику модуля
Class TCommonLogic
Private context As TContext
' текущий контекст задается в конструкторе класса
Sub new(i_context As TContext)
Set context = i_context
End Sub
' Метод, зависящий от контекста
Function doDatabaseSpecificStuff()
Dim somethingSpecific As String
somethingSpecific = context.getSomething()
' мегакод, использующий somethingSpecific
End Function
End Class
'' Usage Example: создать конкретную реализацию TContext, передать ее в конструктор TCommonLogic
Class TConcreteContext As TContext
Public Function getSomething As String '
getSomething = "Current DB specific value"
End Function
End Class
Sub initialize()
Dim context As New TConcreteContext
Dim logic As New TCommonLogic( context )
Call logic.doDatabaseSpecificStuff()
End Sub
меня тоже мучает этот вопросЕсли не секрет, какую задачу пытатесь решить таким способом? Почему не использовать внешние настройки - конфигурационный документ, файл, notes.ini и т.п.? Почему не использовать dependency injection в конструкторе или методах библиотеки?
пятничный OFF:меня тоже мучает этот вопрос
я заметил тенденцию к изобретению головняка, у части мемберов форума...
весна, видать, так действует
Если не секрет, какую задачу пытатесь решить таким способом? Почему не использовать внешние настройки - конфигурационный документ, файл, notes.ini и т.п.?
Общую задачу излагал здесьменя тоже мучает этот вопрос
За ссылку спасибокак писать нечитаемый код, или гарантированная работа на всю жизнь
Вам фактически нужен адаптер для конфигурационного документа. Для создания адаптера вы используете мапинг полей через глобальные переменные.Если возвращаться к исходной задаче, то конфигурационные документы во всех базах есть (слава богу получаются одинаковым образом), но реализация... ужасная. Одни и те же сущности определены в разных полях. Переделать это нереально. Вот и подумал, что имена этих полей можно задать в специальной библиотеке константами.
Проблема перекомпиляции в данном случае специфична не задаче, а выбранному решению. Т.е. эту проблему вы придумали сами, изобретая решение основной задачи.Для того, чтобы не перекомпилировать каждый раз общую библиотеку при изменениях, решил персональную библиотеку (с константами) подгружать динамически. Всё...
у меня тоже есть порядочно позорного кода (делалось как временная затычка...)Самое смешное, этот ужос успешно работает и решает все поставленные задачи. А код такой, что хочется забиться в угол и зарыдать...
О недостатках глобальных переменных писать можно долго. Основная беда: никогда нельзя быть уверенным, что кто-то другой не изменил ее значение. Развернутый список проблем можно нагуглить.turumbay
А можешь написать недостатки решения, предложенного мной? Для статистики.
Execute лишает возможности воспользоваться компилятором для поиска ошибок, затрудняет отладку и поиск ошибок, открывает дыру в безопасности для врага или дурака.Меня мама в детстве учила двум вещам:
1. не входить в лифт с незнакомыми дядьками
2. глобальные переменные - плохо
Обучение наступательной кибербезопасности в игровой форме. Начать игру!