web-dev-qa-db-ja.com

PowerShellで変数を初期化する正しい方法

コードのブランチ内で最初に定義される変数を初期化することに関する好ましい習慣はありますか、またはこれは純粋に主観的/個人的な好みですか?

つまり、これには複数の方法があります。最も明白なものは以下のとおりです。

#option 1
[string]$path = ''
if ($ENV:PROCESSOR_ARCHITECTURE -like '*64') {
    $path = ${env:ProgramFiles(x86)}
} else {
    $path = $env:ProgramFiles
}
Get-ChildItem $path 


#option 2
[string]$path = $env:ProgramFiles
if ($ENV:PROCESSOR_ARCHITECTURE -like '*64') {
    $path = ${env:ProgramFiles(x86)}
}
Get-ChildItem $path 


#option 3
if ($ENV:PROCESSOR_ARCHITECTURE -like '*64') {
    [string]$path = ${env:ProgramFiles(x86)}
} else {
    [string]$path = $env:ProgramFiles
}
Get-ChildItem $path 

ほとんどのプログラミング言語では、option 1を使用します。つまり、変数が宣言されてデフォルトが上部に設定され、その後のブランチで割り当てられます。値をフェッチするコストが重要でない場合は、代わりにoption 2を選択できます(たとえば、上記では環境変数をプルバックしているだけなので、低コストの操作ですが、値を外部リソース/ option 1よりもoption 2を優先する場合があります。同様に、各値が使用される条件をよりよく示すため、オプション2よりもオプション1を好む人もいます。 Option 3は、変数宣言を必要としない言語でのみ許可されます。そのため、PowerShellで許可されています/は、最小コストのソリューションです(つまり、割り当ての最小数)。

注意:[string]修飾子は不必要です/ PowerShellがこれを自動的に決定します。これは、変数宣言(つまり、最初の代入)の概念を説明するのに役立つものです。

オプション3への嫌悪を感じます。おそらく他の言語での私の経歴が原因です。他の人が同じ嫌悪感を抱いているかどうか、またはほとんどの人が「これはこの言語で行うのが正しいことだ」と単に思っているかどうかはわかりません。

この種のことについてのガイドラインはありますか(つまり、パフォーマンスに関する考慮事項や、より適切な決定を行うための追加要素がない場合)?

7
JohnLBevan

これは非常に説得力があり、すべてのプロのプログラマーは、それぞれの亜種を読んで理解するのに問題はないはずです。ただし、これは$path変数の不要な繰り返しを回避するバージョンであり、3つの選択肢のどれよりもDRYです。

[string]$path = if ($ENV:PROCESSOR_ARCHITECTURE -like '*64') {
        ${env:ProgramFiles(x86)
    } else {
        $env:ProgramFiles
    }

これをもう少し読みやすくするために、おそらく、式$ENV:PROCESSOR_ARCHITECTURE -like '*64'の説明変数を紹介します(ただし、これは、4つのバリアントのいずれかに対して行うものであり、質問とは直交しています)。つまり.

[bool]$isX64Processor = $ENV:PROCESSOR_ARCHITECTURE -like '*64'
[string]$path = if ($isX64Processor) {
        ${env:ProgramFiles(x86)
    } else {
        $env:ProgramFiles
    }
11
Doc Brown

普遍的に好ましい方法があるとは思いません。最終的な価値の決定が複雑なプロセスである場合、私はオプション1を使用します。 1つの値が最も可能性が高く、別の値が例外的な場合は、オプション2を使用します。

1
Martin Maat