MVPand clean架构上的strings.xml

时间:2016-12-16 07:31:47

标签: android architecture mvp

我正在开发一个实现MVP和清洁架构的Android应用程序。我有以下情况:

  • 一个带有演示者和视图界面的核心模块......
  • 一个包含存储库,数据源的域模块,..
  • 具有核心实现的App模块(因此片段/活动)。

目前strings.xml文件位于app模块中,但我想是否应该在commons模块中。问题是,有时,演示者必须将文本设置为视图,因此演示者应该需要访问strings.xml。我考虑过两种可能的解决方案:

1)在核心模块上创建一个TextHelper接口,该接口将在app模块上实现并注入到演示者,因此演示者将使用此帮助程序获取所需的字符串。 (这是我实施的解决方案。)

2)将strings.xml文件移动到公共模块,以便可以从核心模块访问该文件。但是这个解决方案会有一个问题:演示者没有上下文。

你怎么看?什么是最好的方法?

提前致谢

2 个答案:

答案 0 :(得分:1)

如果您的视图嵌套了与字符串相关的if / else,那么它们应该进行单元测试。因此,该逻辑应保留在演示者或用例中,以便更快地进行测试。

你的问题是如何检索实际的字符串,因为它们位于"外层"清洁体系结构方案,即在Context对象中。恕我直言你的TextHelper是正确的方法,因为它允许在编写单元测试时注入模拟:你对字符串处理的方式感兴趣,而不是字符串实际上如何。我正在尝试一种非常类似的方法并将其称为StringsRepository

存储器API的外观应该是这样的:

  1. getString(@StringRes int stringResId, Object... formatArgs)一样简单地包装Context.getString()的单一方法:实现起来非常简单,但会让演示者依赖于您的R.string类,而后者又需要strings.xml与您正在测试的代码位于同一模块中;
  2. 每个字符串有一个带可选参数的方法,每个方法都包含对相应字符串ID的引用。此解决方案允许最佳抽象,但可能变得很大(接口和实现......),并且许多域类可能依赖于它。小心轻放。
  3. 与(2)类似,但有几个类,每个应用程序的一个部分。每个类可能有一个类似于(1)的基类,但使用protected可见性的方法。
  4. 您案件的最佳选择是(2)或(3),但您的里程可能会有所不同。

答案 1 :(得分:-2)

您可以使用Application类从应用中获取任何位置的上下文。

public class MVPApplication extends Application {
    private static Context context;

    public static Context getContext() {
        return context;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }
}