java在体系结构域层中没有Android依赖项
我一直在读关于Android架构以及与表示层、域层和模型层的分离here和here
在这两篇文章中都说域层完全独立于Android框架:
"This layer is a pure java module without any 安卓 dependencies. All the external components use interfaces when connecting to the business objects."
然而,Android提供了很多实用程序(如TextUtils、Android.Log等)在我看来,这可以/应该在所有层中使用
测试(使用junit)这类类类需要模拟它们(也就是说,使用诸如robolectric之类的库)
我不明白这个模式吗?或者说“独立于Android框架”,他们指的是活动、上下文、服务等
# 1 楼答案
域层是业务逻辑。理想情况下,它不与任何东西耦合,因此您可以使用相同的代码并将其作为服务运行,或者使其成为Java Swing客户端应用程序或任何您想要的东西。这是Java和JVM语言的主要优点之一,它不与平台耦合(除非您使用特定于平台的东西)。如果您在域逻辑中使用Android的JavaSDK,那么您就是在将有价值的业务逻辑耦合到Android平台。正如您所指出的,Android的核心类(
Activity
、Context
、Service
,等等)永远不应该在这个层中使用。这些是表示层结构您可以避免将自己与平台耦合,但仍然可以通过创建封装Android实现的通用接口来利用Android的SDK实现。例如,如果您发现TextUtils提供了一个您认为有用的函数,您将创建一个接口(甚至可能具有相同的名称):
然后,不直接引用
android.text.TextUtils
,而是将引用传递给接口。在Android应用程序上,您可以定义TextUtilsAndroid
,并使用其实例配置域逻辑。如果您在任何时候决定将业务逻辑移动到Swing应用程序或web服务,您可以自由地这样做,并且您可以在vanilla Java SE JDK中实现TextUtils
(甚至include an Android jar,这取决于它与其他Android库的相互依赖程度)日志记录应该以同样的方式完成。不要将自己耦合到Android的日志框架,而是查看slf4j-api,它提供了平台独立的日志接口,并查看slf4j-android,它为slf4j接口提供了Android平台绑定
嘲笑不是坏事。您应该模拟正在测试的每个类的所有外部依赖项。例如,您可以模拟域层使用的
TextUtils
的任何实例,并使用模拟框架的预期来验证域类的行为,而无需将测试与`TextUtils的impl的行为耦合