gpt4 book ai didi

java - 如何避免耦合现在具有相似实现但将来可能会改变的两种方法?

转载 作者:行者123 更新时间:2023-12-04 06:45:24 24 4
gpt4 key购买 nike

我在一个类中有两个方法,它们目前共享一个非常相似的实现,但在性能方面的实现非常昂贵。

样本:

class Example
{
public void process(Object obj)
{
boolean someFact = getFirstFact(obj);
boolean someOtherFact = getSecondFact(obj);

//use the two facts somehow
}

public boolean getFirstFact(Object obj)
{
boolean data = someExpensiveMethod(obj);
//return some value derived from data
}

public boolean getSecondFact(Object obj)
{
boolean data = someExpensiveMethod(obj);
//return some other value derived from data
}

public boolean someExpensiveMethod(Object obj){...}
}

我曾想过以某种方式缓存 someExpensiveMethod 的结果,但这似乎很浪费,因为对象往往会进入、处理然后丢弃。它似乎也很笨拙 - 方法需要了解缓存,或者我需要在 ssomeExpensiveMethod 中缓存结果。

即使是短期缓存也可能是个坏消息,因为实际上每天都会处理数百万个对象。

我的担忧是双重的 - 首先,不能保证这两种方法总是依赖于第三种,所以任何解决方案都应该从他们的 POV 透明,其次,显而易见的解决方案(在 someExpensiveMethod 中缓存),可能非常昂贵不需要长期保留的结果的空间。

最佳答案

I've thought about somehow caching the result of someExpensiveMethod, but that seems wasteful, given that objects tend to come in, be processed and then discarded.



我不明白这有多浪费。这基本上就是缓存的工作方式。您将进入的对象与您最近处理的对象进行比较,当您遇到“命中”时,您可以避免调用 someExpensiveMethod 的费用。 .

缓存是否真的适用于您的应用程序将取决于许多因素,例如:
  • 您可以保留在缓存中的对象/结果对的数量,
  • “命中”的概率,
  • 执行缓存探测的平均成本(在“命中”和“未命中”情况下),
  • 平均通话费用someExpensiveMethod
  • 维护缓存的直接成本;例如如果您使用 LRU 或其他一些策略来摆脱无用的缓存条目,以及
  • 维护缓存的间接成本。

  • (最后一点很难预测/衡量,但它包括表示缓存结构所需的额外内存、GC 必须做的工作来处理缓存及其内容“可达”这一事实,以及 GC与弱引用相关的开销......假设您使用它们。)

    最终,缓存解决方案的成功(或其他)是根据系统的 来判断的。平均 的行为现实工作量。某些缓存结果不再使用的事实并不真正相关。

    It also seems clunky - methods need to know about a cache, or I need to cache results in someExpensiveMethod.



    同样,IMO 无论如何都不会“笨重”。这是您实现缓存的方式。

    Even short term cache could be bad news, since literally millions of objects get processed every day.



    再说一次,我看不出你论点的逻辑。如果每天处理数百万个对象,而您保留(例如)最后 5 分钟的值(value),那么只需缓存数万个对象。这几乎不是“坏消息”。

    如果您真的每天处理“数百万”个对象,那么:
  • someExpensiveMethod不可能那么贵...除非你有一个高效的缓存和大量的内存,或者大量的处理器,或者两者都有,
  • 您对优雅(不笨重)和避免耦合的担忧 必须次要的问题是设计应用程序以使其能够跟上,以及
  • 您可能需要在多处理器上运行,因此您需要处理缓存可能成为并发瓶颈的事实。
  • 关于java - 如何避免耦合现在具有相似实现但将来可能会改变的两种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3802482/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com