#powershell
#powershell
Вопрос:
Я рефакторирую некоторые из моих старых скриптов PS, чтобы а) улучшить их, б) очистить, в) сделать модульными.
В скрипте, над которым я сейчас работаю, есть 10-15 функций, которые работают в определенном каталоге — давайте назовем его рабочим каталогом. В настоящее время он определен глобально и загружен из конфигурационного файла; он никогда не меняется после инициализации (делает ли это его константой?).
Я хочу перенести некоторые функции в отдельный модуль. Вопрос в том, должен ли я переписать их так, чтобы переменная передавалась явно как параметр, или я могу оставить все как есть, предполагая, что в каждом скрипте, в котором я использую этот модуль (библиотеку?), будет инициализирована эта переменная? Если последнее, как убедиться, что модуль может «обнаружить», что переменная неинициализирована и выдает некоторую ошибку?
И, последнее, но не менее важное: в настоящее время это просто переменная — должен ли я использовать какую-то конкретную конструкцию, чтобы было очевидно, что она глобальная и не подлежит изменению?
Комментарии:
1. Существуют ли какие -либо законные обстоятельства, при которых пользователь может / должен переопределять / влиять на это значение?
2. Нет, он статичен, за исключением того факта, что он загружен из конфигурационного файла и не определен в самом коде.
Ответ №1:
должен ли я переписать их, чтобы переменная передавалась явно как параметр
Пока нет законного варианта использования для переопределения его в одном вызове, я бы не стал передавать его в качестве параметра.
Если ваши функции упакованы в виде модуля, я бы настоятельно рекомендовал использовать переменные с областью действия модуля, а не глобальные.
Предполагая, что вы говорите о модуле сценария, это так просто, как:
Set-Variable -Scope Script -Name ModuleTargetDirectory -Value $config.TargetDirectory
из файла модуля или функции модуля, которая выполняется во время импорта ( script:
область действия совпадает с областью действия модуля внутри модуля), а затем в потребляющих функциях:
function Get-Something
{
# ...
$targetDirectory = $script:ModuleTargetDirectory
# ...
}
Или оберните все хранилище конфигурации в частный вспомогательный метод:
# don't export this function
function Get-MyModuleConfig
{
# assuming we stored a dictionary or custom object with the config options in a module-scoped variable named `config`
return $script:config
}
И затем всегда просто вызывайте $config = Get-MyModuleConfig
в begin
блоке функций, которым требуется доступ к данным конфигурации