gpt4 book ai didi

c# - 谁负责缓存/内存功能结果?

转载 作者:太空狗 更新时间:2023-10-29 20:01:46 24 4
gpt4 key购买 nike

我正在开发允许用户通过实现一组接口(interface)来扩展系统的软件。

为了测试我们正在做的事情的可行性,我的公司“吃自己的狗粮”通过以与用户完全相同的方式在这些类中实现我们所有的业务逻辑.

我们有一些实用类/方法将所有内容联系在一起并使用可扩展类中定义的逻辑。


我想缓存用户定义函数的结果。我应该在哪里执行此操作?

  • 是类(class)本身吗?这似乎会导致大量代码重复。

  • 是实用程序/引擎使用这些类吗?如果是这样,不知情的用户可能会直接调用类函数而不会获得任何缓存优势。


示例代码

public interface ILetter { string[] GetAnimalsThatStartWithMe(); }

public class A : ILetter { public string[] GetAnimalsThatStartWithMe()
{
return new [] { "Aardvark", "Ant" };
}
}
public class B : ILetter { public string[] GetAnimalsThatStartWithMe()
{
return new [] { "Baboon", "Banshee" };
}
}
/* ...Left to user to define... */
public class Z : ILetter { public string[] GetAnimalsThatStartWithMe()
{
return new [] { "Zebra" };
}
}

public static class LetterUtility
{
public static string[] GetAnimalsThatStartWithLetter(char letter)
{
if(letter == 'A') return (new A()).GetAnimalsThatStartWithMe();
if(letter == 'B') return (new B()).GetAnimalsThatStartWithMe();
/* ... */
if(letter == 'Z') return (new Z()).GetAnimalsThatStartWithMe();
throw new ApplicationException("Letter " + letter + " not found");
}
}

LetterUtility 应该负责缓存吗? ILetter 的每个单独实例都应该吗?还有其他完全可以做的事情吗?

我试图让这个示例简短,所以这些示例函数不需要缓存。但是考虑一下我添加的这个类使得 (new C()).GetAnimalsThatStartWithMe() 每次运行都需要 10 秒:

public class C : ILetter
{
public string[] GetAnimalsThatStartWithMe()
{
Thread.Sleep(10000);
return new [] { "Cat", "Capybara", "Clam" };
}
}

我发现自己在使我们的软件尽可能快和维护更少的代码(在这个例子中:在 LetterUtility 中缓存结果)和一遍又一遍地做完全相同的工作(在这个例子中)之间挣扎: 每次使用 C 时等待 10 秒。

最佳答案

Which layer is best responsible for caching of the results of these user-definable functions?

答案很明显:能够正确实现所需缓存策略的层就是正确的层。

一个正确的缓存策略需要具备两个特点:

  • 它绝不能提供陈旧的数据;它必须知道被缓存的方法是否会产生不同的结果,并在调用者获得陈旧数据之前的某个时刻使缓存无效

  • 它必须代表用户有效地管理缓存资源。无限制增长的没有过期策略的缓存还有另一个名字:我们通常称它们为“内存泄漏”。

您系统中哪一层知道“缓存是否过时?”问题的答案。和“缓存太大了吗?” 那是应该实现缓存的层。

关于c# - 谁负责缓存/内存功能结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8328895/

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