deltaでgit diffをパワーアップする

deltaというrustで書かれた差分表示ツールがある。これをgitと連携するとgit diffの表示がパワーアップする。

f:id:paulownia:20210219005649p:plain

difftoolで外部ツールと連携すれば同じような結果は得られる。しかし外部ツールが起動するので気軽にdiffを見るには少々重く、外部ツールがvimdiffの場合一度に1ファイルのdiffしか表示できないので地味に使いにくい。deltaならばgit diffと全く同様の使い勝手で軽いというのが推しポイント。

設定方法

deltaはmacならbrewでインストールできる。

brew install git-delta

インストールしただけではgitの出力は変わらないので、~/.gitconfig に以下の記述を追加する

[core]
    pager = delta

[interactive]
    diffFilter = delta --color-only

[delta]
    features = side-by-side line-numbers decorations
    whitespace-error-style = 22 reverse

[delta "decorations"]
    commit-decoration-style = bold yellow box ul
    file-style = bold yellow ul
    file-decoration-style = none

この設定を加えるとgit logが先程の画像のようにサイドバイサイドの差分表示となる。pager丸ごと置き換えているのでdiff以外のサブコマンドにも影響する。git logの表示も少しパワーアップする。

オブジェクト指向の話

どうでもいい話だが、私はジョブズ復帰以前からのApple信者なので、オブジェクト指向が絶対正義などと言われると現在のmacOSの源流であるNeXTSTEPの話を思い出す。NeXTSTEPにはオブジェクト指向で設計された当時としてはかなり先進的なライブラリが用意されていたそうで、ジョブズApple復帰が決まった当時のMacユーザの間でそれは非常に素晴らしいものだと話題になっていたのだ。ただ、これはC++のクラスベースのオブジェクト指向に対して、Objective-Cのメッセージパッシングによるオブジェクト指向の優位性を主張するものだ。その根底にあるのは言うまでもなくWindowsに対するMacの優位性のアピールといういつものやつであって、オブジェクト指向が正義だとかそういう話ではない。ちなみにiOSアプリなどを作っているときに出てくるNSなんちゃらというクラスはNeXTSTEPの名残り。

私はプログラマとしてのキャリアの最初の数年をSIの世界で過ごしたのだが、オブジェクト指向プログラミングやデザインパターンは絶対という空気を感じたことはなかった。まあ、その会社は技術レベルの低い中規模SIerであり、当時普及が始まりつつあったStrutsが使えるかどうかという議論が彼らの手にようやく届く範囲の技術的話題だったということも影響しているだろう。もっと上流を見渡せばオブジェクト指向分析といった言葉でオブジェクト指向銀の弾丸であるかのように語られていたような記憶はあるが、私は上流に手が届くようになった頃にはSIの世界を離れてWeb系の世界に来てしまったのでよく知らない。

WebアプリそれもJava限定の話になってしまうが、なぜオブジェクト指向が重要でなくなったのかといえば、Webアプリは1回のリクエスト・レスポンスで処理が完結し、DBから取得したデータをHTMLやXMLJSONに変換して返したり、入力値をバリデーションしてDBに格納したりするのが主な仕事だからである。そこではオブジェクト指向プログラミングが解決する複雑な状態遷移とそれに伴う処理の変化を扱う必要はない。状態を持たず関数をまとめただけのサービス等のクラスと、振る舞いを持たずデータを格納するだけのDTOクラスがあれば大抵事足りてしまったのだ。このような階層型モジュールと抽象データ型によるプログラミングはオブジェクト指向というよりも手続き型プログラミングに近い。それでもインスタンスメソッドとして手続きを書くのは、フレームワークやDIコンテナ等との相性を考えるとそれが一番楽だからである。

とはいえデータと手続きの一体化というオブジェクト指向の基本的なコンセプトは非オブジェクト指向言語であるRustやGoにも引き継がれている。まあ、オブジェクト指向はもはや当たり前のものとしてプログラマに受け入れられているので、ことさら重要性を強調するようなものではなくなったのだろう。