Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 架构域层中没有Android依赖项_Java_Android - Fatal编程技术网

Java 架构域层中没有Android依赖项

Java 架构域层中没有Android依赖项,java,android,Java,Android,我一直在阅读关于Android体系结构以及与表示层、域层和模型层的分离 在这两篇文章中都说域层完全独立于Android框架: “该层是一个纯java模块,没有任何android依赖项。所有外部组件在连接到业务对象时都使用接口。” 然而,Android提供了很多实用程序(如TextUtils、Android.Log等),可以/应该在所有层中使用(在我看来) 测试(使用junit)这类类类需要模拟它们(也就是说,使用诸如robolectric之类的库) 我不明白这个模式吗?或者说“独立于Androi

我一直在阅读关于Android体系结构以及与表示层、域层和模型层的分离

在这两篇文章中都说域层完全独立于Android框架:

“该层是一个纯java模块,没有任何android依赖项。所有外部组件在连接到业务对象时都使用接口。”

然而,Android提供了很多实用程序(如TextUtils、Android.Log等),可以/应该在所有层中使用(在我看来)

测试(使用junit)这类类类需要模拟它们(也就是说,使用诸如robolectric之类的库)


我不明白这个模式吗?或者说“独立于Android框架”,他们指的是活动、上下文、服务、广播接收器等内容。

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

您可以避免将自己与平台耦合,但仍然可以通过创建封装Android实现的通用接口来利用Android的SDK实现。例如,如果您发现TextUtils提供了一个您认为有用的函数,您将创建一个接口(甚至可能具有相同的名称):

然后,不再直接引用android.text.TextUtils,而是将引用传递给界面。在Android应用程序上,定义
TextUtilsAndroid
,并使用其实例配置域逻辑。如果您在任何时候决定将业务逻辑移动到Swing应用程序或web服务,您都可以这样做,并且您可以在vanilla Java SE JDK中实现
TextUtils
(甚至取决于它与其他Android库的相互依赖程度)

日志记录应该以同样的方式完成。与其将自己耦合到Android的日志框架,不如看看哪个提供了独立于平台的日志接口,看看哪个为slf4j接口提供了Android平台绑定


嘲笑不是坏事。您应该模拟正在测试的每个类的所有外部依赖项。例如,您可以模拟域层使用的
TextUtils
的任何实例,并使用模拟框架的预期来验证域类的行为,而无需将测试与`TextUtils的impl行为耦合。

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

您可以避免将自己与平台耦合,但仍然可以通过创建封装Android实现的通用接口来利用Android的SDK实现。例如,如果您发现TextUtils提供了一个您认为有用的函数,您将创建一个接口(甚至可能具有相同的名称):

然后,不再直接引用android.text.TextUtils,而是将引用传递给界面。在Android应用程序上,定义
TextUtilsAndroid
,并使用其实例配置域逻辑。如果您在任何时候决定将业务逻辑移动到Swing应用程序或web服务,您都可以这样做,并且您可以在vanilla Java SE JDK中实现
TextUtils
(甚至取决于它与其他Android库的相互依赖程度)

日志记录应该以同样的方式完成。与其将自己耦合到Android的日志框架,不如看看哪个提供了独立于平台的日志接口,看看哪个为slf4j接口提供了Android平台绑定


嘲笑不是坏事。您应该模拟正在测试的每个类的所有外部依赖项。例如,您可以模拟域层使用的
TextUtils
的任何实例,并使用模拟框架的预期来验证域类的行为,而无需将测试与“TextUtils”impl的行为耦合。

非常感谢您提供的详细答案!关于您的TextUtils示例,您说过我应该使用新的TextUtilsAndroid类的实例。2个问题:1。我应该在哪一层定义TextUtilsAndroid?2.许多此类实用程序类使用静态方法/常量。有没有办法避免将引用传递给实例,而改用静态方法/常量?@dors 1。这是个好问题。TextUtils是一个可以在多个层中使用的实用程序。如果您在域逻辑中使用它,那么应该将其视为域逻辑类,但要将其隔离,以便在没有Android SDK的情况下编译其余代码。2.我的一般观点是静态是有害的,因为你最终会将自己与某个特定的实现耦合在一起。例如,如果您在TextUtilsAndroid中发现了一个bug,或者如果您发现了一个更高效的实现,那么使用一个接口可以让您交换impl
public interface TextUtils {
    CharSequence concat(CharSequence...seqs);
}

public class TextUtilsAndroid implements TextUtils {
    public CharSequence concat(CharSequence...seqs) {
        return android.text.TextUtils.concat(seqs);
    }
}