如何使用共享信息解耦代码

时间:2016-02-05 20:48:38

标签: java decoupling

希望我不要问重复。我尝试过搜索但没有找到任何内容,但这可能是我的关键字选择(我无法想到要使用的关键字)。

通常,在编码时,遇到以下情况:

public void doStuff() {
    String sharedValue = getValue();

    // code block 1 that uses sharedValue

    // code block 2 that uses sharedValue
}

private String getValue() {
    // code to get sharedValue
}

例如,这可能是哈希表类,getValue()对应于哈希函数。

理想情况下,code block 1code block 2模块化为两个单独的方法,如下所示:

public void useValue1() {
    String sharedValue = getValue();

    // code block that uses sharedValue
}

public void useValue2() {
    String sharedValue = getValue();

    // code block that uses sharedValue
}

现在问题是,如果我们调用useValue1()然后调用useValue2(),则getValue()会运行两次。 使用Java HashMap作为示例

public class Clazz {
    Map<String, List<String>> map = new HashMap<String, List<String>>();

    public void ensureListExists(String key) {
        if (!map.containsKey(key))
            map.put(key, new ArrayList<String>());
    }
}

HashMap.containsKey()HashMap.put()计算两次相同的哈希密钥。在这种情况下,计算散列键对于操作来说并不算太昂贵,但是想象一些更昂贵的东西也不会太难。

目标:我想要分离两个共享某些信息但在语义上不同的代码块(不重新计算信息)。

以下是我想到的一些解决方案以及为什么我不喜欢它们:

&GT;使用缓存:在某些情况下,这可能是我选择的解决方案,可能是对于长期存在的对象(例如,保留所有数据库查询的缓存及其结果)。在较小的范围内,我不喜欢创建一个实例变量的想法,仅用作一对方法的缓存,并且只能使用一次或两次。另外,缓存还有自己的开销。

&GT;将String sharedValue提取到useValue1(String)useValue2(String)的参数中,然后从调用方法中调用getValue(),如下所示:

public void useValue1(String sharedValue) {
    // code block that uses sharedValue
}

public void useValue2(String sharedValue) {
    // code block that uses sharedValue
}

String sharedValue = getValue();
useValue1(sharedValue);
useValue2(sharedValue);
  1. 这会强制getValue()public并强制调用方法手动处理sharedValue。它应该是自动的并且作为实现细节隐藏 - 并非所有Maps都实现为哈希表。
  2. 如果sharedValue是多个变量,则不起作用。每个人都知道多个返回值很糟糕(至少在Java中)。我们可以创建另一个封装所有变量的类,但这比使用实例变量更加混乱。
  3. 有谁能想到这个问题的优雅解决方案?我总是能看到它。也许没有其他解决方案,我只是太挑剔了。我愿意接受这个作为答案。

    注意:我认为这可能看起来像预优化,但我认为我认为这足以保证在任何时候都有一个很好的解决方案。

0 个答案:

没有答案