なぜ我々はいまだに文字列でコメントを書いているのか

あるいは、画像コメントのすすめ。

# TL;DR

* 画像コメントのほうが意図が伝わりやすい
* 画像URLからツールチップで画像表示してくれるVSCode拡張機能があるよ
* その場で画像を作るSVGエディタもあったよ

# 問題提起

みなさんは、少し複雑なアルゴリズムを書くことになったときどうしていますか。
たいていの場合、いきなりコーティングに取り掛かるのでなく、
雰囲気をつかむためメモやホワイトボードに落書きすると思います。
特に幾何計算では簡単なものでも図を描いた方がいいです。こんな感じ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/60243/46606a67-92aa-b08a-fc4b-c24e0bb2aa14.jpeg" width="300">

図を書いたら後はコードに落とすだけです。
ね、簡単でしょう？

```ts:コード(適当)
// 指定した直線を対称軸としたときの指定した点の鏡映位置を返す
function flipVectorByLine(p: Vector, line: Line): Vector {
  // TODO: よくわかるコメントを書く
  const ln = new Vector(line.vector.y, -line.vector.x);
  const s = p.subtract(line.src);
  const k2 = ln.multiply(2 * s.dot(ln) / ln.dot(ln));
  return p.subtract(k2);
}
```

ただ、ここで困るのがコメントです。
文字でしか書けないので、どうやっても数学の不親切な文章題のようになります。

書くのがめちゃめちゃ面倒くさいうえに、読み解くのがまた難しい。
作成者は手元の図をどうにかこうにか文章として書き下して、
解読者はコメントを読み解きながら手元に図を描いて解釈しようとするわけです。
なんでこんな伝言ゲームをやらなくちゃいけないのか。

![flow.png](https://qiita-image-store.s3.amazonaws.com/0/60243/ff271725-18f1-71fa-0732-6344a760fc08.png)

それもこれも、コメントの表現力が乏しく、
あらゆる情報を文章表現に変換しなければならないからです。
そもそも、今さら文字列にこだわる必要は本当にあるのでしょうか。
画像を使ったほうが、より意図が伝わりやすくなるのではないでしょうか。

# 解決策

というわけで、コメントに画像(のURL)を埋め込んじゃえというのがこの記事の主旨です。
VSCodeの拡張機能でツールを作ろうと思ってたんですが、既に良いのがありました。

VSCodeには[Image preview](https://marketplace.visualstudio.com/items?itemName=kisstkondoros.vscode-gutter-preview)という拡張機能があり、
画像のURLがあると行番号横やツールチップに画像を表示します。
プロジェクトルートからパス解決してくれるのでとても便利。
パスの基準となるフォルダを追加することもできます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/60243/10083480-9c7c-3087-17ee-5bd15fa3681e.gif" width="400">

[SVG Editor](https://marketplace.visualstudio.com/items?itemName=henoc.svgeditor)という拡張機能もあり、
簡易ドローツールとしてその場で画像を生成できます。
SVGなのでファイルサイズも抑えられますね。
<img src="https://qiita-image-store.s3.amazonaws.com/0/60243/8c1f8fe5-89ce-8466-c7df-9a7b3508da3a.gif" width="500">

これらのツールを使ってコメント内に画像を埋め込めんでしまえば、
わざわざ文字列を経由しなくても一発で意図が伝わります。やったね！

# 利用例

複雑な条件分岐も画像なら一発でわかります。
あまりに複雑な分岐はそもそも設計を見直したほうが良いのでしょうが...
<img src="https://qiita-image-store.s3.amazonaws.com/0/60243/a1654350-ce1f-63f7-71af-3ff35bffd2bd.png" width="400">

他にもスナップショットテストのスクショを埋め込んだり、スタイル設定を可視化したり。
<img src="https://qiita-image-store.s3.amazonaws.com/0/60243/969b952a-64a8-8c0a-afb3-0c697596214a.gif" width="400">

いろいろ遊んでみてはいかがでしょうか。
<img src="https://qiita-image-store.s3.amazonaws.com/0/60243/209dd657-310f-3249-a6f7-b7f023b9e263.gif" width="400">

# 注意点

* 画像をリポジトリに含めるとリポジトリが肥大化します。しょうがないね。
* ソースコードを変更するときは画像も更新が必要です。当然だけどひと手間増えて面倒かも。

**[ここから追記 9/26更新]**
以前こんなこと考えていたのを思い出しました。(開発放置中)

* [ローカル画像生成サーバ作ってMarkdown記事執筆を加速する](https://qiita.com/tkrkt/items/f65a4be0cd57235217c9)

画像を生成するのはやっぱり面倒なので、
こんな風にクエリから画像を生成して返すウェブサービスや社内サービスがあったら便利そうですね。
ただそのサービスが終了すると見られなくなりますが。

# 他のエディタ向けプラグイン

紹介したVSCode向けの[Image preview](https://marketplace.visualstudio.com/items?itemName=kisstkondoros.vscode-gutter-preview)のように、
他のエディタにも画像を表示するプラグインが用意されています。

## Sublime Text 3

@masamoさんから編集リクエストいただきました。紹介記事もあります。

* [Hover Image Preview - Packages - Package Control](https://packagecontrol.io/packages/Hover%20Image%20Preview)
* [コード上で画像プレビューしてくれる Sublime Text 3 用パッケージ Hover Image Preview // understandard](https://www.understandard.net/tool/tool026.html)

## Visual Studio

@cactuaroidさんからコメントでお知らせいただきました。
好みは分かれそうですが、インライン展開はソースコードとの密着度が高くて良いですね。

* [ImageComments - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=MsBishop.ImageComments)

## Emacs

@chuntaroさんが作成してくださいました。GIF サポートが有効な GUI 版 Emacs が必要です。

* [Emacs でフレームのポップアップ - Qiita](https://qiita.com/chuntaro/items/be3451c1dd27e8e61cd3)