strings.xml on MVPand clean architecture

问题描述 投票:0回答:2

我正在开发一个实现 MVP 和干净架构的 android 应用程序。我有以下场景:

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

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

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

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

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

提前致谢

android architecture mvp clean-architecture
2个回答
2
投票

如果您的视图嵌套了与字符串相关的

if
/
else
,那么它们可能应该进行单元测试。因此,该逻辑应该留在演示者或用例中,这样可以更快地进行测试。

你的问题是关于如何检索实际的字符串,因为它们位于 Clean Architecture 方案的“外层”,即在 Context 对象中。恕我直言,您的

TextHelper
是正确的方法,因为它允许在编写单元测试时注入模拟:您感兴趣的是字符串是如何 processed,而不是字符串实际上是如何 look。我正在尝试一种非常相似的方法并将其称为
StringsRepository
.

不确定的一点是存储库 API 应该是什么样子:

  1. getString(@StringRes int stringResId, Object... formatArgs)
    这样简单包装
    Context.getString()
    的单一方法:实现起来非常简单,但会使演示者依赖于您的
    R.string
    类,这反过来又要求
    strings.xml
    与您的代码位于同一模块中测试;
  2. 每个字符串一个方法,带有可选参数,每个参数都包含对适当字符串 ID 的引用。这个解决方案允许最好的抽象,但可能会变得很大(接口和实现......)并且许多领域类可能依赖于它。小心轻放。
  3. 像 (2),但有几个类,每个应用程序的一部分一个。每个类都可能有一个类似于 (1) 的基类,但该方法具有
    protected
    可见性。

您的情况的最佳选择是(2)或(3),但您的里程可能会有所不同。


-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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.