PowerShellで長めの行を改行する

# 何の話か

長めの行はなるべく改行入れてる。という話。

```powershell:行長めの時
#長めの行
$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#の要素なんか加わると、もうどこが区切りか見通しが悪くて辛い。

```powershell:行長めの時
$JSON_Obj = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($JSON_orig, [System.Collections.Hashtable])
```

シンタックスハイライトあるだろって？　や、常に同じ環境で見られるわけじゃない。エディタや設定が自分好みでないよそのマシンや、最悪メモ帳しか使えないところで見ることもある。
辛い辛いという泣き言でない表現をすると、認知コストという限られた貴重な消費リソースをこういう事に支払いたくないのだ。

安価な解決法として、改行入れて見通しを良くする。


# パイプの後ろで改行

[PowerShell で長いコマンドを綺麗に書きたい](https://qiita.com/yumura_s/items/2760de1ff5807695fbba)

>パイプ | の後ろにコマンドがない場合や、閉じ括弧 ) } によって括弧が閉じられていない場合など、コマンドが次の行に続くと解釈される。

パイプの後ろで改行は、何か読み込んで`ForEach-Object`へ送る時よくやる。2つ以上つなぐと(疲れてると特に)目が滑るので、改行するようにしている。

```powershell:パイプの後ろで改行
#例
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 $_
}
```


# 開き括弧やカンマの後ろで改行

パイプの後ろで改行と同様、開き括弧やカンマの後ろで改行を入れられる。
式が終わってないところなら改行できるので、さらにあちこちに改行することもできる。
あんまり改行多めだと逆にまとまりがなくなり把握しづらくなるので、開き括弧とカンマの後で改行する程度にしている。

```powershell:行長めの時
#長めの行
$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`を開きまくったときの「開きすぎじゃないのか？」な印象に似ている。

```powershell: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等も考えると、他に手が無いとき以外は使いたくない。

```powershell:バッククォートで改行
#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])
```