在 Clean Architecture 中,UI 代码在哪一层?

In Clean Architecture, in which layer does UI code go?

我正在阅读 Bob Martin (https://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html) 的 Clean Architecture,我发现这对我来说似乎是矛盾的。

架构的视觉表示 "UI" 列在最外层 - 这意味着它是 "Frameworks & Drivers" 的一部分,它是外部的。

然而,当他详细阐述从那个层开始的第一步 - 称为接口适配器 - 他说 "It is [the Interface Adapters] layer...that will wholly contain the MVC architecture of a GUI. The Presenters, Views, and Controllers all belong in here." 说接口适配器层包含视图让我觉得 UI 属于那里。

那么哪一层是存放 UI 特定代码的?

我觉得和区分一层间接层一样不矛盾。 Interface Adapters用于将内部表示转换为外部表示,但外部表示需要与Framework和Drivers层进行交互。因此,虽然与 MVC 框架交互的应用程序代码位于接口适配器层,但它调用的 API 和呈现发生在框架和驱动程序层。

因此,建议不要将这些问题混为一谈,这样可以更轻松地独立于框架进行测试和发展。

混淆的发生是因为 UI 有两个方面:

一个是 UI 的具体 "physical" 方面,它特定于某种 OS 或交付机制(例如 Web)。 UI 的这一部分与如何向用户显示事物以及如何捕获用户操作有关。

UI 的另一部分涉及向用户显示什么以及要收听什么用户操作。

Bob 大叔有效地区分了 HOW 和 WHAT。

UI 的 WHAT 方面属于 "Interface Adapters" 层。您在那里生成的视图决定了您向用户显示的信息。

HOW 方面属于 "Frameworks & Drivers" 层。目标是如果你想为你的用户提供两种用户体验 - 一个网络应用程序和一个移动应用程序 - 你只需要编写两个版本的外层,但内层不需要改变,或者只需要需要稍微改变一下。