有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在体系结构域层中没有Android依赖项

我一直在读关于Android架构以及与表示层、域层和模型层的分离herehere

在这两篇文章中都说域层完全独立于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) 个答案

  1. # 1 楼答案

    域层是业务逻辑。理想情况下,它不与任何东西耦合,因此您可以使用相同的代码并将其作为服务运行,或者使其成为Java Swing客户端应用程序或任何您想要的东西。这是Java和JVM语言的主要优点之一,它不与平台耦合(除非您使用特定于平台的东西)。如果您在域逻辑中使用Android的JavaSDK,那么您就是在将有价值的业务逻辑耦合到Android平台。正如您所指出的,Android的核心类(ActivityContextService,等等)永远不应该在这个层中使用。这些是表示层结构

    您可以避免将自己与平台耦合,但仍然可以通过创建封装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);
        }
    }
    

    然后,不直接引用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的行为耦合