行为局部性 (LoB)

Carson Gross

“易于维护的主要特征是局部性:局部性是源代码的一种特性,它使程序员仅通过查看一小部分就能理解该源代码。” – Richard Gabriel

LoB 原则

行为局部性是指:

代码单元的行为应尽可能通过仅查看该代码单元本身就能显而易见

讨论

LoB 原则是 Richard Gabriel 上述引述的一种简洁规范性表述。在尽可能且兼顾其他关注点的情况下,开发人员应努力使代码元素的行为在检查时显而易见。

考虑 HTML 中 AJAX 请求的两种不同实现,第一种在 htmx 中:

<button hx-get="/clicked">点击我</button>

第二种在 jQuery 中:

  $("#d1").on("click", function(){
    $.ajax({
         /* AJAX 选项... */
    });
  });
<button id="d1">点击我</button>

在前者中,button 元素的行为在检查时显而易见,符合 LoB 原则。

在后者中,button 元素的行为分散在多个文件中。没有对整个代码库的完全了解,很难确切知道按钮的作用。这种"远距离的诡异行为"是维护问题的根源,并阻碍开发人员理解代码库。

htmx 示例展示了良好的行为局部性,而 jQuery 示例的行为局部性较差。

展现行为 vs. 内联实现

对行为局部性的常见反对意见是,它是在代码单元内内联实现细节,使代码单元抽象程度降低且更脆弱。然而,区分内联行为的实现和内联行为的调用(或声明)非常重要。

考虑大多数编程语言中的函数:函数声明与其在调用点的使用是有区别的。一个好的函数抽象了其实现细节,但也以明显的方式调用,没有任何远距离的诡异行为。

增加元素行为的明显性在其他条件不变的情况下是好事,但这需要最终开发人员(尤其是框架开发人员)使 LoB 尽可能简单且概念清晰。

与其他开发原则的冲突

LoB 常与其他软件开发原则冲突。两个重要的原则是:

结论

LoB 是一种主观的软件设计原则,它有助于使代码库更人性化且更易于维护。它必须与其他设计原则权衡,并考虑代码单元所在系统的限制,但在可行范围内,遵循这一原则将提高软件的维护性、质量和可持续性。

</>