Глобальные константы в Powershell

#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 блоке функций, которым требуется доступ к данным конфигурации