关于 Clean Architecture 中 If/else/switch 的问题

Question about If/else/switch in Clean Architecture

我正在阅读 Uncle Bob 的博客,尤其是他关于 if-else-switch 的文章。 我想更深入地了解我是否理解他的意思。

假设我有一个带有 Users 的网络应用程序,我想根据用户的性别显示其个人资料。 有些人会简单地做 :

if(user.sex == 'female') return renderFemaleProfil(user)
if(user.sex == 'male') return renderMaleProfil(user)
return renderUnknownSexProfilError()

但为了尊重清洁架构,Robert C Martin 建议进行 DIP:

如果我清楚地理解: 我需要一个接口 User。创建一个 return 多态结构 object 根据用户的性别 (class Male and class Female) 作为用户

实现用户

完成后,如何显示我的个人资料? 我在 class 和 return 一个 html 字符串中都放了一个 renderProfil() 函数?然后就做 user.renderProfil() ?

如果我只有一个部分在 MaleFemale 配置文件中不同怎么办? 我是否为 Male class 创建 renderPart1()renderPart2()renderPart3Male() 并为 Female class 创建 renderPart3Female()?并在单个函数中调用它们 renderProfil() ?

值得吗?

感谢在这些问题上启发我 :)

我猜你的 User 是一个干净的架构实体。使这些实体远离 html 渲染等细节。将用户呈现给 html 是一个细节。因此,您应该创建一个 UserRenderer 并将其传递给一个 User。例如

interface UserRenderer {
    String render(User user);
}

然后您可以实现 HTMLUserRendererJSONUserRenderer 或任何您喜欢的渲染器。

要么 UserRenderer 可以做到 if/then/else

String render(User user){
  if(user.sex == 'female') return renderFemaleProfil(user)
  if(user.sex == 'male') return renderMaleProfil(user)
  return renderUnknownSexProfilError()
}

或者您可以实施 UserRendererFactoryUserRendererRegistry 来 return 一个合适的渲染器。

这些渲染器属于干净架构的外圈。因此,遵守从外圈到内圈的依赖规则。但是你绕过了用例层。

也许引入用例和响应模型,让渲染器使用响应模型会更好

如果你现在走得更远一点,你会认识到演示者是一种更通用的渲染器。也许演示者使用渲染器。