ヒアドキュメントを記述したい
SQL などが多いと思いますが、プログラムの中に他のプログラムを記述することはしばしばあります。その際に便利なのがヒアドキュメントなどと呼ばれている記法です。「ヒアドキュメント」という呼称は言語によって異なり、Visual Basic では「複数行の文字列リテラル」と呼称しています。ですが、概ね「ヒアドキュメント」で検索すれば見つけられるでしょう。
3つの選択肢
VB.NET でヒアドキュメントを使いたい場合、VS 2015 では3つの記法を使えます。
参考:
https://qiita.com/alg/items/f0f94902f0d97adcf15d
https://msdn.microsoft.com/ja-jp/magazine/dn890368.aspx
1. System.Xml.Linq.XElement を使う方法(Visual Basic 9 以降)
XML リテラルをインラインで記述できる方法を利用し、ヒアドキュメントのように使う裏技的な記法です。
Dim sql As String = <Query><![CDATA[
SELECT
*
FROM theTable
WHERE 1=1
AND id = ?
]]></Query>.Value
この書き方を採用する場合、デフォルトの文字色がかなり薄い灰色なのでとても見づらいことになります。設定を変更したくなるでしょう。「ツール > オプション > 環境 > フォントおよび色 > 表示項目 > "VB XML リテラル - CData セクション"」が該当のものになります。好みの色に変更することで見やすく出来ます。
2. 複数行の文字列リテラル(Visual Basic 14 以降)
二重引用符の中で改行ができるようになりました。直感的です。
Dim sql As String = "
SELECT *
FROM theTable
"
3. 文字列補完を含む複数行の文字列リテラル(Visual Basic 14 以降)
二重引用符のアタマに $
記号を付けます。これは String.Format
の代替構文です。
Dim sql As String = $"
SELECT
*
FROM person
WHERE 1=1
AND section = '{KEIRI}'
AND status = '{ENABLE}'
"
サンプルのように定数を埋め込みたい場合に便利です。検索引数として、ユーザーに入力してもらうものの他に固定値を使いたいことはあるものです。マジックナンバーを用いるのではなく、記号定数を定義してそれを利用するのは良い選択です。
変数を埋め込むのはダメ ですよ。
結局どれを採用したか
「1」をずっと使ってきて「2」「3」のような王道的な記法が出てきたので、そちらに移行しようかと思いました。しかしながら、次にあげる理由で「1」の記法を使っています。
定数の埋め込みをやめた
SQL をヒアドキュメントに書くことのアドバンテージは「手軽に SQL 単独での検証ができること」にあると思うので、その際の編集箇所は少ない方が好ましく、定数よりむしろマジックナンバーのほうが良い。
SELECT
*
FROM person
WHERE 1=1
-- 5=KEIRI
AND section = '5'
-- 1=ENABLE
AND status = '1'
現在はこのように書いています。コメントが含まれるとエラーになるのでコードで SQL を実行する直前にコメントを取り除く処理を経由します。
コード値が変更されたら修正箇所が多くなりますが、こうした値はめったに変更されるものではありません(普通は...)。可読性は落ちますが検証やデータ確認時の利便性から、あえてマジックナンバーを使用しています。
コードの折り畳みができる
処理の流れを読みたいときに邪魔になるので、折りたたんで隠しておきたいことがしばしばあります。「1」の記法ではそれができます。Visual Studio 2015 で確認していますが、より新しいバージョンでは他の記法でも折りたたみが出来るようになっているかもしれません。いまのところは Visual Studio 2015 を中心に使用しているため、しばらくは「1」の記法を使用していくでしょう。