何の話か
長めの行はなるべく改行入れてる。という話。
#長めの行
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($JSON_orig, [System.Collections.Hashtable])
#長めの行はこんな風に改行を入れてる
$JSON_Obj = (
New-Object System.Web.Script.Serialization.JavaScriptSerializer
).Deserialize(
$JSON_Orig,
[System.Collections.Hashtable]
)
長い行は嫌
PowerShellはコマンドレットの文字数が多く、パラメータの文字数が多く、パラメータの数が多く、何か詳しく書こうとすると簡単にエディタの右端から飛び出してしまう。
そこへC#の要素なんか加わると、もうどこが区切りか見通しが悪くて辛い。
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($JSON_orig, [System.Collections.Hashtable])
シンタックスハイライトあるだろって? や、常に同じ環境で見られるわけじゃない。エディタや設定が自分好みでないよそのマシンや、最悪メモ帳しか使えないところで見ることもある。
辛い辛いという泣き言でない表現をすると、認知コストという限られた貴重な消費リソースをこういう事に支払いたくないのだ。
安価な解決法として、改行入れて見通しを良くする。
パイプの後ろで改行
パイプ | の後ろにコマンドがない場合や、閉じ括弧 ) } によって括弧が閉じられていない場合など、コマンドが次の行に続くと解釈される。
パイプの後ろで改行は、何か読み込んでForEach-Object
へ送る時よくやる。2つ以上つなぐと(疲れてると特に)目が滑るので、改行するようにしている。
#例
Get-Content -LiteralPath .\qiita.txt -Encoding Default | Where-Object{ $_ -eq "TEST" } | ForEach-Object{ Write-Output $_ }
#上と同じ
Get-Content -LiteralPath .\qiita.txt -Encoding Default |
Where-Object{ $_ -eq "TEST"} |
ForEach-Object{
Write-Output $_
}
開き括弧やカンマの後ろで改行
パイプの後ろで改行と同様、開き括弧やカンマの後ろで改行を入れられる。
式が終わってないところなら改行できるので、さらにあちこちに改行することもできる。
あんまり改行多めだと逆にまとまりがなくなり把握しづらくなるので、開き括弧とカンマの後で改行する程度にしている。
#長めの行
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($JSON_orig, [System.Collections.Hashtable])
#開き括弧の後ろで改行
$JSON_Obj = (
New-Object System.Web.Script.Serialization.JavaScriptSerializer
).Deserialize(
$JSON_orig, [System.Collections.Hashtable]
)
#開き括弧とカンマの後ろで改行
$JSON_Obj = (
New-Object System.Web.Script.Serialization.JavaScriptSerializer
).Deserialize(
$JSON_orig,
[System.Collections.Hashtable]
)
#もっと開いてみる
$JSON_Obj =
(
New-Object System.Web.Script.Serialization.JavaScriptSerializer
).
Deserialize(
$JSON_Orig,
[System.Collections.Hashtable]
)
「もっと開いてみる」は具体的な言語にできないがなんとなくイヤ感がある。
if
を開きまくったときの「開きすぎじゃないのか?」な印象に似ている。
#if
$a = 1
$b = 2
if( $a -eq $b ){
Write-Output "True"
}else{
Write-Output "False"
}
#同じ
$a = 1
$b = 2
if(
$a -eq $b
)
{
Write-Output "True"
}
else
{
Write-Output "False"
}
バッククォートで途中改行する
PowerShellはバッククォート ` で区切ると途中で改行できる。どこでも改行できるわけではなく、語の途中などはダメである。
この方法は手軽だが、どこでも区切れてしまうので意味のまとまりがぶったぎられてしまうので良くないように感じる。
変更があったときのtypo等も考えると、他に手が無いとき以外は使いたくない。
#OK
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer`
).Deserialize($JSON_Orig, [System.Collections.Hashtable])
#OK
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).`
Deserialize($JSON_Orig, [System.Collections.Hashtable])
#これはダメ
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer)`
.Deserialize($JSON_Orig, [System.Collections.Hashtable])
#これもダメ
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScript`
Serializer).Deserialize($JSON_Orig, [System.Collections.Hashtable])