MVPand clean架构上的strings.xml

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

  • 一个带有演示者和视图界面的核心模块,......

  • 一个带有存储库,数据源的域模块,..

  • App模块具有核心实现(因此片段/活动) .

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

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

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

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

提前致谢

回答(2)

2 years ago

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

您的问题是如何检索实际的字符串,因为它们位于Clean Architecture方案的"outer layers"中,即在Context对象中 . 恕我直言你的 TextHelper 是正确的方法,因为它允许在编写单元测试时注入模拟:你对如何处理字符串感兴趣,而不是字符串实际看起来如何 . 我正在尝试一种非常类似的方法并将其称为 StringsRepository .

一个不确定点是存储库API应该如何:

  • getString(@StringRes int stringResId, Object... formatArgs) 这样简单包装 Context.getString() 的单一方法:实现起来非常简单,但会使演示者依赖于你的 R.string 类,而这需要 strings.xml 与你测试的代码在同一个模块中;

  • 每个字符串有一个带有可选参数的方法,每个方法都包含对相应字符串ID的引用 . 该解决方案允许最佳抽象,但可能变得很大(接口和实现......),并且许多域类可能依赖于它 . 小心轻放 .

  • 喜欢(2),但有几个类,每个应用程序的一个部分 . 每个类可以具有类似于(1)的基类,但具有 protected 可见性的该方法 .

您的案件的最佳选择是(2)或(3),但您的里程可能会有所不同 .

2 years ago

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

public class MVPApplication extends Application {
    private static Context context;

    public static Context getContext() {
        return context;
    }

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