关于 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() ?
如果我只有一个部分在 Male
和 Female
配置文件中不同怎么办?
我是否为 Male
class 创建 renderPart1()
、renderPart2()
和 renderPart3Male()
并为 Female
class 创建 renderPart3Female()
?并在单个函数中调用它们 renderProfil()
?
值得吗?
感谢在这些问题上启发我 :)
我猜你的 User
是一个干净的架构实体。使这些实体远离 html 渲染等细节。将用户呈现给 html 是一个细节。因此,您应该创建一个 UserRenderer
并将其传递给一个 User
。例如
interface UserRenderer {
String render(User user);
}
然后您可以实现 HTMLUserRenderer
或 JSONUserRenderer
或任何您喜欢的渲染器。
要么 UserRenderer
可以做到 if/then/else
String render(User user){
if(user.sex == 'female') return renderFemaleProfil(user)
if(user.sex == 'male') return renderMaleProfil(user)
return renderUnknownSexProfilError()
}
或者您可以实施 UserRendererFactory
或 UserRendererRegistry
来 return 一个合适的渲染器。
这些渲染器属于干净架构的外圈。因此,遵守从外圈到内圈的依赖规则。但是你绕过了用例层。
也许引入用例和响应模型,让渲染器使用响应模型会更好
如果你现在走得更远一点,你会认识到演示者是一种更通用的渲染器。也许演示者使用渲染器。
我正在阅读 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() ?
如果我只有一个部分在 Male
和 Female
配置文件中不同怎么办?
我是否为 Male
class 创建 renderPart1()
、renderPart2()
和 renderPart3Male()
并为 Female
class 创建 renderPart3Female()
?并在单个函数中调用它们 renderProfil()
?
值得吗?
感谢在这些问题上启发我 :)
我猜你的 User
是一个干净的架构实体。使这些实体远离 html 渲染等细节。将用户呈现给 html 是一个细节。因此,您应该创建一个 UserRenderer
并将其传递给一个 User
。例如
interface UserRenderer {
String render(User user);
}
然后您可以实现 HTMLUserRenderer
或 JSONUserRenderer
或任何您喜欢的渲染器。
要么 UserRenderer
可以做到 if/then/else
String render(User user){
if(user.sex == 'female') return renderFemaleProfil(user)
if(user.sex == 'male') return renderMaleProfil(user)
return renderUnknownSexProfilError()
}
或者您可以实施 UserRendererFactory
或 UserRendererRegistry
来 return 一个合适的渲染器。
这些渲染器属于干净架构的外圈。因此,遵守从外圈到内圈的依赖规则。但是你绕过了用例层。
也许引入用例和响应模型,让渲染器使用响应模型会更好
如果你现在走得更远一点,你会认识到演示者是一种更通用的渲染器。也许演示者使用渲染器。