【问题标题】:Question about If/else/switch in Clean Architecture关于 Clean Architecture 中的 If/else/switch 的问题
【发布时间】:2023-03-14 23:46:01
【问题描述】:

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

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

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

但是为了尊重 Clean Architecture Robert C Martin 建议做 DIP :

如果我清楚地理解: 我需要一个接口User。创建一个返回多态对象的结构实现基于用户性别的用户(class Male and class Female)作为用户

完成后,如何显示我的个人资料? 我在返回 html 字符串的两个类中都放了一个 renderProfil() 函数?而只是做 user.renderProfil() ?

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

值得吗?

感谢在这些方面启发我:)

【问题讨论】:

    标签: oop if-statement polymorphism rendering clean-architecture


    【解决方案1】:

    我猜你的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,它将返回一个适当的渲染器。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多