振る舞い(動作)の局所性 (LoB)

カーソン・グロス

「容易な保守のための主要な特徴は局所性です。局所性とは、ソースコードのごく一部を見るだけでそのソースコードを理解できるようにするソースコードの特性です。」– リチャード・ガブリエル

#LoB原則

振る舞い(動作)の局所性とは、以下の原則です。

コードの単位の振る舞いは、そのコードの単位だけを見ることで可能な限り明らかであるべきです。

#考察

LoB原則は、リチャード・ガブリエルの引用文を簡潔に規定したものです。可能な限り、そして他の懸念事項とのバランスを取りながら、開発者はコード要素の振る舞いを検査によって明らかになるように努めるべきです。

HTMLにおけるAJAXリクエストの2つの異なる実装を考えてみましょう。1つ目はhtmxを使用したもの

<button hx-get="/clicked">Click Me</button>

2つ目はjQueryを使用したもの

  $("#d1").on("click", function(){
    $.ajax({
         /* AJAX options... */
    });
  });
<button id="d1">Click Me</button>

前者では、button要素の振る舞いは検査によって明らかになり、LoB原則を満たしています。

後者では、button要素の振る舞いは複数のファイルに分散されています。コードベース全体を完全に理解しないと、ボタンが正確に何をするのかを知ることは困難です。この「遠隔作用」は保守上の問題の原因となり、開発者がコードベースを理解する上で障害となります。

htmxの例は、振る舞い(動作)の局所性の良さを示しており、一方jQueryの例は振る舞い(動作)の局所性が悪いことを示しています。

#振る舞いの表面化 vs. 実装のインライン化

振る舞い(動作)の局所性に対するよくある反論は、実装の詳細をコード単位内にインライン化することで、コード単位が抽象性が低くなり、脆くなるということです。しかし、ある振る舞いの実装をインライン化することと、ある振る舞いの呼び出し(または宣言)をインライン化することの間には区別することが重要です。

ほとんどのプログラミング言語における関数を考えてみましょう。関数の宣言と、呼び出しサイトでの使用の間には区別があります。優れた関数は実装の詳細を抽象化しますが、遠隔作用なしに、明らかな方法で呼び出されます。

要素の振る舞いの明瞭さを高めることは、ceteris paribus(他の条件が同じであれば)、良いことです。しかし、エンド開発者と特にフレームワーク開発者の両方にとって、LoBをできるだけ容易で概念的にクリーンなものにすることが求められます。

#他の開発原則との競合

LoBは、他のソフトウェア開発原則としばしば競合します。2つの重要なものは以下の通りです。

#結論

LoBは、コードベースをより人間的で保守しやすいものにするのに役立つ、主観的なソフトウェア設計原則です。これは他の設計原則とトレードオフする必要があり、コード単位が記述されるシステムの限界という観点から考慮する必要がありますが、可能な限りこの原則に従うことで、ソフトウェアの保守性、品質、持続可能性が向上します。

</>