💭

「ハードインデント」という考え方

2022/08/16に公開

エッセイ記事です。あまり厳密な議論ではなく感覚の話をします。

インデントの硬さ

筆者は過去にこんなツイートをしたことがあります。
https://twitter.com/exograph/status/1499691642726486016?s=20&t=mR2VwLTuLsAYmJTA40b5sA

この「ハードインデント」というのは筆者の造語です。一般的には「ソフトタブ」と呼ばれているもの、つまりスペース(U+0020)を使ったインデントを個人的にハードインデントと呼んでいて、というのも、

  1. 目的の転倒——開発者がやりたいのはインデントであって、タブ文字の挿入それ自体は本質ではない(はずだよね)
  2. アスキーアート化——インデントが本質だとすると、深さ1段階のインデントの表示幅をスペースの個数にエンコードしてファイルに直接〝焼き込む〟方がどちらかというと「ハード」な感じがする

からなんですよね。インデンテーションスタイルの文脈で「ソフト」って聞くといつも逆じゃないかと思ってます。まあみんなが言ってるそれは「ソフトタブ」なので、タブが主体だとするならタブ文字を直接ファイルに焼き込む方がハードっていうのはわかるんですけど。いやいや、タブ挿入じゃなくてインデントがしたいんですよね、っていう。

そんなわけで、インデントの硬さとタブ文字の硬さが逆転してて面白いと思いました。筆者はソフトインデントがいいです。

環境依存かユーザーの自由か

ソフトインデント(ハードタブ)のデメリットとしてしばしば「環境依存」という点が挙げられますね。ハードインデント(ソフトタブ)を強制するYAMLは、“Why does YAML forbid tabs?”という質問に対して、

Tabs have been outlawed since they are treated differently by different editors and tools.

答えています。エディターやツールによって取り扱いが異なることを“outlawed”(法外)と評しています。これは大変な間違いです。本当に言うべきことは、エディターやツールが誤った取り扱いをすることがいけないのだ、ということです。例えば、1つのファイルにソフトインデントとハードインデントが混在してしまっている[1]ときに、タブ文字はスペースいくつ分に相当するものとして処理を続ける、などと早まった仮定(仕様になく、かつユーザーの合意のないエラーリカバリー)をエディターやツール側が勝手に採用するのは、誤った取り扱いです。そういった勘違いが起こる余地を無くすためにそもそも仕様で禁止しておくというのは、もちろん完全に理にかなっています[2]

しかし、インデントの表示幅(≠深さ)のような、データの本質的な構造とはほとんど関係のない部分が、ユーザーの好みに応じて異なった取り扱いにできるのであれば、それはむしろ良いことです。逆に言うと、ハードインデントによって、1人の開発者が自分好みの表示幅をソースコードに焼き込み、他の開発者がその幅以外でソースコードを閲覧することを禁止するのは、良くないことです。仮に開発者が「ソースコードはアスキーアートだ」みたいな考え方を持っているなら別ですけど、多くの開発者はそうではないと思いますし、むしろ「ロジックとビューの分離」みたいな、本質とその表示方法を分離する考え方に慣れ親しんでいるはず。

もし、ソフトウェアの誤った挙動だけではなく、こういったユーザーの自由への理念までもが「環境依存」といった否定的な表現で片付けられてしまっているのだとすれば、それはとても悲しいことです。これは余談ですが、Gitリポジトリにコミットされるのは抽象構文木などの人間可読でない中間表現だけにして、表示や編集するときにはユーザーの好みに応じて適切な形式のソースコードとして表示するようなシステムができていれば一番良いと思っているんですが、そういうのってありません? ないか。実装コストに見合わないもんな。

まあ要約すると、データ(ここではソースコード)にはもっとも本質的なものだけを持たせておくべきで、筆者にとってインデントの視覚的な幅はそこにはギリ入らない、というか。それだけなんですけど。


かしこ

脚注
  1. これは確かにまずい状況です。筆者も1つのファイル内でこれらを使い分けたりするべきではないと思います。 ↩︎

  2. ただ筆者に言わせれば、誤った取り扱い方をしてしまうソフトウェアの落ち度を、データ側にまで落とし込むようなダーティーハックをやめろ、ソフトウェアを治せ、と思うことがあります。もちろんこれは理想論であり、何らかの理由でソフトウェアの実装には手をつけられないケースもままある、というのは理解していますが。 ↩︎

Discussion