我一直在阅读有关Android架构以及在此处和此处与Presentation,Domain和Model层分离的内容.
在这两篇文章中,它表示Domain层完全独立于Android框架:
"这个层是一个没有任何android依赖关系的纯java模块.所有外部组件在连接到业务对象时都使用接口."
但是,Android提供了许多实用程序(例如TextUtils,android.Log等...),可以/应该在所有层中使用(在我看来).
测试(使用junit)这类类需要模拟它们(意思是,使用诸如robolectric的lib).
我不理解这种模式吗?或者"独立于Android框架",他们的意思是活动,上下文,服务,BroadcastReceivers等?
域层是业务逻辑.理想情况下,它不会耦合到任何东西,因此您可以使用相同的代码并将其作为服务运行,或者将其设置为Java Swing客户端应用程序或任何您想要的任何内容.这是Java和JVM语言的主要优点之一 - 它不会耦合到平台(除非您使用平台特定的东西).如果您在域逻辑中使用Android的Java SDK,那么您将有价值的业务逻辑耦合到Android平台.就像你识别,机器人的核心类(Activity,Context,Service等)不应该在这一层中.那些是表示层结构.
您可以避免将自己耦合到您的平台,但仍然可以通过创建包含Android实现的通用接口来利用Android的SDK实现.例如,如果您发现TextUtils提供的功能您认为有用,那么您将创建一个接口(甚至可能具有相同的名称):
public interface TextUtils {
CharSequence concat(CharSequence...seqs);
}
public class TextUtilsAndroid implements TextUtils {
public CharSequence concat(CharSequence...seqs) {
return android.text.TextUtils.concat(seqs);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,不是android.text.TextUtils直接引用,而是将引用传递给您的接口.在Android应用中,您可以TextUtilsAndroid使用它的实例来定义和配置域逻辑.如果您决定在任何时候将业务逻辑移动到Swing应用程序或Web服务,您可以自由地执行此操作,并且可以TextUtils在vanilla Java SE JDK中实现(或者甚至包括Android jar,具体取决于它是如何相互依赖的其他Android库).
记录应该以相同的方式完成.不要将自己与Android的日志框架结合起来,请查看slf4j-api,它提供了一个独立于平台的日志记录界面,并查看slf4j-android,它为slf4j接口提供了一个Android平台绑定.
嘲弄并不是件坏事.您应该模拟您正在测试的每个类的所有外部依赖项.例如,您将模拟TextUtils您的域层使用的任何实例,并使用模拟框架的期望来验证域类的行为,而不将测试与`TextUtils的impl的行为耦合.